PCIE的內存地址空間、I/O地址空間和配置地址空間


pci設備與其它接口的設備(如i2c設備)最大的不同是存在內存地址空間和配置地址空間

首先區分一下IO空間和內存空間
cpu會訪問的設備一般有內存和外設寄存器,如下圖所示。x86架構采用獨立編址將內存操作與外設IO操作分開了才有了內存空間和IO空間的區分,x86平台cpu內部對內存和外設寄存器訪問的指令也是不同的。arm等其他平台都采用統一編址,不區分內存和外設的訪問。

IO空間:訪問外部設備寄存器的地址區域,x86平台為64k

內存空間:訪問內存的地址空間,32位平台為4G

 

 

 

 pci設備的內存空間是怎么回事呢?

常見的設備都只提供寄存器供cpu訪問,對於低速外設這樣的模式是足夠的。但是對於需要大量、高速數據交互的外設就需要引入外設內存空間了。在網卡、顯卡這樣的pci高速外設中不僅有寄存器還有了一塊內存

配置空間和IO空間不都是外設的寄存器嗎,它們有什么區別呢?

IO空間就和i2c設備的寄存器空間一樣,用來獲取外設狀態、配置外設。
配置空間是一段特殊的IO空間,它的作用是為外設內存空間、IO空間分配物理地址基地址,即配置BAR(Base Address Registers)。這里類似linux對虛擬地址的映射了,但現在分配的卻是物理地址。因為外設內部的內存地址都是從0開始編址的,當pci控制器接入多個pci設備時如何確保pci上的內存地址不混亂呢,這就是配置空間的一個作用,配置空間有固定的結構,在pci總線掃描設備時配置好BAR,這樣各個pci設備的內存空間和IO空間才可訪問,而不至於和其他設備物理地址沖突。
在pci總線之前的ISA總線是使用跳線帽來分配外設的物理地址的,每插入一個新設備都要改變跳線帽以分配物理地址,這是十分麻煩且易錯的,但這樣的方式似乎我們更容易理解。能夠分配自己總線上掛載設備的物理地址這也是PCI總線相較於I2C、SPI等低速總線一個最大的特色。

為什么只有pci設備可以有外設內存空間,i2c、usb等設備沒有
說起外設上可以有設備專屬的內存時,指的都是pci設備。我們更為常用的i2c、usb、spi、uart設備怎么都沒有這樣的說法呢?
這是因為在cpu內部架構中會有系統總線和外設總線。系統總線一般是連接cpu與主存的,外設總線是cpu連接外部設備的。在有pci控制器的cpu架構中pci總線就取代了cpu內部的外設總線的位置,所有外設都是掛在不同層級的pci橋上的,再由pci轉成了usb、i2c、uart等接口。因此pci設備相當於直接連在cpu總線上了,這樣pci設備中就可以擁有cpu總線上的物理地址,和主存共享cpu的物理地址空間,當然就可以存在外設內存(相當於pci設備與其他外設的控制器在一個層級上)。i2c等外設只能通過i2c控制器間接的與cpu通信,pci設備擁有cpu的物理地址,可以直接與cpu對話。
可簡要理解為pci總線類似cpu內部總線的延伸,i2c、usb等都僅僅是純粹的外設總線,社會層級不同。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM