浅谈内存映射I/O(MMIO)与端口映射I/O(PMIO)的区别
最近在看NVMeDirect和SPDK的源碼,覺(jué)得有必要梳理一下MMIO和PMIO的區(qū)別。關(guān)于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.在計(jì)算機(jī)中,內(nèi)存映射I/O(MMIO)和端口映射I/O(PMIO)是兩種互為補(bǔ)充的I/O方法,在CPU和外部設(shè)備之間。另一種方法是使用專用的I/O處理器,通常為大型機(jī)上的通道,它們執(zhí)行自己特有的指令。
1. MMIO
Memory-mapped I/O (MMIO), 內(nèi)存映射IO。 先上圖,圖片來(lái)源戳這里
從上圖中我們可以看到,在MMIO中,內(nèi)存和I/O設(shè)備共享同一個(gè)地址空間。 MMIO是應(yīng)用得最為廣泛的一種IO方法,它使用相同的地址總線來(lái)處理內(nèi)存和I/O設(shè)備,I/O設(shè)備的內(nèi)存和寄存器被映射到與之相關(guān)聯(lián)的地址。當(dāng)CPU訪問(wèn)某個(gè)內(nèi)存地址時(shí),它可能是物理內(nèi)存,也可以是某個(gè)I/O設(shè)備的內(nèi)存。因此,用于訪問(wèn)內(nèi)存的CPU指令也可來(lái)訪問(wèn)I/O設(shè)備。每個(gè)I/O設(shè)備監(jiān)視CPU的地址總線,一旦CPU訪問(wèn)分配給它的地址,它就做出響應(yīng),將數(shù)據(jù)總線連接到需要訪問(wèn)的設(shè)備硬件寄存器。為了容納I/O設(shè)備,CPU必須預(yù)留給I/O一個(gè)地址區(qū)域,該地址區(qū)域不能給物理內(nèi)存使用。
2. PMIO
Port-mapped I/O (PMIO),端口映射IO,又叫做被隔離的I/O(isolated I/O)。還是先上圖,圖片來(lái)源戳這里
從上圖中我們可以看到,在PMIO中,內(nèi)存和I/O設(shè)備有各自的地址空間。 端口映射I/O通常使用一種特殊的CPU指令,專門執(zhí)行I/O操作。在Intel的微處理器中,使用的指令是IN和OUT。這些指令可以讀/寫(xiě)1,2,4個(gè)字節(jié)(例如:outb, outw, outl)從/到IO設(shè)備上。I/O設(shè)備有一個(gè)與內(nèi)存不同的地址空間,為了實(shí)現(xiàn)地址空間的隔離,要么在CPU物理接口上增加一個(gè)I/O引腳,要么增加一條專用的I/O總線。由于I/O地址空間與內(nèi)存地址空間是隔離的,所以有時(shí)將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設(shè)備和內(nèi)存共享同一個(gè)地址總線,因此它們的地址空間是相同的; 而在PMIO中,IO設(shè)備和內(nèi)存的地址空間是隔離的。
- 在MMIO中,無(wú)論是訪問(wèn)內(nèi)存還是訪問(wèn)IO設(shè)備,都使用相同的指令; 而在PMIO中,CPU使用特殊的指令訪問(wèn)IO設(shè)備,在Intel微處理器中,使用的指令是IN和OUT。
注意: 內(nèi)存映射(MMIO和PMIO)作為一種CPU對(duì)I/O設(shè)備(CPU-to-device)的通信方法,并不影響DMA(直接內(nèi)存訪問(wèn)), 因?yàn)镈MA是一種繞過(guò)CPU的內(nèi)存對(duì)設(shè)備(memory-to-device)的通信方法。
4. 如何實(shí)現(xiàn)MMIO?
在Linux中, 內(nèi)核使用ioremap()將IO設(shè)備的物理內(nèi)存地址映射到內(nèi)核空間的虛擬地址上; 用戶空間程序使用mmap(2)系統(tǒng)調(diào)用將IO設(shè)備的物理內(nèi)存地址映射到用戶空間的虛擬內(nèi)存地址上,一旦映射完成,用戶空間的一段內(nèi)存就與IO設(shè)備的內(nèi)存關(guān)聯(lián)起來(lái),當(dāng)用戶訪問(wèn)用戶空間的這段內(nèi)存地址范圍時(shí),實(shí)際上會(huì)轉(zhuǎn)化為對(duì)IO設(shè)備的訪問(wèn)。
參考資料
- 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?
轉(zhuǎn)載于:https://www.cnblogs.com/idorax/p/7691334.html
總結(jié)
以上是生活随笔為你收集整理的浅谈内存映射I/O(MMIO)与端口映射I/O(PMIO)的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 安装Python 3.6 在Ubuntu
- 下一篇: 可持续字典树 Perfect Secur