裝置通常會提供一組暫存器來用於控制裝置、讀寫裝置和獲取裝置狀態,即控制暫存器、資料暫存器和狀態暫存器。這些暫存器可能位於i/o 空間,也可能位於記憶體空間。當位於i/o 空間時,通常被稱為i/o埠,位於記憶體空間時,對應的記憶體空間被稱為i/o 記憶體。
1.i/o 埠
常用介面有inb,outb,inw,outw,inl,outl。其中,in代表從指定埠讀入資料,out代表向指定埠輸出資料。b代表byte,乙個位元組,w代表word,兩個位元組,l代表long,4個位元組。
其中,inb在x86下的實現為:
static inline u8 inb(u16 port)
2.i/o記憶體
在核心中訪問i/o 記憶體之前,需首先使用ioremap()函式將裝置所處的物理位址對映到虛擬位址。然後通過ioread8,iowrite8等函式讀寫io記憶體。其中read代表讀,write代表寫,8表示位寬。
ioremap()函式的實現原理:建立頁表對映到給定的實體地址,並返回對應的虛擬位址。
ioread8的實現比較簡單,因為已經分配了對應的虛擬位址,所以只要操作虛擬位址就好了。假設addr為對應的虛擬位址,可以通過*(const volatile *)addr來訪問或修改該i/o記憶體對應的值。
LINUX IO埠 IO記憶體釋疑
io埠是指介面電路中能夠被cpu直接訪問的暫存器,一般有資料埠 控制埠和狀態埠。每個連線到io匯流排的裝置都有自己的位址 集合 即埠,可以被對映到實體地址空間。io記憶體和io埠的主要區別是,io埠操作具有邊際效應,而記憶體則沒有 所以可以用多種方法進行優化,比如重新排序 告訴快取等 使用io記憶體...
Linux I O埠與I O記憶體
一 io埠訪問 1 直接使用io埠操作函式 1 在裝置開啟或驅動模組被載入時申請io埠區域,之後使用inb outb 等進行埠訪問,最後在裝置關閉或驅動被解除安裝時釋放io埠範圍。流程如下 2 struct resource request region unsigned long first,un...
I O埠和I O記憶體
每種外設都通過讀寫暫存器進行控制,大部分外設都有幾個暫存器,不管在記憶體位址空間還是在i o位址空間,這些暫存器的訪問位址是連續的。在硬體層,記憶體區域和io區域沒有概念上的區別 他們都通過向位址匯流排和控制匯流排傳送電平訊號進行訪問,再通過資料匯流排讀寫資料。儘管硬體暫存器和記憶體非常相似,但程式...