1. 程式人生 > >淺談內存映射I/O(MMIO)與端口映射I/O(PMIO)的區別

淺談內存映射I/O(MMIO)與端口映射I/O(PMIO)的區別

processor order 不同 隔離 memory ref lang ng- same

最近在看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設備的內存地址映射到用戶態。

參考資料

  • 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?

淺談內存映射I/O(MMIO)與端口映射I/O(PMIO)的區別