remap pfn range使用詳解

2021-06-18 13:50:41 字數 918 閱讀 3976

remap_pfn_range和io_remap_pfn_range負責為一段實體地址建立新的頁表,他們的原型如下

int remap_pfn_range(struct vm_area_struct *vma, unsigned long virt_addr, unsigned long pfn, unsigned long size, pgprot_t prot);

int io_remap_pfn_range(struct vm_area_struct *vma, unsigned long virt_addr, unsigned long pfn, unsigned long size, pgprot_t prot);

函式的返回值是0或者是個負的錯誤碼。

第乙個函式是在pfn指向實際的ram的時候使用,後面乙個函式實在phy_addr指向i/o記憶體時候使用,在實際使用中,除了sparc外,對每個體系架構這兩個函式都是等價的。大多數情況下使用第乙個函式,對於有移植性的要求的驅動程式,要使用與特定情形相符的remap_pfn_range函式變種。

該函式的功能是建立頁表。其中引數vma是核心根據使用者的請求自己填寫的,而引數addr表示記憶體對映開始處的虛擬位址,因此,該函式為addr~addr+size之間的虛擬位址構造頁表。

另外,pfn(page fram number)是虛擬位址應該對映到的實體地址的頁面號,實際上就是實體地址右移page_shift位。如果page_shift為4kb,則page_shift為12,因為page_shift等於1<

乙個簡單的實現

如果驅動程式要將裝置記憶體線性的對映到使用者空間,基本上自需要呼叫第乙個函式即可。

static int ******_remap_mmap(struct file *file, struct vm_area_struct *vma)

}

使用GraphEdit使用

1 註冊元件。其實乙個filter就是乙個com元件,所以使用之前需要註冊,可以有兩種方法對元件進行註冊。1.直接使用命令。命令列下輸入 regsvr32 hqtlystd.ax 編譯之後你會在工程目錄下的debug中找到hqtlystd.ax,這個就是要用的filter 即可註冊成功。2.vc6....

MySQL使用學習使用 mysql學習使用

1 mysql學習 1 安裝 ubuntu下直接安裝 apt get install mysql server 2 檢查伺服器是否啟動 sudo netstat tap grep mysql,如果啟動成功,出現以下資訊 tcp00localhost.localdomain mysql listen ...

學習使用CSDN markdown使用

建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...