mpu 配置内存空间_PCIE的内存地址空间、I/O地址空间和配置地址空间
pci設(shè)備與其它接口的設(shè)備(如i2c設(shè)備)最大的不同是存在內(nèi)存地址空間和配置地址空間
首先區(qū)分一下IO空間和內(nèi)存空間
cpu會訪問的設(shè)備一般有內(nèi)存和外設(shè)寄存器,如下圖所示。x86架構(gòu)采用獨(dú)立編址將內(nèi)存操作與外設(shè)IO操作分開了才有了內(nèi)存空間和IO空間的區(qū)分,x86平臺cpu內(nèi)部對內(nèi)存和外設(shè)寄存器訪問的指令也是不同的。arm等其他平臺都采用統(tǒng)一編址,不區(qū)分內(nèi)存和外設(shè)的訪問。
IO空間:訪問外部設(shè)備寄存器的地址區(qū)域,x86平臺為64k
內(nèi)存空間:訪問內(nèi)存的地址空間,32位平臺為4G
pci設(shè)備的內(nèi)存空間是怎么回事呢?
常見的設(shè)備都只提供寄存器供cpu訪問,對于低速外設(shè)這樣的模式是足夠的。但是對于需要大量、高速數(shù)據(jù)交互的外設(shè)就需要引入外設(shè)內(nèi)存空間了。在網(wǎng)卡、顯卡這樣的pci高速外設(shè)中不僅有寄存器還有了一塊內(nèi)存。
配置空間和IO空間不都是外設(shè)的寄存器嗎,它們有什么區(qū)別呢?
IO空間就和i2c設(shè)備的寄存器空間一樣,用來獲取外設(shè)狀態(tài)、配置外設(shè)。
配置空間是一段特殊的IO空間,它的作用是為外設(shè)內(nèi)存空間、IO空間分配物理地址基地址,即配置BAR(Base Address Registers)。這里類似linux對虛擬地址的映射了,但現(xiàn)在分配的卻是物理地址。因?yàn)橥庠O(shè)內(nèi)部的內(nèi)存地址都是從0開始編址的,當(dāng)pci控制器接入多個pci設(shè)備時如何確保pci上的內(nèi)存地址不混亂呢,這就是配置空間的一個作用,配置空間有固定的結(jié)構(gòu),在pci總線掃描設(shè)備時配置好BAR,這樣各個pci設(shè)備的內(nèi)存空間和IO空間才可訪問,而不至于和其他設(shè)備物理地址沖突。
在pci總線之前的ISA總線是使用跳線帽來分配外設(shè)的物理地址的,每插入一個新設(shè)備都要改變跳線帽以分配物理地址,這是十分麻煩且易錯的,但這樣的方式似乎我們更容易理解。能夠分配自己總線上掛載設(shè)備的物理地址這也是PCI總線相較于I2C、SPI等低速總線一個最大的特色。
為什么只有pci設(shè)備可以有外設(shè)內(nèi)存空間,i2c、usb等設(shè)備沒有?
說起外設(shè)上可以有設(shè)備專屬的內(nèi)存時,指的都是pci設(shè)備。我們更為常用的i2c、usb、spi、uart設(shè)備怎么都沒有這樣的說法呢?
這是因?yàn)樵赾pu內(nèi)部架構(gòu)中會有系統(tǒng)總線和外設(shè)總線。系統(tǒng)總線一般是連接cpu與主存的,外設(shè)總線是cpu連接外部設(shè)備的。在有pci控制器的cpu架構(gòu)中pci總線就取代了cpu內(nèi)部的外設(shè)總線的位置,所有外設(shè)都是掛在不同層級的pci橋上的,再由pci轉(zhuǎn)成了usb、i2c、uart等接口。因此pci設(shè)備相當(dāng)于直接連在cpu總線上了,這樣pci設(shè)備中就可以擁有cpu總線上的物理地址,和主存共享cpu的物理地址空間,當(dāng)然就可以存在外設(shè)內(nèi)存(相當(dāng)于pci設(shè)備與其他外設(shè)的控制器在一個層級上)。i2c等外設(shè)只能通過i2c控制器間接的與cpu通信,pci設(shè)備擁有cpu的物理地址,可以直接與cpu對話。
可簡要理解為pci總線類似cpu內(nèi)部總線的延伸,i2c、usb等都僅僅是純粹的外設(shè)總線,社會層級不同。
總結(jié)
以上是生活随笔為你收集整理的mpu 配置内存空间_PCIE的内存地址空间、I/O地址空间和配置地址空间的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux卸载mysql数据库命令(li
- 下一篇: 苹果安装安卓的软件(苹果安装安卓)