亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
12345下一頁
最近訪問板塊 發(fā)新帖
查看: 32172 | 回復(fù): 41
打印 上一主題 下一主題

[硬件及驅(qū)動(dòng)] 關(guān)于PCIE、主橋、BAR、驅(qū)動(dòng)、MMU、IOMMU、地址翻譯 [復(fù)制鏈接]

論壇徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:49:45IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-07-29 06:20:00
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2013-12-23 18:37 |只看該作者 |倒序?yàn)g覽
本帖最后由 冬瓜頭 于 2013-12-24 12:07 編輯

最近學(xué)習(xí)了一下PCIE,牽扯不少名詞,網(wǎng)絡(luò)上不少blog和文章,對(duì)虛擬地址、物理地址、翻譯過程理不清頭緒,在這里嘗試總結(jié)一下問題,并給出自己的理解(大部分是基于推導(dǎo)猜測),希望了解這塊的大俠們糾正,有些問題自己也不懂,希望能夠得到指點(diǎn)。謝謝!

1. BIOS或者內(nèi)核在初始化PCIE的時(shí)候,BAR里寫入的基地址到底是虛擬存儲(chǔ)器域地址,還是物理存儲(chǔ)器域地址,還是pcie總線域地址?
答:PCIE總線域地址,內(nèi)核自己記錄每個(gè)設(shè)備的主存物理地址--PCIE總線域地址映射。

2. 那好,那么初始化好之后,該設(shè)備驅(qū)動(dòng)加載時(shí),據(jù)說要做ioremap,這是怎么回事?
答:保護(hù)模式下,誰都繞不過MMU和頁表(內(nèi)核自身也繞不過么?),必須使用虛擬地址,包括內(nèi)核自身(比如Linux下高1GB和Windows下高2GB或1GB)。驅(qū)動(dòng)必須把內(nèi)核初始化好的這些BAR物理基地址ioremap()為內(nèi)核虛擬空間的虛擬地址。之后讀寫IO端口也必須使用虛擬地址。

3. 那好,ioremap之后,映射關(guān)系被保存在了哪里,是頁表里么?
答:是的,由于內(nèi)核虛擬空間被每個(gè)用戶進(jìn)程公用,所有進(jìn)程頁表的內(nèi)核空間映射都是共享的,就被保存在這里,也要經(jīng)過MMU,所以陷入內(nèi)核不需要更新CR3寄存器。

4. 那好,驅(qū)動(dòng)發(fā)出某個(gè)虛擬地址讀寫設(shè)備某寄存器,經(jīng)過MMU翻譯之后,北橋怎么知道這地址是發(fā)給該物理設(shè)備的?PCIE設(shè)備DMA的時(shí)候不是必須發(fā)出PCIE總線物理地址么,如果它發(fā)出的驅(qū)動(dòng)告訴它的主存虛擬地址,怎么解?
答:內(nèi)核初始化PCIE的時(shí)候,會(huì)對(duì)北橋編程,將所有外設(shè)的地址范圍保存在北橋的緩存里,所以北橋知道,并且知道哪些地址是應(yīng)該交給PCIE控制器,也就是PCIE主橋處理的。至于第二個(gè)問題,不清楚。。

5. 那好,PCIE主橋收到對(duì)應(yīng)地址的訪問之后,做了什么?
答:主橋直接在PCIE地址總線上放置收到的地址信號(hào),次級(jí)橋或者bus0總線上的EP終端設(shè)備都會(huì)解析這個(gè)地址,如果發(fā)現(xiàn)是自己BAR+Limit地址范圍之內(nèi)的,就會(huì)認(rèn)領(lǐng)這個(gè)信號(hào),從而啟動(dòng)數(shù)據(jù)傳輸周期。

6. 那么PCIE主橋屁事不干就管轉(zhuǎn)發(fā)信號(hào)?
答:這個(gè)不清楚,之前看到的是主橋負(fù)責(zé)把主機(jī)物理地址翻譯長PCIE總線地址,按照上述過程,根本不用翻譯,每個(gè)PCIE設(shè)備都知道自己負(fù)責(zé)響應(yīng)哪塊地址段,因?yàn)楦髯远贾栏髯缘腂AR基地址和limit,看不出哪里需要翻譯。而且至今也不理解所謂“PCIE總線地址”原生是個(gè)什么概念,是不是那意思是說每個(gè)PCIE設(shè)備在沒被初始化之前都認(rèn)為自己的BAR基地址是從0開始。。不清楚所謂“主橋地址翻譯”在什么時(shí)候翻譯了誰。。

7. 那好,PCIE設(shè)備從主機(jī)端內(nèi)存DMA數(shù)據(jù)進(jìn)來,是走PCIE數(shù)據(jù)總線么?
答:是的,PCIE串行+并行方式傳輸數(shù)據(jù)。

8. 那好,PCIE設(shè)備上的DMA控制器是和北橋上的DMA控制器在電路級(jí)連通么?
答:不清楚,猜測是連接到PCIE主橋,經(jīng)過翻譯之后,再訪問內(nèi)存控制器。

9. 那好,PCIE設(shè)備要啟動(dòng)DMA,它怎么知道去哪個(gè)地址DMA?
答:驅(qū)動(dòng)在初始化該設(shè)備的時(shí)候,會(huì)把主存里的數(shù)據(jù)緩存、指令隊(duì)列等基地址寫到設(shè)備的專用寄存器里,并保持恒久不變。設(shè)備通過訪問該基地址得到指令以及SGL內(nèi)存段描述表,從而知道去哪里DMA。

10. 那好,驅(qū)動(dòng)通知給設(shè)備的這些地址,是硬件物理地址還是虛擬地址?
答:一定是虛擬地址,因?yàn)轵?qū)動(dòng)寫入這些寄存器里的地址雖然是地址,但是是作為數(shù)據(jù)形式寫入的,MMU不會(huì)感知到“數(shù)據(jù)”里面保存的是地址。

11. 那好,設(shè)備通過DMA控制器把要訪問的虛擬地址發(fā)送給北橋DMA控制器,北橋DMA控制器是要通過MMU翻譯成物理地址么?
答:理論上應(yīng)該是這樣,但是據(jù)說有個(gè)叫做IOMMU的東西,專門負(fù)責(zé)DMA時(shí)候的地址翻譯。但是這里我也不明白,IOMMU會(huì)把虛擬地址翻譯成物理地址么?為何不用MMU,單獨(dú)搞一個(gè)IOMMU?

12. 那好,PCIE設(shè)備是不是只能訪問主機(jī)端主存在BAR里定義的地址段?
答:之前看過一些文章說不管是CPU訪問外設(shè)地址還是外設(shè)訪問主存地址,都是限制在BAR里的地址段的,都不能越界訪問。但是現(xiàn)實(shí)中好像根本不是這么回事。外設(shè)DMA主存的時(shí)候可以訪問任意地址空間,有4GB可用,那么一定是虛擬空間了,我之前也理解外設(shè)訪問主存也必須限制在BAR規(guī)定的地址段內(nèi),可能被深深誤導(dǎo)了。但是既然SGL里通告的是虛擬地址,那么為何DMA不是用MMU來映射回物理地址呢?非要再搞個(gè)IOMMU為何呢?

13. 那好,請(qǐng)告訴我既然有“PCIE域總線地址”,那么PCIE插槽針腳上,地址線連接在哪里?
答:PCIE總線使用數(shù)據(jù)針腳復(fù)用地址和數(shù)據(jù)信號(hào),分周期,先地址,后數(shù)據(jù)。但是,也請(qǐng)明白的告訴我,傳送64位地址的話,一個(gè)時(shí)鐘周期傳完,起碼要64根導(dǎo)線,PCIE插槽上如果是4個(gè)Lane的,沒有64線吧,那是不是要分多個(gè)周期傳送了。

14. 好吧。那么所謂“PCI設(shè)備在向主存DMA的時(shí)候使用的也是PCIE總線域地址而不是主存地址”,能否解釋一下這句話?死活想不通,PCIE設(shè)備怎么能使用PCIE總線域地址向主存DMA?這不相當(dāng)于刻舟求劍么?驅(qū)動(dòng)告訴它去哪DMA,它就去應(yīng)該去哪DMA,完全不懂。
答:不要問了,我已經(jīng)瘋了。

15. 哦。那請(qǐng)告訴我書上說“BAR內(nèi)存放的是PCIE總線域的地址而不是存儲(chǔ)器域的地址”,我也要瘋了,內(nèi)核初始化PCIE的時(shí)候,不是把其分配的存儲(chǔ)器域的基地址寫入到BAR內(nèi)么?怎么就不是存儲(chǔ)器域的地址了呢?難道“正統(tǒng)”做法應(yīng)該是寫入PCIE總線域地址,然后再由PCIE主橋進(jìn)行翻譯?
答:哎?尼瑪,你可能還真說對(duì)了。的確“正統(tǒng)”的做法,就是為每個(gè)PCIE設(shè)備分配各自的PCIE域的總線基地址并保證不沖突,然后為每個(gè)PCIE域的基地址映射存儲(chǔ)器域的基地址,然后記錄在PCIE初始化那個(gè)樹結(jié)構(gòu)里,并且把這個(gè)地址翻譯表保存在北橋。。。

16. 哦?尼瑪太好了。那么請(qǐng)解釋一下書上說的“PCIE設(shè)備在DMA的時(shí)候也只能使用PCIE總線地址,而且不能訪問未被映射的地址空間”。
答:暈了。這完全顛覆了我的認(rèn)知。PCIE設(shè)備應(yīng)該是可以完全DMA主存的虛擬地址空間,但是如果BAR里如果只分配了1MB地址,按照“書”上說的,它和尋址4GB虛擬空間? “書”中的描述為何不能啰嗦和通俗一些呢?愁死了。

完。

評(píng)分

參與人數(shù) 1可用積分 +8 收起 理由
Godbach + 8 贊一個(gè)!

查看全部評(píng)分

論壇徽章:
1
水瓶座
日期:2013-09-28 21:40:25
2 [報(bào)告]
發(fā)表于 2013-12-23 19:20 |只看該作者
頂,這個(gè)問答形式不錯(cuò),邏輯性、順序性也很強(qiáng)。

11. IOMMU就是轉(zhuǎn)門給設(shè)備用的MMU。CPU透過MMU來看Memory, Device則通過IOMMU來看Memory。至于為啥不直接用已有的MMU,我想到了三點(diǎn)原因,供大家討論:一是MMU可以和CPU Cache進(jìn)行關(guān)聯(lián)做一些優(yōu)化,但是設(shè)備IOMMU基本上目前沒這個(gè)需求;二是連個(gè)MMU可以將同一地址映射到CPU和設(shè)備的不同虛地址上;三是TLB條目的索引方式不太相同,MMU跟進(jìn)程關(guān)聯(lián),而IOMMU基本上跟設(shè)備ID關(guān)聯(lián)。

論壇徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技術(shù)圖書徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44雙子座
日期:2013-12-27 12:32:29雙子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
3 [報(bào)告]
發(fā)表于 2013-12-23 20:48 |只看該作者
本帖最后由 asuka2001 于 2013-12-23 20:53 編輯

回復(fù) 1# 冬瓜頭

首先需要明白CPU域的物理地址空間和PCI域的地址空間的區(qū)別。而PCI域的地址空間又分成配置空間,內(nèi)存地址空間,IO地址空間。

一般容易混淆的是CPU域的物理地址和PCI域的內(nèi)存地址空間的地址,因?yàn)閤86上它們數(shù)值上相等,因此很多時(shí)候就認(rèn)為兩者等同,其實(shí)是不同的。

比如32位的CPU域物理地址空間可能只有4G,但是PCI域的內(nèi)存地址空間可以達(dá)到2^64大小。。。遠(yuǎn)遠(yuǎn)大于CPU域物理地址空間。

從CPU域物理地址空間到PCIE域的內(nèi)存地址空間的映射,即將PCI設(shè)備的bar + size這么一段pcie域的內(nèi)存地址空間映射到CPU域上對(duì)應(yīng)數(shù)值的物理地址空間。

而從PCIE域的內(nèi)存地址空間到CPU域物理地址空間的映射,則是iommu的工作。如果沒有,那么同樣是直接映射。

CPU發(fā)起訪問是,使用的是自己的物理地址,通過pcie root complex轉(zhuǎn)換成PCI域的內(nèi)存地址空間的地址。而一旦在PCIE總線上,存在的尋址全部使用PCIE域的地址。

同樣設(shè)備發(fā)起訪問時(shí),使用的是PCI域的地址,不會(huì)使用CPU域的物理地址。當(dāng)有iommu時(shí),就可以做到PCIE設(shè)備訪問的是連續(xù)的PCI域的地址,但是通過iommu將它翻譯為了不連續(xù)的CPU域物理地址。

論壇徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:49:45IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-07-29 06:20:00
4 [報(bào)告]
發(fā)表于 2013-12-23 23:51 |只看該作者
asuka2001 發(fā)表于 2013-12-23 20:48
回復(fù) 1# 冬瓜頭

首先需要明白CPU域的物理地址空間和PCI域的地址空間的區(qū)別。而PCI域的地址空間又分成配 ...


謝謝,已明白了地址翻譯。請(qǐng)教一下,PCIE回訪主存,是否可以超出BAR內(nèi)的地址范圍訪問?

論壇徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技術(shù)圖書徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44雙子座
日期:2013-12-27 12:32:29雙子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
5 [報(bào)告]
發(fā)表于 2013-12-24 08:59 |只看該作者
回復(fù) 4# 冬瓜頭

可以,之所以需要os設(shè)置bar,是因?yàn)镃PU域的物理地址空間有限,而且不能產(chǎn)生沖突。

而PCI域的地址空間大,專屬于pci設(shè)備。完全可以將CPU域的物理地址空間整個(gè)映射進(jìn)來(因?yàn)槭侵苯佑成,?nèi)存等占據(jù)的PCI域地址空間必然不會(huì)有PCI設(shè)備占據(jù))


   

論壇徽章:
2
2015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:17
6 [報(bào)告]
發(fā)表于 2013-12-24 09:33 |只看該作者
mmio和dma的理解是不對(duì)的

mmio是寄存器, 為了給cpu訪問的; dma是內(nèi)存, 為了給dev訪問的。 二者完全不相干。

論壇徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:49:45IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-07-29 06:20:00
7 [報(bào)告]
發(fā)表于 2013-12-24 11:57 |只看該作者
asuka2001 發(fā)表于 2013-12-24 08:59
回復(fù) 4# 冬瓜頭

可以,之所以需要os設(shè)置bar,是因?yàn)镃PU域的物理地址空間有限,而且不能產(chǎn)生沖突。


請(qǐng)問這個(gè)把PCIE空間映射到主存空間的過程,是否在內(nèi)核代碼里有體現(xiàn)?或者說因?yàn)閤86是簡單的相等關(guān)系,所以寫死了不需要代碼做什么事情了?下面的輸出中并沒有找到這種反向映射關(guān)系。。


01:00.0 Serial Attached SCSI controller: Adaptec Device 8088 (rev 06)
        Subsystem: Adaptec Device 0800
        Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr+ Stepping- SERR+ FastB2B- DisINTx+
        Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
        Latency: 0, Cache Line Size: 64 bytes
        Interrupt: pin A routed to IRQ 16
        Region 0: Memory at f7d50000 (64-bit, non-prefetchable) [size=64K]
        Region 2: Memory at f7d40000 (64-bit, non-prefetchable) [size=64K]
        Region 5: Memory at f7d00000 (32-bit, non-prefetchable) [size=256K]
        Expansion ROM at f7c00000 [disabled] [size=1M]
        Capabilities: [80] Power Management version 3
                Flags: PMEClk- DSI- D1+ D2- AuxCurrent=0mA PME(D0+,D1+,D2-,D3hot+,D3cold-)
                Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
        Capabilities: [88] Vital Product Data
                Unknown large resource type 20, will not decode more.
        Capabilities: [90] MSI: Enable- Count=1/32 Maskable+ 64bit+
                Address: 0000000000000000  Data: 0000
                Masking: 00000000  Pending: 00000000
        Capabilities: [b0] MSI-X: Enable+ Count=64 Masked-
                Vector table: BAR=0 offset=00000400
                PBA: BAR=0 offset=00000800
        Capabilities: [c0] Express (v2) Endpoint, MSI 00
                DevCap: MaxPayload 512 bytes, PhantFunc 0, Latency L0s <4us, L1 <1us
                        ExtTag+ AttnBtn- AttnInd- PwrInd- RBE+ FLReset+
                DevCtl: Report errors: Correctable- Non-Fatal- Fatal- Unsupported-
                        RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop+ FLReset-
                        MaxPayload 256 bytes, MaxReadReq 512 bytes
                DevSta: CorrErr+ UncorrErr- FatalErr- UnsuppReq+ AuxPwr- TransPend-
                LnkCap: Port #0, Speed unknown, Width x8, ASPM L0s L1, Latency L0 <1us, L1 <1us
                        ClockPM- Surprise- LLActRep- BwNot-
                LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- Retrain- CommClk-
                        ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
                LnkSta: Speed unknown, Width x8, TrErr- Train- SlotClk- DLActive- BWMgmt- ABWMgmt-
                DevCap2: Completion Timeout: Range B, TimeoutDis+
                DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis-
                LnkCtl2: Target Link Speed: Unknown, EnterCompliance- SpeedDis-, Selectable De-emphasis: -6dB
                         Transmit Margin: Normal Operating Range, EnterModifiedCompliance- ComplianceSOS-
                         Compliance De-emphasis: -6dB
                LnkSta2: Current De-emphasis Level: -6dB
        Capabilities: [100] Advanced Error Reporting
                UESta:  DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
                UEMsk:  DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
                UESvrt: DLP+ SDES+ TLP+ FCP+ CmpltTO- CmpltAbrt- UnxCmplt- RxOF+ MalfTLP+ ECRC- UnsupReq- ACSViol-
                CESta:  RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr+
                CEMsk:  RxErr- BadTLP- BadDLLP- Rollover- Timeout- NonFatalErr+
                AERCap: First Error Pointer: 00, GenCap+ CGenEn- ChkCap+ ChkEn-
        Capabilities: [150] Device Serial Number 00-00-00-00-00-00-00-00
        Capabilities: [160] Power Budgeting <?>
        Capabilities: [1b0] Latency Tolerance Reporting
                Max snoop latency: 0ns
                Max no snoop latency: 0ns
        Capabilities: [1c0] #16
        Capabilities: [274] Transaction Processing Hints
                Interrupt vector mode supported
                Device specific mode supported
                Steering table in TPH capability structure
        Capabilities: [300] #19
        Capabilities: [400] Vendor Specific Information <?>

論壇徽章:
1
水瓶座
日期:2013-09-28 21:40:25
8 [報(bào)告]
發(fā)表于 2013-12-24 12:29 |只看該作者
回復(fù) 6# 帥絕人寰


    mmio不應(yīng)該局限為寄存器,設(shè)備上的Memory也可以通過mmio來訪問,比如PCIE顯卡的顯存。

論壇徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技術(shù)圖書徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44雙子座
日期:2013-12-27 12:32:29雙子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
9 [報(bào)告]
發(fā)表于 2013-12-24 13:11 |只看該作者
回復(fù) 7# 冬瓜頭

額抱歉,這里說錯(cuò)了,真正設(shè)置bar的不是os而是bios。os做pci總線枚舉時(shí)已經(jīng)是直接利用bios設(shè)置完畢的成果了!

論壇徽章:
2
2015年迎新春徽章
日期:2015-03-04 09:49:45IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-07-29 06:20:00
10 [報(bào)告]
發(fā)表于 2013-12-24 13:56 |只看該作者
asuka2001 發(fā)表于 2013-12-24 13:11
回復(fù) 7# 冬瓜頭

額抱歉,這里說錯(cuò)了,真正設(shè)置bar的不是os而是bios。os做pci總線枚舉時(shí)已經(jīng)是直接利用b ...


我理解不是的。Linux 0.11之后的內(nèi)核都是內(nèi)核自行初始化,完全不依靠BIOS,BIOS那塊內(nèi)存直接被內(nèi)核回收了。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP