日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mmap原理及流程(kernel 4.1版本)

發(fā)布時間:2025/3/15 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mmap原理及流程(kernel 4.1版本) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

背景

最近在分析問題時,遇到了mmap fb設(shè)備失敗問題,順便看了下4.1版本內(nèi)核中的mmap相關(guān)流程,以前看過老版本的,有些忘記了,這里權(quán)當記錄,供后續(xù)參考。

mmap是什么?

相信做過Linux開發(fā)的兄弟都或多或少用過,或者聽說過mmap,但可能并不完全了解mmap的作用。

mmap字面上是內(nèi)存映射的意思,聽起來比較抽象,其用法有很多,但總結(jié)起來,主要是如下兩個用途:

  • 將文件內(nèi)容映射到進程用戶態(tài)的虛擬地址空間中,如此,進程就可以通過讀寫相應(yīng)的虛擬地址空間內(nèi)容,而直接讀寫相應(yīng)文件中的內(nèi)容。如此映射最大的好處是,進程可以直接從用戶態(tài)訪問文件中的數(shù)據(jù),而不需要用戶態(tài)和內(nèi)核態(tài)之間的內(nèi)存拷貝操作(正常流程下,如果想要向文件中寫數(shù)據(jù),需要將數(shù)據(jù)從用戶態(tài)拷貝到內(nèi)核態(tài),然后再從內(nèi)核態(tài)寫入文件),相當于少了一次內(nèi)存拷貝操作,這也是人們常說的零拷貝技術(shù)之一。當然,這里的文件不限于普通文件,Unix環(huán)境中,一切皆文件嘛,這里的文件完全可能是特殊文件,比如設(shè)備文件,那相應(yīng)的mmap操作就需要單獨的驅(qū)動實現(xiàn)了。
  • 分配內(nèi)存。當mmap中傳入的fd為空時,其作用就是分配內(nèi)存,類似于malloc(其實malloc的glibc實現(xiàn)中就使用了mmap來分配內(nèi)存),俗稱“匿名映射”,匿名的意思就是fd為空,名字很抽象,本質(zhì)不復(fù)雜:就是在進程的虛擬地址空間中分配一段虛擬內(nèi)存(用vma表示),物理內(nèi)存在缺頁異常中分配,并修改相應(yīng)頁表。
  • 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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。