0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何從CPU角度來理解PCIe

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

一、概述

CPU訪問外設(shè)寄存器與內(nèi)存編址方式;

CPU如何訪問PCIe配置空間;

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

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

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

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

二、統(tǒng)一編址于獨(dú)立編址

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

圖1

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

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

另外一種編址方式是IO地址與內(nèi)存地址分開獨(dú)立編址,這種編址方式叫做獨(dú)立編址,此時(shí),CPU訪問外設(shè)寄存器需要通過CPU特定的指令去訪問外設(shè)寄存器,而不能通過地址直接訪問外設(shè)寄存器。常見的ARM、PowerPc、MIPS架構(gòu)都是采用統(tǒng)一編址,X86架構(gòu)采用獨(dú)立編址。

三、訪問PCIe配置空間256bytes

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

一條PCI總線的設(shè)備號(hào)由PCI設(shè)備的IDSEL信號(hào)與PCI總線地址線的連接關(guān)系確定,功能號(hào)與PCI設(shè)備的具體設(shè)計(jì)有關(guān)。一個(gè)PCIe系統(tǒng)最多有256條Bus,每條Bus上最多可以掛在32個(gè)設(shè)備,每個(gè)PCIe設(shè)備最多有8個(gè)功能設(shè)備。

在XX處理器中的HOST主橋中,與PCIE設(shè)備配置相關(guān)的寄存器由CFG_ADDR、CFG_DATA等組成。系統(tǒng)軟件使用CFG_ADDR(CFG_ADDR寄存器結(jié)構(gòu)如圖 2所示)和CFG_DATA寄存器訪問PCIe設(shè)備的配置空間,這些寄存器都是采取同一編址(所有內(nèi)存寄存器都使用存儲(chǔ)器映射方式進(jìn)行尋址)。

當(dāng)處理器訪問PCIe配置空間時(shí),首先需要在CFG_ADD寄存器中設(shè)置這個(gè)PCIe設(shè)備對(duì)應(yīng)的總線號(hào)、設(shè)備號(hào)、功能號(hào)和寄存器偏移,然后使能Enable位,之后當(dāng)處理器對(duì)CFG_DATA讀寫訪問時(shí),HOST主橋?qū)⑦@個(gè)存儲(chǔ)器讀寫訪問轉(zhuǎn)換成PCIe配置讀寫請(qǐng)求,并且發(fā)送到PCIe總線上。如果Enable位沒有使能,那么CPU對(duì)寄存器的訪問也就是一個(gè)普通IO的訪問,而不能讓HOST轉(zhuǎn)換成總線請(qǐng)求訪問,訪問PCIe配置空間時(shí)按照PCIe總線標(biāo)準(zhǔn)配置TLP請(qǐng)求,CFG_DATA是讀取的數(shù)據(jù)或者待寫入的數(shù)據(jù)。

圖2

31位:Enable位,為1時(shí),對(duì)CFG_DATA讀寫才能轉(zhuǎn)換成PCIe總線配置請(qǐng)求。

30~24位:保留。

23~16位:總線號(hào),最多=256個(gè)。

15~11位:設(shè)備號(hào),最多=32個(gè)。

10~8位:功能號(hào),最多=8個(gè)。

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

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

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

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

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

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

圖3

四、PCIe配置空間的內(nèi)存映射對(duì)32bit系統(tǒng)的影響

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

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

有些CPU沒有直接指定PCIe配置空間的地址范圍,需要讀取某個(gè)寄存器的值BaseAddr,這個(gè)值就說PCIe配置寄存器在內(nèi)存區(qū)域映射的基地址。訪問PCIe設(shè)備配置空間時(shí)候需要手動(dòng)計(jì)算訪問PCIe配置空間的地址。計(jì)算發(fā)放如下:

SIZE_PER_FUNC = 4K = 1000h

SIZE_PER_DEVICE = 4K * 8 = 8000h

SIZE_PER_BUS = 4K *8* 32 = 100000h

訪問總線號(hào)為busNo,設(shè)備號(hào)為DevNo,功能號(hào)為funcNo的offset寄存器的計(jì)算公式是:

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

訪問PCIe配置空間就需要通過總線號(hào)、設(shè)備號(hào)、功能號(hào)、寄存器偏移進(jìn)行轉(zhuǎn)換成內(nèi)存地址。轉(zhuǎn)換函數(shù)如圖 2所示。

圖 4

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10769

    瀏覽量

    210420
  • PCIe
    +關(guān)注

    關(guān)注

    15

    文章

    1174

    瀏覽量

    82246

原文標(biāo)題:從CPU角度理解PCIe

文章出處:【微信號(hào):SSDFans,微信公眾號(hào):SSDFans】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    需求的角度理解Linux系列:總線、設(shè)備和驅(qū)動(dòng)

    需求的角度理解Linux系列:總線、設(shè)備和驅(qū)動(dòng)》是一篇有關(guān)如何學(xué)習(xí)嵌入式Linux系統(tǒng)的方法論文章,也是需求的角度
    發(fā)表于 03-11 14:45

    背光原理的角度分析LCD與LED的區(qū)別

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

    數(shù)字化實(shí)現(xiàn)的角度理解PI環(huán)節(jié)

    本文數(shù)字化實(shí)現(xiàn)的角度理解PI(proportional integral, PI)環(huán)節(jié),為數(shù)字化實(shí)現(xiàn)PI打下基礎(chǔ)。...
    發(fā)表于 08-30 07:41

    EMC設(shè)計(jì)的角度解析無人機(jī)

    雄厚的飛控系統(tǒng)開發(fā)能力自然是必須的,強(qiáng)大的EMC設(shè)計(jì)能力也是至關(guān)重要的,本文結(jié)合實(shí)戰(zhàn)經(jīng)驗(yàn),EMC設(shè)計(jì)的角度解析無人機(jī)這一多系統(tǒng)集成的智能硬件產(chǎn)品!希望對(duì)大家有所幫助!
    的頭像 發(fā)表于 08-04 10:59 ?5668次閱讀
    <b class='flag-5'>從</b>EMC設(shè)計(jì)的<b class='flag-5'>角度</b><b class='flag-5'>來</b>解析無人機(jī)

    站在CPU角度看世界

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

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

    在AMD連接推出32核以及64核的EPYC霄龍?zhí)幚砥髦螅?b class='flag-5'>CPU性能就開始走向依多為勝的局面。在這點(diǎn)上Intel采用原生架構(gòu)的處理器沒法比了,主流桌面還是8核最多,至強(qiáng)處理器最多28核,不過Intel認(rèn)為CPU核心數(shù)并不是唯一指標(biāo),而是
    發(fā)表于 02-04 15:04 ?1032次閱讀

    如何理解現(xiàn)場總線?工業(yè)通信的角度看看資料下載

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

    圖解PCIE原理(軟件角度

    1 PCIE基本概念1.1 PCIE拓?fù)浼軜?gòu)圖1.2 PCIE Switch內(nèi)部結(jié)構(gòu)圖1.3 PCIE協(xié)議結(jié)構(gòu)圖2 PCIE枚舉原理2.1
    發(fā)表于 12-17 18:29 ?28次下載
    圖解<b class='flag-5'>PCIE</b>原理(<b class='flag-5'>從</b>軟件<b class='flag-5'>角度</b>)

    PCIe 5.0標(biāo)準(zhǔn)加速云中的數(shù)據(jù)移動(dòng)

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

    如何匯編代碼理解enum

    Rust enum 是一個(gè)非常強(qiáng)大的特性, 很多人好奇他內(nèi)部是如何實(shí)現(xiàn)的, 這里作者生成的匯編代碼幫你深入理解 Rust 的 enum. 一些關(guān)鍵結(jié)論:
    發(fā)表于 11-15 11:13 ?508次閱讀

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

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

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

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

    硬件軟件角度理解Gadget框架

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

    理解PCI和PCIE的關(guān)鍵

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

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

    隨著英特爾Alder Lake CPU的發(fā)布,以及AMD 7000 Ryzen CPU的即將發(fā)布,PCIe 5.0 硬件終于成為現(xiàn)實(shí)。但什么是 PCIe 5.0?
    的頭像 發(fā)表于 11-18 16:48 ?3138次閱讀
    什么是<b class='flag-5'>PCIe</b>?<b class='flag-5'>PCIe</b>有什么用途?<b class='flag-5'>PCIe</b> 5.0有何不同?