X86 IO端口和MMIO


X86 IO端口和MMIO

I/O作為CPU和外設交流的一個渠道,主要分為兩種,一種是Port I/O,一種是MMIO(Memory mapping I/O)。
前者就是我們常說的I/O端口,它實際上的應該被稱為I/O地址空間。
對於x86架構來說,通過IN/OUT指令訪問。PC架構一共有65536個8bit的I/O端口,組成64KI/O地址空間,編號從0~0xFFFF。連續兩個8bit的端口可以組成一個16bit的端口,連續4個組成一個32bit的端口。I/O地址空間和CPU的物理地址空間是兩個不同的概念,例如I/O地址空間為64K,一個32bit的CPU物理地址空間是4G。

MMIO占用CPU的物理地址空間,對它的訪問可以使用CPU訪問內存的指令進行。一個形象的比喻是把文件用mmap()后,可以像訪問內存一樣訪問文件、同樣,MMIO是用訪問內存一樣的方式訪問I/O資源,如設備上的內存。MMIO不能被cache,原因以前很多帖子論述過,就不多說了(有特殊情況,如VGA)。

Port I/O和MMIO的主要區別在於1)前者不占用CPU的物理地址空間,后者占有(這是對x86架構說的,一些架構,如IA64,port I/O占用物理地址空間)。2)前者是順序訪問。也就是說在一條I/O指令完成前,下一條指令不會執行。例如通過Port I/O對設備發起了操作,造成了設備寄存器狀態變化,這個變化在下一條指令執行前生效。uncache的MMIO通過uncahce memory的特性保證順序性。3)使用方式不同

由於port I/O有獨立的64KI/O地址空間,但CPU的地址線只有一套,所以必須區分地址屬於物理地址空間還是I/O地址空間。早期的CPU有一個M/I針腳來表示當前地址的類型,后來似乎改了。剛才查了一下,叫request command line,沒搞懂,覺得還是一個針腳。

IBM PC架構規定了一些固定的I/O端口,ISA設備通常也有固定的I/O端口,這些可以通過ICH(南橋)的規范查到。PCI設備的I/O端口和MMIO基地址通過設備的PCI configure space報告給操作系統,這些內容以前的帖子都很多,可以查閱一下。

IOMMU架構
IOMMU是對於設備發起DMA操作來說的,你可以理解成設備用於做DMA的地址是一個虛擬地址(這個虛擬地址和我們平時說的那個不一樣,是特指設備DMA用的地址,相對真實的物理地址而言。在沒有IOMMU的情況下用的是物理地址)。
AMD,Intel,Sun,IBM都推出了自己的IOMMU技術,PCI-SIG協會也進行了相關的工作,


免責聲明!

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



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