io埠是指介面電路中能夠被cpu直接訪問的暫存器,一般有資料埠、控制埠和狀態埠。每個連線到io匯流排的裝置都有自己的位址(集合),即埠,可以被對映到實體地址空間。
io記憶體和io埠的主要區別是,io埠操作具有邊際效應,而記憶體則沒有(所以可以用多種方法進行優化,比如重新排序、告訴快取等)。
使用io記憶體前要先申請request_mem_region,然後ioremap對映;使用io port前要用request_region請求。linux維護全域性變數ioport_resource和iomem_resource,每次request的時候從其中分配。pci裝置所需的記憶體基址在啟動的時候已經有bios設定,所以在driver中需request_mem_region(base,length)宣告。
request_region和request_mem_region僅僅申請資源。io region為0~64k,mem為0~4g。申請後僅該驅動程式可以使用該資源。
request_mem_region 函式返回resource指標,ioremap函式將該物理位址對映成核心虛擬位址(內部用vm_struct組織,跟vmalloc類似)。
ioport_map用於將io port對映成核心虛擬位址。
Linux I O埠與I O記憶體
一 io埠訪問 1 直接使用io埠操作函式 1 在裝置開啟或驅動模組被載入時申請io埠區域,之後使用inb outb 等進行埠訪問,最後在裝置關閉或驅動被解除安裝時釋放io埠範圍。流程如下 2 struct resource request region unsigned long first,un...
LinuxI O埠和I O記憶體的訪問介面
裝置通常會提供一組暫存器來用於控制裝置 讀寫裝置和獲取裝置狀態,即控制暫存器 資料暫存器和狀態暫存器。這些暫存器可能位於i o 空間,也可能位於記憶體空間。當位於i o 空間時,通常被稱為i o埠,位於記憶體空間時,對應的記憶體空間被稱為i o 記憶體。1 i o 埠 常用介面有inb,outb,i...
I O埠和I O記憶體
每種外設都通過讀寫暫存器進行控制,大部分外設都有幾個暫存器,不管在記憶體位址空間還是在i o位址空間,這些暫存器的訪問位址是連續的。在硬體層,記憶體區域和io區域沒有概念上的區別 他們都通過向位址匯流排和控制匯流排傳送電平訊號進行訪問,再通過資料匯流排讀寫資料。儘管硬體暫存器和記憶體非常相似,但程式...