PCIE裝置與HOST之間的位址轉換

2021-10-19 01:23:49 字數 2030 閱讀 1294

最近剛好用到了通過pcie的與pc端相連的arm板子,看了看**,裡面的位址轉換確實把我也弄得有些暈,一邊和組裡的人討論一邊去問大神,終於算是把這塊給弄的明白了,在部落格裡稍微記錄一下,防止之後又忘記。

pcie是一種高速序列計算機擴充套件匯流排標準,旨在替代老版的pci匯流排,現在大多數主機板都配有多個pcie插槽,外設可以通過pcie匯流排與主機host進行io。

pcie裝置通過橋接到pcie匯流排來訪問host的資源。和其他裝置一樣,pcie裝置也被統一編址進了host,host可以訪問pcie外設。

於是,重點來了:

我所使用的外設是arm處理器的板子,搭載了裁剪後的linux作業系統,還擁有自己的ddr記憶體,所以,為了讓arm和host在體系結構上區分控制域,使用了非透明的橋接,對我乙個小白,真是第一次接觸到這個概念。

大概的意思就是指橋接到匯流排上的裝置和普通的外設一樣,有權利訪問到host的資源,但是外設本身的資源,對於host來說是不可見的,也就是指外設相當於對主機來說是乙個黑盒。

如下圖的架構圖所示:

所以,由這個問題就引出了很重要的一部分-----位址轉換

host端是通過pcie匯流排和外設進行資訊交換的,host是資訊的生產者,而外設是資訊的消費者,從記憶體中取出資訊進行處理。

在host端通過memmap在記憶體中申請一段預留的連續位址空間,這時需要讓外設知道這個位址以便其進行資料的讀取,但是外設中arm晶元能夠尋找的位址編碼那又是another story

所以需要進行位址轉換!!!!!!!!!!!!!!!!!!!

先說明一下host操作pcie裝置的方式,在主機上電作業系統啟動的時候,作業系統會掃瞄硬體介面,並且分配實體地址,我的pcie外設當然也就在這個時候被賦予了實體地址,等裝置接入時,驅動程式再向host告知這個外設需要占用的位址的size,於是host的os就會把這一段位址空間分配給external device--------這個實體地址就是host和pcie互動的關鍵!

pcie_base_addr + barx_offset能夠找到pcie介面的乙個叫做bar的暫存器,作業系統能夠寫入bar暫存器,而external device可以獲取到bar的值,於是,這個暫存器就充當了共享記憶體一樣的角色。host和external device的資訊交換渠道也就建立起來了。

理清一下大概的思路,host將memmap申請預留的位址空間的首位址寫入pcie介面的bar暫存器,arm外設記憶體也申請同樣大小的一部分記憶體,在讀寫資訊時,將bar暫存器中的位址當做基址,通過偏移量的方式使得兩部分位址空間一一對應。

① host端的資料生產者,memmap申請預留空間,將首位址通過memset設定到bar暫存器

② external device端的資料消費者,通過mmap函式訪問自身的記憶體指定位置(由驅動程式設定為專門用來與host進行記憶體對映的位址空間)

③ pcie介面處的硬體實現兩部分架構的記憶體位址的轉換(基址暫存器 + 偏移量)

④ 其中,基址暫存器的值由pc端賦值的bar暫存器來給出

流程圖如下圖所示:

基本上就是這麼乙個簡單的流程。

基於tcp/ip協議的socket通訊中,也有大量的位址轉換,而假如像這樣的host與外設之間的通訊也基於socket來實現的話,其中必然夾雜著大量的冗餘的位址轉換等操作,一條socket語句甚至可能包含著幾百上千條指令,這顯然對於某些對速度效率要求苛刻的專案來說是扮演著披著羊皮的狼這樣乙個角色了,不如直接利用系統呼叫來實現位址的轉化,讓整個流程更加的迅速。

ps:basically,第一次正經部落格差不多就這樣乙個draft一樣的感覺吧,親身寫了一下才發現沒有想象的那麼輕鬆,感謝一下那些個被我白嫖至今的部落格博主們,看了快四年的部落格,每一篇部落格都不好寫啊,雖說過程沒有想象中的那麼開心,但記錄總歸是很有意義的事情,以後還會繼續下去的,也算是對自己的一點激勵吧。。

PCIE裝置與HOST之間的位址轉換

最近剛好用到了通過pcie的與pc端相連的arm板子,看了看 裡面的位址轉換確實把我也弄得有些暈,一邊和組裡的人討論一邊去問大神,終於算是把這塊給弄的明白了,在部落格裡稍微記錄一下,防止之後又忘記。pcie是一種高速序列計算機擴充套件匯流排標準,旨在替代老版的pci匯流排,現在大多數主機板都配有多個...

PCIe裝置的配置空間

關於pci裝置的配置空間網上已經有很多資料了,如下圖就是pci裝置必須支援的64個位元組的配置空間,範圍為0x00 0x3f。很多pci裝置僅僅支持者64位元組的配置空間。pci和pcie配置空間的區別如下文。此外pci pci x和pcie裝置還擴充套件了0x40和0xff這段配置空間,這段空間主...

PCIE 裝置掃瞄的過程

初步了解完pci匯流排標準之後,我們接下來正式開始pcie裝置的漫遊之旅。從我們按下pc的電源按鈕開始,bios就接管系統控制權開始工作,它會先進行一些記憶體和裝置的初始化工作 當然,也包括我們的pci裝置 由於商業上的原因,phoenix等廠商的bios 需要授權協議,在此,我們以另外乙個款開源b...