Linux對I/O連接埠資源的管理(5)

來源:互聯網
上載者:User

3.6 訪問I/O記憶體資源

  儘管I/O連接埠空間曾一度在x86平台上被廣泛使用,但是由於它非常小,因此大多數現代匯流排的裝置都以記憶體映射方式(Memory-mapped)來
映射它的I/O連接埠(指I/O寄存器)和外設記憶體。基於記憶體映射方式的I/O連接埠(指I/O寄存器)和外設記憶體可以通稱為“I/O記憶體”資源(I/O
Memory)。因為這兩者在硬體實現上的差異對於軟體來說是完全透明的,所以驅動程式開發人員可以將記憶體映射方式的I/O連接埠和外設記憶體統一看作是“I
/O記憶體”資源。

  從前幾節的闡述我們知道,I/O記憶體資源是在CPU的單一記憶體物理地址空間內進行編址的,也即它和系統RAM同處在一個物理地址空間內。因此通過CPU的訪內指令就可以訪問I/O記憶體資源。

  一般來說,在系統運行時,外設的I/O記憶體資源的物理地址是已知的,這可以通過系統韌體(如BIOS)在啟動時分配得到,或者通過裝置的硬連線
(hardwired)得到。比如,PCI卡的I/O記憶體資源的物理地址就是在系統啟動時由PCI
BIOS分配並寫到PCI卡的配置空間中的BAR中的。而ISA卡的I/O記憶體資源的物理地址則是通過裝置硬連線映射到640KB-1MB範圍之內的。但
是CPU通常並沒有為這些已知的外設I/O記憶體資源的物理地址預定義虛擬位址範圍,因為它們是在系統啟動後才已知的(某種意義上講是動態),所以驅動程
序並不能直接通過物理地址訪問I/O記憶體資源,而必須將它們映射到核心虛地址空間內(通過頁表),然後才能根據映射所得到的核心虛位址範圍,通過訪內指令
訪問這些I/O記憶體資源。

  3.6.1 映射I/O記憶體資源

  linux在io.h標頭檔中聲明了函數ioremap(),用來將I/O記憶體資源的物理地址映射到核心虛地址空間(3GB-4GB)中,如下:

void * ioremap(unsigned long phys_addr, unsigned long size,
unsigned long flags);
void iounmap(void * addr);

  函數用於取消ioremap()所做的映射,參數addr是指向核心虛地址的指標。這兩個函數都是實現在mm/ioremap.c檔案中。具體實現可參考《情景分析》一書。

  3.6.2 讀寫I/O記憶體資源

  在將I/O記憶體資源的物理地址映射成核心虛地址後,理論上講我們就可以象讀寫RAM那樣直接讀寫I/O記憶體資源了。但是,由於在某些平台上,對I/O
記憶體和系統記憶體有不同的訪問處理,因此為了確保跨平台的相容性,linux實現了一系列讀寫I/O記憶體資源的函數,這些函數在不同的平台上有不同的實現。
但在x86平台上,讀寫I/O記憶體與讀寫RAM無任何差別。如下所示(include/asm-i386/io.h):

#define readb(addr) (*(volatile unsigned char *)
__io_virt(addr))
#define readw(addr) (*(volatile unsigned short *)
__io_virt(addr))
#define readl(addr) (*(volatile unsigned int *)
__io_virt(addr))

#define writeb(b,addr) (*(volatile unsigned char *) __io_virt(addr)
= (b))
#define writew(b,addr) (*(volatile unsigned short *)
__io_virt(addr) = (b))
#define writel(b,addr) (*(volatile unsigned int *) __io_virt(addr)
= (b))

#define memset_io(a,b,c) memset(__io_virt(a),(b),(c))
#define memcpy_fromio(a,b,c) memcpy((a),__io_virt(b),(c))
#define memcpy_toio(a,b,c) memcpy(__io_virt(a),(b),(c))

  上述定義中的宏__io_virt()僅僅檢查虛地址addr是否是核心空間中的虛地址。該宏在核心2.4.0中的實現是臨時性的。具體的實現函數在arch/i386/lib/Iodebug.c檔案。

  顯然,在x86平台上訪問I/O記憶體資源與訪問系統主存RAM是無差別的。但是為了保證驅動程式的跨平台的可移植性,我們應該使用上面的函數來訪問I/O記憶體資源,而不應該通過指向核心虛地址的指標來訪問。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.