浅谈内存映射I/O(MMIO)与端口映射I/O(PMIO)的区别
最近在看NVMeDirect和SPDK的源碼,覺得有必要梳理一下MMIO和PMIO的區別。關于MMIO和PMIO,維基百科上是這么講滴,
Memory-mapped I/O (MMIO) and port-mapped I/O (PMIO) (which is also called isolated I/O) are two complementary methods of performing input/output (I/O) between the central processing unit (CPU) and peripheral devices in a computer. An alternative approach is using dedicated I/O processors, commonly known as channels on mainframe computers, which execute their own instructions.在計算機中,內存映射I/O(MMIO)和端口映射I/O(PMIO)是兩種互為補充的I/O方法,在CPU和外部設備之間。另一種方法是使用專用的I/O處理器,通常為大型機上的通道,它們執行自己特有的指令。
1. MMIO
Memory-mapped I/O (MMIO), 內存映射IO。 先上圖,圖片來源戳這里
從上圖中我們可以看到,在MMIO中,內存和I/O設備共享同一個地址空間。 MMIO是應用得最為廣泛的一種IO方法,它使用相同的地址總線來處理內存和I/O設備,I/O設備的內存和寄存器被映射到與之相關聯的地址。當CPU訪問某個內存地址時,它可能是物理內存,也可以是某個I/O設備的內存。因此,用于訪問內存的CPU指令也可來訪問I/O設備。每個I/O設備監視CPU的地址總線,一旦CPU訪問分配給它的地址,它就做出響應,將數據總線連接到需要訪問的設備硬件寄存器。為了容納I/O設備,CPU必須預留給I/O一個地址區域,該地址區域不能給物理內存使用。
2. PMIO
Port-mapped I/O (PMIO),端口映射IO,又叫做被隔離的I/O(isolated I/O)。還是先上圖,圖片來源戳這里
從上圖中我們可以看到,在PMIO中,內存和I/O設備有各自的地址空間。 端口映射I/O通常使用一種特殊的CPU指令,專門執行I/O操作。在Intel的微處理器中,使用的指令是IN和OUT。這些指令可以讀/寫1,2,4個字節(例如:outb, outw, outl)從/到IO設備上。I/O設備有一個與內存不同的地址空間,為了實現地址空間的隔離,要么在CPU物理接口上增加一個I/O引腳,要么增加一條專用的I/O總線。由于I/O地址空間與內存地址空間是隔離的,所以有時將PMIO稱為被隔離的IO(Isolated I/O)。
3. MMIO v.s. PMIO
| ? | MMIO | PMIO |
| 1 | Same address bus to address memory and I/O devices | Different address spaces for memory and I/O devices |
| 2 | Access to the I/O devices using regular instructions | Uses a special class of CPU instructions to access I/O devices, Intel x86 microprocessors - IN and OUT instructions |
- 在MMIO中,IO設備和內存共享同一個地址總線,因此它們的地址空間是相同的; 而在PMIO中,IO設備和內存的地址空間是隔離的。
- 在MMIO中,無論是訪問內存還是訪問IO設備,都使用相同的指令; 而在PMIO中,CPU使用特殊的指令訪問IO設備,在Intel微處理器中,使用的指令是IN和OUT。
注意: 內存映射(MMIO和PMIO)作為一種CPU對I/O設備(CPU-to-device)的通信方法,并不影響DMA(直接內存訪問), 因為DMA是一種繞過CPU的內存對設備(memory-to-device)的通信方法。
4. 如何實現MMIO?
在Linux中, 內核使用ioremap()將IO設備的物理內存地址映射到內核空間的虛擬地址上; 用戶空間程序使用mmap(2)系統調用將IO設備的物理內存地址映射到用戶空間的虛擬內存地址上,一旦映射完成,用戶空間的一段內存就與IO設備的內存關聯起來,當用戶訪問用戶空間的這段內存地址范圍時,實際上會轉化為對IO設備的訪問。
參考資料
- Memory-mapped I/O
- Programmed I/O: isolated vs. memory-mapped
- Memory-mapped I/O
- What is the difference between an I/O mapped I/O, and a memory mapped I/O in the interfacing of the microprocessor?
- Difference between port mapped and memory mapped access?
轉載于:https://www.cnblogs.com/idorax/p/7691334.html
總結
以上是生活随笔為你收集整理的浅谈内存映射I/O(MMIO)与端口映射I/O(PMIO)的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装Python 3.6 在Ubuntu
- 下一篇: python之路_自定义属性、json及