Linux I O埠與I O記憶體

2021-06-19 11:03:43 字數 1434 閱讀 6887

一、io埠訪問

1、直接使用io埠操作函式

1)在裝置開啟或驅動模組被載入時申請io埠區域,之後使用inb(),outb()等進行埠訪問,最後在裝置關閉或驅動被解除安裝時釋放io埠範圍。流程如下:

2)struct resource *request_region(unsigned long first, unsigned long n, const char *name);

如果這段i/o埠沒有被占用,在我們的驅動程式中就可以使用它。在使用之前,必須向系統登記,以防止被其他程式占用。登記後,在/proc/ioports檔案中可以  看到你登記的io口。

引數1:io埠的基位址。

引數2:io埠占用的範圍。

引數3:使用這段io位址的裝置名。

在對i/o口登記後,就可以放心地用inb(), outb()之類的函來訪問了。

request_region()用於核心為驅動「分配」埠,這裡分配的意思是,記錄該埠已經被某個程序使用,要是其它程序試圖訪問它,就會產生「忙」錯誤。所以目的在於實現資源的互斥訪問。

反之, 如果乙個資源只被乙個程序訪問,不會導致資源的爭用,這時request_region()是可選的。

3)void release_region(unsigned long from, unsigned long num)

這個函式用來釋放一塊輸入輸出區域。

2、將io埠重新對映

1)使其看起來像i/o記憶體,在裝置開啟或驅動模組被載入時,申請io埠區域並使用ioport_map()對映到記憶體,之後使用io記憶體的函式進行埠訪問,最後,在裝置關閉或驅動模組被解除安裝時釋放io埠並釋放對映,流程如下:

2)void *ioport_unmap(void *addr);

ioport_map僅僅是將port加上pio_offset(64k),而ioport_unmap則什麼都不做。這樣portio的64k空間就被對映到虛擬位址的64k~128k之間,而ioremap返回的虛擬位址則肯定在3g之上。這樣portio和mmio的虛擬位址就被統一起來。

二、io記憶體訪問

1)首先呼叫request_mem_region()申請資源,接著將暫存器位址通過ioremap()對映到核心空間的虛擬位址,之後就可以linux裝置訪問程式設計介面訪問這些虛擬位址了,訪問完成後,使用iounmap()對申請的虛擬位址進行釋放,並釋放release_mem_region()申請的io記憶體資源。流程如下:

2)void *ioremap(unsigned long phys_addr,unsigned long size);

ioremap函式用來將i/o資源的物理位址對映到核心虛擬位址空間(3g-4g),但是由ioremap返回的位址不應直接引用,而應該使用核心提供的ioread,iowrite函式

LINUX IO埠 IO記憶體釋疑

io埠是指介面電路中能夠被cpu直接訪問的暫存器,一般有資料埠 控制埠和狀態埠。每個連線到io匯流排的裝置都有自己的位址 集合 即埠,可以被對映到實體地址空間。io記憶體和io埠的主要區別是,io埠操作具有邊際效應,而記憶體則沒有 所以可以用多種方法進行優化,比如重新排序 告訴快取等 使用io記憶體...

LinuxI O埠和I O記憶體的訪問介面

裝置通常會提供一組暫存器來用於控制裝置 讀寫裝置和獲取裝置狀態,即控制暫存器 資料暫存器和狀態暫存器。這些暫存器可能位於i o 空間,也可能位於記憶體空間。當位於i o 空間時,通常被稱為i o埠,位於記憶體空間時,對應的記憶體空間被稱為i o 記憶體。1 i o 埠 常用介面有inb,outb,i...

I O埠與I O記憶體

埠的概念 裝置通過系統匯流排上的介面與cpu相連,介面電路中含有多種暫存器,cpu向裝置讀寫資料實際上是向介面上的暫存器讀寫資料,這些暫存器稱為i o埠。乙個介面通常包含控制埠,資料埠,狀態埠。對於x86平台,實體地址就是匯流排位址。linux中,程序中的4gb虛擬記憶體分為使用者空間和核心空間,使...