mmap原理及流程(kernel 4.1版本)
背景
最近在分析問題時,遇到了mmap fb設備失敗問題,順便看了下4.1版本內核中的mmap相關流程,以前看過老版本的,有些忘記了,這里權當記錄,供后續參考。
mmap是什么?
相信做過Linux開發的兄弟都或多或少用過,或者聽說過mmap,但可能并不完全了解mmap的作用。
mmap字面上是內存映射的意思,聽起來比較抽象,其用法有很多,但總結起來,主要是如下兩個用途:
mmap基本原理
如前面所述,mmap主要有兩種用途,其中第一種用途分兩種情況(普通文件和特殊文件),這里分別描述相關原理:
1.普通文件的mmap基本原理為:每個文件(file)都定義了相應的文件操作數據結構(file_operations),該結構中定義了mmap操作,比如ext3文件系統文件對應的文件操作為:ext3_file_operations,對應的mmap操作接口為:generic_file_mmap。generic_file_mmap中就是創建(或查找利用現有的)vma,然后設置相應的成員,包括缺頁異常對應的處理鉤子,最后返回相應的虛擬地址。當進程訪問(寫)相應的虛擬地址時,硬件會觸發缺頁異常(因為相應的頁表項還沒有創建),此時會進入缺頁異常流程(do_page_fault),然后會進入之前設置的缺頁異常鉤子,該鉤子會觸發文件系統的寫入操作,最終會將數據寫入到文件中。
2.特殊文件(以設備文件為例)的mmap的基本原理與上述普通文件類似,主要差別在于:其定義的文件操作不同,對應的接口不同;其實現取決于具體的驅動,流程與普通文件實現可以完全不同,這里不詳述。
3.匿名映射的基本原理:由于沒有具體的fd,沒有對應的文件,匿名映射沒有對應的文件操作,其流程比較直接,主要還是創建(或查找利用現有的)vma,然后設置相應的成員,返回相應的虛擬地址。當進程訪問(寫)相應的虛擬地址時,硬件會觸發缺頁異常(因為相應的頁表項還沒有創建),此時會進入缺頁異常流程(do_page_fault),然后會進入匿名映射對應的流程,主要就是為虛擬地址范圍創建相應的頁表,本質上,就是分配了相應的物理內存。
代碼流程
mmap流程
mmap有相應的系統調用接口,從系統調用開始的大致流程如下(代碼不是很好找,需要仔細看看):
SYSCALL_DEFINE6(mmap_pgoff, ...sys_mmap_pgoff SYSCALL_DEFINE6(mmap_pgoff, ...vm_mmap_pgoffdo_mmap_pgoffmmap_regionfile->f_op->mmap() //不同文件(驅動)自己定義的mmap鉤子,比如ext3文件系 統對應為`generic_file_mmap`文件缺頁異常流程
do_page_fault__do_page_faulthandle_pte_fault__handle_mm_faulthandle_pte_faultdo_faultdo_shared_fault__do_faultvma->vm_ops->fault() //文件系統或驅動注冊的缺頁異常鉤子,如ext4文件對應為filemap_fault匿名映射缺頁異常流程
do_page_fault__do_page_faulthandle_pte_fault__handle_mm_faulthandle_pte_faultdo_anonymous_pagemk_pte //創建頁表項set_pte_at
原文地址:?http://happyseeker.github.io/kernel/2016/06/15/mmap-flow.html
總結
以上是生活随笔為你收集整理的mmap原理及流程(kernel 4.1版本)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 闲聊Linux内存管理(1)
- 下一篇: Core Dump流程分析