亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Linux 64位BAR編程

Linux 64位BAR編程

海綿寶寶撒 2021-04-05 16:13:22
PCI橋支持32/64首選項/無首選項:pci_bus 0000:00: root bus resource [bus 00-ff]pci_bus 0000:00: root bus resource [io  0x0000-0xffff] pci_bus 0000:00: root bus resource [mem 0x1000000000-0x10ffffffff] (bus address [0x00000000-0xffffffff])pci_bus 0000:00: root bus resource [mem 0x1100000000-0x11ffffffff pref] (bus address [0x00000000-0xffffffff])pci_bus 0000:00: root bus resource [mem 0x2000000000-0x2fffffffff] (bus address [0x00000000-0xfffffffff])pci_bus 0000:00: root bus resource [mem 0x3000000000-0x3fffffffff pref] (bus  address [0x00000000-0xfffffffff])掃描具有2條BAR的端點:pci 0000:01:00.0: BAR 2: assigned [mem 0x2100000000-0x211fffffff 64bit pref]pci 0000:01:00.0: BAR 0: assigned [mem 0x1000000000-0x100007ffff]橋顯示了窗口:pci 0000:00:00.0: PCI bridge to [bus 01]pci 0000:00:00.0:   bridge window [mem 0x1000000000-0x10000fffff]pci 0000:00:00.0:   bridge window [mem 0x2100000000-0x211fffffff 64bit pref]端點總結了BAR:endpoint: BAR 0 addr = 0x1000000000, size = 524287endpoint: BAR 1 addr = 0x2100000000, size = 536870911BAR1的高32位將被編程為什么?我預期為0x21,但找到0x1。這是因為pcibios_bus_to_resource / pcibios_resource_to_bus。它標識了3個窗口偏移:window->res->start = 1000000000 window->offset = 1000000000 window->res->end = 10FFFFFFFFwindow->res->start = 1100000000 window->offset = 1100000000 window->res->end = 11FFFFFFFFwindow->res->start = 2000000000 window->offset = 2000000000 window->res->end = 2FFFFFFFFF當顯示上面的地址時,它會增加偏移量,而在端點中對BAR寄存器進行編程時,則將其減去。因此0x2100000000變為0x100000000。使用64位地址和32位BAR可能會有意義,但是為什么使用64位BAR會正確呢?
查看完整描述

1 回答

?
慕森卡

TA貢獻1806條經驗 獲得超8個贊

據此(取自問題):


    pci_bus 0000:00: root bus resource [mem 0x1000000000-0x10ffffffff] (bus address [0x00000000-0xffffffff])

    pci_bus 0000:00: root bus resource [mem 0x1100000000-0x11ffffffff pref] (bus address [0x00000000-0xffffffff])

    pci_bus 0000:00: root bus resource [mem 0x2000000000-0x2fffffffff] (bus address [0x00000000-0xfffffffff])

    pci_bus 0000:00: root bus resource [mem 0x3000000000-0x3fffffffff pref] (bus  address [0x00000000-0xfffffffff])

存儲器地址0x20'0000'0000對應于總線地址0。


因此,如果要使用存儲器地址0x21'0000'0000訪問該設備中的BAR,則需要將其編程為0x1'0000'0000。


同樣,存儲器地址0x10'0000'0000對應于總線地址0。因此,設備中的BAR被編程為0,可以使用存儲器地址0x10'0000'0000進行訪問。


查看完整回答
反對 回復 2021-04-16
  • 1 回答
  • 0 關注
  • 427 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號