linux mmap驅動實現

2021-06-11 17:40:13 字數 745 閱讀 4340

在實現驅動程式的mmap函式時,要注意對映位址的轉換問題,見**。

定義乙個裝置結構體:

[cpp]view plain

copy

struct leedriver  

;  

這裡面這個memsize,最小都要是4096,因為記憶體對映是以頁為單位的。

在實現******_remap_mmap函式時,**如下

[cpp]view plain

copy

static

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

注意函式開頭的vma->vm_pgoff = ((u32)virt_to_phys(leedriverp->mem)) >> page_shift;

leedriverp->mem是個核心虛擬位址,應該通過virt_to_phys轉換成實體地址,再進行左移操作,就ok了。

之後定義一下vm_ops

[c-sharp]view plain

copy

static

struct vm_operations_struct ******_remap_vm_ops = ;  

並且在file_operations中新增.mmap=******_remap_mmap,整個過程就完成了

linux mmap驅動實現

在實現驅動程式的mmap函式時,要注意對映位址的轉換問題,見 定義乙個裝置結構體 這裡面這個memsize,最小都要是4096,因為記憶體對映是以頁為單位的。在實現 remap mmap函式時,如下 注意函式開頭的vma vm pgoff u32 virt to phys leedriverp me...

linux mmap 匯流排錯誤

用mmap對映兩個檔案,然後把乙個檔案的內容複製到另乙個檔案 採用的是memcpy函式 但是使用這個函式出現了匯流排錯誤 我把兩個對映的位址和長度都輸出來了 請高手給分析一下。輸出結果 file size 18 src 0xb7fa9000 dst 0xb7fa8000 匯流排錯誤 include ...

Linux mmap函式簡介

一 簡介 linux提供了記憶體對映函式mmap,它把檔案內容對映到一段記憶體上 準確說是虛擬記憶體上 通過對這段記憶體的讀取和修改,實現對檔案的讀取和修改,先來看一下mmap的函式宣告 原型 void mmap void addr,size t length,int prot,int flags,...