Mmap 實現原理和應用(流程)

2021-07-15 16:50:55 字數 2098 閱讀 3449

在除錯完達文西的視屏輸入後記錄一下除錯心得。重點還是再次放在系統呼叫mmap後的記憶體分配上。做了乙個mmap系統呼叫的筆記以及記錄以備後用。大致介紹了linux中對於mmap的應用以及後續產生缺頁異常處理的乙個流程。

由於之前的除錯中一直對於vma的區域選取產生疑問,不知道vma到底是何許人也,這次有機會就直接mmap除錯了。一下內容都通過log資訊驗證。

系統呼叫 mmap後

syscall_define6(mmap_pgoff,unsigned long, addr, unsigned long, len,

unsignedlong, prot, unsigned long, flags,

unsignedlong, fd, unsigned long, pgoff)

unsigned long do_mmap_pgoff(structfile *file, unsigned long addr,

unsignedlong len, unsigned long prot,

unsignedlong flags, unsigned long pgoff)

unsigned long mmap_region(struct file*file, unsigned long addr,

unsignedlong len, unsigned long flags,

unsignedint vm_flags, unsigned long pgoff)

通過mmap_region最後呼叫驅動中填寫的mmap函式,

static struct v4l2_file_operations omap34xxcam_fops = {

.owner                    = this_module,

.unlocked_ioctl     = video_ioctl2,

.poll                         =omap34xxcam_poll,

.mmap                    = omap34xxcam_mmap,

.open                      = omap34xxcam_open,

.release                  = omap34xxcam_release,

mmap函式最終是要解決什麼?解決物理以及虛擬記憶體的分配,和對應關係。在函式mmap_region在vm_area_cachep 中分配乙個vma。

vma = kmem_cache_zalloc(vm_area_cachep, gfp_kernel);

這個vma就是將來在驅動中使用的空間。既然是空間,那麼有起點和終點。起點就是addr,終點就是addr+len。

vma->vm_start = addr;

vma->vm_end = addr + len;

這個位址範圍落在使用者空間 0g-3g [ 0x 0000 0000 – 0xc000 0000]。

現在有了vma,有了位址以及空間那麼怎麼落實最後的記憶體上,這是在函式

static int __kprobes

do_page_fault(unsigned long addr, unsigned int fsr, structpt_regs *regs)中完成。

static int __kprobes

__do_page_fault(structmm_struct *mm, unsigned long addr, unsigned int fsr,

structtask_struct *tsk)

在函式__do_page_fault中直接使用要訪問的虛擬位址作為引數在mm_struct中去尋找相應的vma。這個vma就是系統呼叫mmap中分配以及初始化的。現在真的要用到vma的起始位址了。但是mmap系統呼叫中沒有把vma所描述的記憶體區域和物理記憶體聯絡起來。所謂聯絡就是建立相關的頁表及頁表項。當程式真正去訪問乙個已經存在但是沒有建立物理記憶體的位址時,缺頁異常發生。

__do_page_fault函式中vma = find_vma(mm,addr);找到包含有該位址的vma。然後呼叫handle_mm_fault以及handle_pte_fault分配建立頁表。最終當缺頁異常處理完成後,以上mmap中申請的記憶體區域就變得有效並且可以訪問了。

謝謝。

Mmap的實現原理和應用

1,普通的read write和mmap後的對映區域的讀寫到底有什麼區別。2,為什麼有時候會選擇mmap而放棄普通的read write。圍繞著這兩個問題分析一下,其實在考慮這些問題的同時不免和其他的很多系統機制產生互動。雖然是講解mmap,但是很多知識還是為了闡明問題做必要的鋪墊。這些知識也正是l...

Mmap的實現原理和應用

1,普通的read write和mmap後的對映區域的讀寫到底有什麼區別。2,為什麼有時候會選擇mmap而放棄普通的read write。圍繞著這兩個問題分析一下,其實在考慮這些問題的同時不免和其他的很多系統機制產生互動。雖然是講解mmap,但是很多知識還是為了闡明問題做必要的鋪墊。這些知識也正是l...

核心函式mmap的實現原理,機制

首先,檔案對映是虛存的中心概念,檔案對映一方面給使用者提供了一組措施,好似使用者將檔案對映到自己位址空間的某個部分,使用簡單的記憶體訪問指令讀寫檔案 另一方面,它也可以用於核心的基本組織模式,在這種模式種,核心將整個位址空間視為諸如檔案之類的一組不同物件的對映.中的傳統檔案訪問方式是,首先用open...