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