1. 程式人生 > >I/O埠和I/O記憶體的訪問

I/O埠和I/O記憶體的訪問

I/O埠訪問的一種途徑是直接使用I/O埠操作函式;另一種途徑是將I/O埠對映到記憶體進行訪問。

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

mmap()實現這樣一個對映過程:它將使用者空間的一段記憶體和裝置記憶體關聯,當用戶訪問使用者空間上的這段記憶體時,實際上會轉化為對裝置的訪問,從而使得使用者空間能訪問裝置的實體地址。mmap()必須以PAGE_SIZE為單位進行對映。

int   (*mmap)(struct file * ,struct    vm_area_struct *);  //file_operations中的mmap()

VMA是用來描述程序使用者空間的資料結構。程序的使用者空間的虛擬記憶體空間可以不是連續的,即可以是一段一段的。每一段的虛擬記憶體空間都由一個VMA結構來描述。當一個程式被載入到記憶體中執行時,OS會為這個程序的程式碼段資料段以及Stack段都分配好一段虛擬記憶體空間,每一端空間都有一個VMA來表示。