在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何從CPU角度來理解PCIe

SSDFans ? 來源:未知 ? 作者:胡薇 ? 2018-10-28 10:45 ? 次閱讀

一、概述

CPU訪問外設寄存器與內存編址方式;

CPU如何訪問PCIe配置空間;

CPU能夠通過寄存器訪問配置空間,為什么還需要映射PCIe配置空間;

如何掃描PCIe樹并且為PCIe分配ID;

如何將pcie域地址映射到存儲器域地址空間。

通過本篇文章將對問題1、2、3做出解答。

二、統一編址于獨立編址

CPU編址是程序指令與物理地址線建立鏈接的方式,在CPU內部有專門的地址集合,編址過程是由CPU體系架構所決定的,參考示意圖如圖 1所示(僅僅代表示意圖,講解一種邏輯結構,不代表實際電路)。CPU編址時就已經指定了0x8000_0000~0xFFFF_FFFF這個地址空間為連接到圖中內存的地址線,內存如何連接到CPU需要當參考CPU的datasheet,當CPU程序指令對0x8000_0000這個物理地址地址發起訪問時,等價于是在訪問圖中2G內存的首地址。

圖1

內存通過CPU地址總線來尋址定位,然后通過CPU數據總線讀寫數據。CPU的地址總線位數是CPU設計時確定,因此一款CPU所能尋址的地址范圍是一定的,而內存是需要占用CPU的尋址空間的,內存與CPU采用總線直接連接。

IO指的是與CPU連接的各種外設,CPU訪問各種外設有兩種方式:一種是類似于訪問內存的方式,即把外設的寄存器當成內存地址讀寫,從文可以以訪問內存方式操作外設寄存器。這時,IO與內存統一編址,IO地址與內存地址在同一個地址空間下,這種編址方式叫做IO與內存統一編址。

另外一種編址方式是IO地址與內存地址分開獨立編址,這種編址方式叫做獨立編址,此時,CPU訪問外設寄存器需要通過CPU特定的指令去訪問外設寄存器,而不能通過地址直接訪問外設寄存器。常見的ARM、PowerPc、MIPS架構都是采用統一編址,X86架構采用獨立編址。

三、訪問PCIe配置空間256bytes

PCI總線規定訪問配置空間總線事務,使用ID號進行尋址。PCI設備ID號由總線號(Bus Number)、設備號(Device Number)和功能號(Function Number)。其中總線號在HOST主橋遍歷PCI總線樹時確定,在一顆PCI總線樹上,總線號由系統軟件決定,通常與HOST主橋直接相連接的PCI總線編號為0,系統軟件使用DFS(Depth-First Search)算法掃描PCI總線樹上的所有PCI總線,并依次編號。

一條PCI總線的設備號由PCI設備的IDSEL信號與PCI總線地址線的連接關系確定,功能號與PCI設備的具體設計有關。一個PCIe系統最多有256條Bus,每條Bus上最多可以掛在32個設備,每個PCIe設備最多有8個功能設備。

在XX處理器中的HOST主橋中,與PCIE設備配置相關的寄存器由CFG_ADDR、CFG_DATA等組成。系統軟件使用CFG_ADDR(CFG_ADDR寄存器結構如圖 2所示)和CFG_DATA寄存器訪問PCIe設備的配置空間,這些寄存器都是采取同一編址(所有內存寄存器都使用存儲器映射方式進行尋址)。

當處理器訪問PCIe配置空間時,首先需要在CFG_ADD寄存器中設置這個PCIe設備對應的總線號、設備號、功能號和寄存器偏移,然后使能Enable位,之后當處理器對CFG_DATA讀寫訪問時,HOST主橋將這個存儲器讀寫訪問轉換成PCIe配置讀寫請求,并且發送到PCIe總線上。如果Enable位沒有使能,那么CPU對寄存器的訪問也就是一個普通IO的訪問,而不能讓HOST轉換成總線請求訪問,訪問PCIe配置空間時按照PCIe總線標準配置TLP請求,CFG_DATA是讀取的數據或者待寫入的數據。

圖2

31位:Enable位,為1時,對CFG_DATA讀寫才能轉換成PCIe總線配置請求。

30~24位:保留。

23~16位:總線號,最多=256個。

15~11位:設備號,最多=32個。

10~8位:功能號,最多=8個。

7~2位:寄存器偏移,最多訪問寄存器=64個地址,這里一個地址是DW,那么能干訪問的PCIe配置空間大小為64*4=256Byte,所以訪問PCIe配置空間都是以4字節對齊訪問的。

走到這里很多讀者可能就會有這樣的疑問,既然CPU能夠直接通過寄存器訪問配置空間,為啥還會出現配置空間在存儲域地址的映射這一說法呢?下面給出詳細解答。

訪問PCIe配置空間寄存器的方法需要追溯到原始的PCI規范。為了發起PCI總線配置周期,Intel(Intel是PCIe龍頭老大,最新的PCIe的規范總是它最先嘗試的)實現的PCI規范使用IO空間的CF8h和CFCh來分別作為索引和數據寄存器,這種方法可以訪問所有PCI設備的255 bytes配置寄存器。Intel Chipsets目前仍然支持這種訪PCI配置空間的方法。

PCIe規范在PCI規范的基礎上,將配置空間擴展到4K bytes,至于為什么擴展到4K,具體可以參考PCIe規范,這些配置CFG_ADDR和CFG_DATA寄存器方法仍然可以訪問所有PCIe設備配置空間的頭255 bytes,但是該方法訪問不了剩下的(255B~4K)配置空間。怎么辦呢?Intel外一種PCIe配置空間訪問方法。Intel Chipset通過將配置空間映射到內存地址空間,PCIe配置空間可以像對映射范圍內的內存進行read/write來訪問了。這種映射是由北橋芯片來完成的,但是不同芯片的映射方式也是不同的。目前我查看了ARM芯片的datasheet,確實是這樣的方式。

PCIe規范為每個PCIe設備添加了更多的配置寄存器,空間為4K,盡管CFG_ADDR和CFG_DATA寄存器方法仍然能夠訪問lower 255 bytes,但是必須提供另外一種方法來訪問剩下的(255B~4K)range寄存器。Intel的解決方案是使用了預留256MB內存地址空間,對這段內存的任何訪問都會發起PCIe 配置cycle。

由于4K的配置空間是directly mapped to memory的,那么PCIe規范必須保證所有的PCIe設備的配置空間占用不同的內存地址,按照PCIe規范,支持最多256個bus,每個Bus支持最多32個PCIe devices,每個device支持最多8個function,也就是說:占用內存的最大值為:256 * 32 * 8 * 4K = 256MB。圖 3是ARM Cortex-A9 datasheet內存地址分配局部圖。被PCIe配置空間占用的256M內存空間會屏蔽掉DRAM使用該段內存區,這些地址都由CPU出廠時已經固化好了。

圖3

四、PCIe配置空間的內存映射對32bit系統的影響

由于PCIe配置空間占用了256M內存空間,而且該被占用空間對DRAM來說是不可用的,這意味著256M空間消失于系統內存,這在32bit系統中更為明顯。比如,在32 bit winxp中(作者目前電腦還是用的XP系統,電腦用了七八年了),理論上可以訪問到的內存是4G,如果4G空間都被DRAM給占用,由于PCIe的存在,被PCIe占用的那部分內存空間對OS來說是不可用的,莫名的消失了最多256M內存,其實還有其他外設寄存器需要映射到內存,如果是獨立編址就不存在寄存器占用內存。

所以在XP系統中實際能夠訪問DRAM空間最大值為3.2G。64位CPU尋址不存在這個情況,個地址目前來說應該用不完,這里讀者需要注意的是CPU有32和64位尋址方式,同樣操作系統也有32和64位之分,在Linux系統中主要體現在庫文件上。

有些CPU沒有直接指定PCIe配置空間的地址范圍,需要讀取某個寄存器的值BaseAddr,這個值就說PCIe配置寄存器在內存區域映射的基地址。訪問PCIe設備配置空間時候需要手動計算訪問PCIe配置空間的地址。計算發放如下:

SIZE_PER_FUNC = 4K = 1000h

SIZE_PER_DEVICE = 4K * 8 = 8000h

SIZE_PER_BUS = 4K *8* 32 = 100000h

訪問總線號為busNo,設備號為DevNo,功能號為funcNo的offset寄存器的計算公式是:

Memory Address = BaseAddr+ busNo * SIZE_PER_BUS+ devNo * SIZE_PER_DEVICE+ funcNo * SIZE_PER_FUNC+ offset

訪問PCIe配置空間就需要通過總線號、設備號、功能號、寄存器偏移進行轉換成內存地址。轉換函數如圖 2所示。

圖 4

問題4和5在下篇文章中講解,介于作者實力有限。如有錯誤,望讀者給出寶貴的意見。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10868

    瀏覽量

    211844
  • PCIe
    +關注

    關注

    15

    文章

    1239

    瀏覽量

    82674

原文標題:從CPU角度理解PCIe

文章出處:【微信號:SSDFans,微信公眾號:SSDFans】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    需求的角度理解Linux系列:總線、設備和驅動

    需求的角度理解Linux系列:總線、設備和驅動》是一篇有關如何學習嵌入式Linux系統的方法論文章,也是需求的角度
    發表于 03-11 14:45

    背光原理的角度分析LCD與LED的區別

    說到顯示技術,人們最先想到的就是液晶顯示(LED背光技術。但是很多人會將LCD與冷陰極熒光燈管混為一談,這顯然是不正確的,應該背光原理的角度進行區分,這樣才是最為正確的理解方式。希
    發表于 10-30 09:57

    數字化實現的角度理解PI環節

    本文數字化實現的角度理解PI(proportional integral, PI)環節,為數字化實現PI打下基礎。...
    發表于 08-30 07:41

    EMC設計的角度解析無人機

    雄厚的飛控系統開發能力自然是必須的,強大的EMC設計能力也是至關重要的,本文結合實戰經驗,EMC設計的角度解析無人機這一多系統集成的智能硬件產品!希望對大家有所幫助!
    的頭像 發表于 08-04 10:59 ?5757次閱讀
    <b class='flag-5'>從</b>EMC設計的<b class='flag-5'>角度</b><b class='flag-5'>來</b>解析無人機

    站在CPU角度看世界

    經常聽到有人說磁盤很慢、網絡很卡,這都是站在人類的感知維度去表述的,比如拷貝一個文件到硬盤需要幾分鐘到幾十分鐘,夠我去吃個飯啦;而網絡下載一部電影,有時候需要幾個小時,我都可以睡一覺了。然而,CPU
    的頭像 發表于 08-12 11:12 ?3583次閱讀

    CPU核心數沒有那么重要 工作負載等角度服務客戶才最要緊

    在AMD連接推出32核以及64核的EPYC霄龍處理器之后,CPU性能就開始走向依多為勝的局面。在這點上Intel采用原生架構的處理器沒法比了,主流桌面還是8核最多,至強處理器最多28核,不過Intel認為CPU核心數并不是唯一指標,而是
    發表于 02-04 15:04 ?1054次閱讀

    如何理解現場總線?工業通信的角度看看資料下載

    電子發燒友網為你提供如何理解現場總線?工業通信的角度看看資料下載的電子資料下載,更有其他相關的電路圖、源代碼、課件教程、中文資料、英文資料、參考設計、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發表于 04-15 08:45 ?12次下載
    如何<b class='flag-5'>理解</b>現場總線?<b class='flag-5'>從</b>工業通信的<b class='flag-5'>角度</b>看看資料下載

    圖解PCIE原理(軟件角度

    1 PCIE基本概念1.1 PCIE拓撲架構圖1.2 PCIE Switch內部結構圖1.3 PCIE協議結構圖2 PCIE枚舉原理2.1
    發表于 12-17 18:29 ?28次下載
    圖解<b class='flag-5'>PCIE</b>原理(<b class='flag-5'>從</b>軟件<b class='flag-5'>角度</b>)

    PCIe 5.0標準加速云中的數據移動

      PCIe 5.0 也在推動對 CPU 和 SSD 控制器之間的 NVMe 驅動器的快速視頻存儲訪問所需的性能。存儲的角度來看,視頻的分辨率越來越高,這意味著控制器和
    的頭像 發表于 06-01 17:22 ?1343次閱讀

    如何匯編代碼理解enum

    Rust enum 是一個非常強大的特性, 很多人好奇他內部是如何實現的, 這里作者生成的匯編代碼幫你深入理解 Rust 的 enum. 一些關鍵結論:
    發表于 11-15 11:13 ?551次閱讀

    仿真器的角度理解Verilog語言1

    只作為語法設定介紹,忽略了Verilog語言的軟件特性和仿真特性。使得初學者無法理解Verilog語言在行為級語法(過程塊、賦值和延遲)背后隱藏的設計思想。本文嘗試仿真器的角度對V
    的頭像 發表于 05-25 15:10 ?925次閱讀
    <b class='flag-5'>從</b>仿真器的<b class='flag-5'>角度</b><b class='flag-5'>理解</b>Verilog語言1

    仿真器的角度理解Verilog語言2

    只作為語法設定介紹,忽略了Verilog語言的軟件特性和仿真特性。使得初學者無法理解Verilog語言在行為級語法(過程塊、賦值和延遲)背后隱藏的設計思想。本文嘗試仿真器的角度對V
    的頭像 發表于 05-25 15:10 ?843次閱讀
    <b class='flag-5'>從</b>仿真器的<b class='flag-5'>角度</b><b class='flag-5'>理解</b>Verilog語言2

    硬件軟件角度理解Gadget框架

    2. 硬件軟件角度理解 Gadget 框架 USB 傳輸的核心是 endpoint,使用 endpoint 可以收發數據。在 endpoint 之上,就可以模擬 USB 串口、USB 觸碰屏
    的頭像 發表于 07-13 11:32 ?1107次閱讀
    <b class='flag-5'>從</b>硬件軟件<b class='flag-5'>角度</b><b class='flag-5'>理解</b>Gadget框架

    理解PCI和PCIE的關鍵

    理解 PCI 和 PCIE 的關鍵 地址空間轉換 PCI 接口速覽 PCI 是并行口,引腳多。其中 Address 和 Data 復用 PIN 腳,因此引腳命名為 AD。 隨著速率的提升,并行口引腳
    的頭像 發表于 07-30 09:44 ?1370次閱讀
    <b class='flag-5'>理解</b>PCI和<b class='flag-5'>PCIE</b>的關鍵

    什么是PCIePCIe有什么用途?PCIe 5.0有何不同?

    隨著英特爾Alder Lake CPU的發布,以及AMD 7000 Ryzen CPU的即將發布,PCIe 5.0 硬件終于成為現實。但什么是 PCIe 5.0?
    的頭像 發表于 11-18 16:48 ?3483次閱讀
    什么是<b class='flag-5'>PCIe</b>?<b class='flag-5'>PCIe</b>有什么用途?<b class='flag-5'>PCIe</b> 5.0有何不同?
    主站蜘蛛池模板: 精品女视频在线观看免费| 天天射日日操| 激情网五月| 天堂最新版资源www在线| 在线不卡一区| 亚洲精品美女在线观看| 欧美午夜剧场| 国产一区国产二区国产三区| 视频在线免费看| 久久精品国产大片免费观看| 黄a在线| 91久久人澡人人添人人爽| 日本与大黑人xxxx| 中文字幕xxx| 东京加勒比| 婷婷97狠狠的狠狠的爱| 色噜噜狠狠狠狠色综合久一| 亚洲天堂最新地址| 四虎国产精品4hu永久| 亚州国产精品精华液| 一级做a爰片久久毛片毛片| 午夜精品影院| 亚洲成年人在线| 色婷婷色综合缴情在线| 免费一级欧美片在线观免看| 国产色女人| 国产日本三级在线播放线观看| 久久视频免费看| 久久亚洲成人| 9797色| 97久久伊人精品影院| 手机福利在线| 高清欧美性xxxx成熟| 高清不卡一区| 日本三级三级三级免费看| 国产一级毛片外aaaa| 天天噜夜夜操| 国产在线h视频| 亚洲福利在线视频| 六月丁香婷婷激情| 午夜免费视频网站|