日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

八張圖講清楚Mmap實現原理

來源: 責編: 時間:2024-01-08 09:17:54 278觀看
導讀大家好,最近在研究Linux內核以及Linux系統編程的時候,經常會碰到mmap內存映射,mmap函數是實現高性能編程的一個關鍵點,下面我通過幾張圖詳細介紹一下mmap實現原理。(本文以64位CPU為原型講解)1.虛擬地址如何映射物理地址?要

大家好,最近在研究Linux內核以及Linux系統編程的時候,經常會碰到mmap內存映射,mmap函數是實現高性能編程的一個關鍵點,下面我通過幾張圖詳細介紹一下mmap實現原理。JZI28資訊網——每日最新資訊28at.com

(本文以64位CPU為原型講解)JZI28資訊網——每日最新資訊28at.com

1.虛擬地址如何映射物理地址?

要了解mmap實現原理,首先必須了解虛擬地址如何映射物理地址,如果沒掌握這個知識點,后續閱讀會有很大的困難,切記!JZI28資訊網——每日最新資訊28at.com

虛擬地址映射物理地址采用的是頁表機制,64位CPU采用的是4級頁表。JZI28資訊網——每日最新資訊28at.com

圖片圖片JZI28資訊網——每日最新資訊28at.com

64位CPU虛擬地址長度為64位,但實際只用48位就已滿足虛擬地址映射物理內存的要求,如下圖:JZI28資訊網——每日最新資訊28at.com

圖片圖片JZI28資訊網——每日最新資訊28at.com

64位CPU地址空間可分為三個部分:JZI28資訊網——每日最新資訊28at.com

  • 128T用戶空間
  • 128T內核空間
  • 其他:保留空間

用戶空間和內核空間共256T,2的48次方剛好為256T,所以48位地址空間能映射所有的虛擬地址。JZI28資訊網——每日最新資訊28at.com

48位虛擬地址由五部分組成:JZI28資訊網——每日最新資訊28at.com

  • pgd表偏移,四級表,9位
  • pud表偏移,三級表,9位
  • pmd表偏移,二級表,9位
  • ptl表偏移,一級表,9位
  • 物理頁偏移,12位

問題1:為什么pgd,pud,pmd,ptl表偏移是9位?JZI28資訊網——每日最新資訊28at.com

pgd,pud,pmd,ptl表實現原理都相同,我們以pgd來講解。JZI28資訊網——每日最新資訊28at.com

一張pgd表對應一個物理頁,一個物理頁的大小為4KB,一個pgd_t表項為8個字節,一張pgd表能存儲4*1024/8=512個表項。JZI28資訊網——每日最新資訊28at.com

2的9次方等于512,所以采用9位的表偏移就能索引整張表的表項。JZI28資訊網——每日最新資訊28at.com

圖片圖片JZI28資訊網——每日最新資訊28at.com

問題2:為什么物理頁偏移為12位?JZI28資訊網——每日最新資訊28at.com

一個物理頁為4KB,物理頁訪問是單字節訪問,2的12次方剛好為4KB,所以物理頁偏移為12位。JZI28資訊網——每日最新資訊28at.com

1.1 虛擬地址映射物理地址過程JZI28資訊網——每日最新資訊28at.com

虛擬地址映射物理地址需要依次索引pgd,pud,pmd,ptl表,具體過程如下:JZI28資訊網——每日最新資訊28at.com

  • 步驟1:查詢pgd表

查詢pgd表,首先需要找到pgd表物理頁首地址,pgd表物理頁首地址由task_struct->mm_struct->pgd成員保存,每個進程的task_struct->mm_struct->pgd成員數值不同,所以不同的進程即使使用相同的虛擬地址也不會訪問相同到物理地址。JZI28資訊網——每日最新資訊28at.com

通過pgd表首地址+虛擬地址pgd表偏移索引到pgd_t表項完成pgd表查詢。JZI28資訊網——每日最新資訊28at.com

  • 步驟2:查詢pud表

pgd_t表項存儲的是pud表物理頁首地址。JZI28資訊網——每日最新資訊28at.com

通過pud表首地址+虛擬地址pud表偏移索引到pud_t表項完成pud表查詢。JZI28資訊網——每日最新資訊28at.com

  • 步驟3:查詢pmd表

pud_t表項存儲的是pmd表物理頁首地址。JZI28資訊網——每日最新資訊28at.com

通過pmd表首地址+虛擬地址pmd表偏移索引到pmd_t表項完成pmd表查詢。JZI28資訊網——每日最新資訊28at.com

  • 步驟4:查詢ptl表

pmd_t表項存儲的是ptl表物理頁首地址。JZI28資訊網——每日最新資訊28at.com

通過ptl表首地址+虛擬地址ptl表偏移索引到pte表項完成ptl表查詢。JZI28資訊網——每日最新資訊28at.com

  • 步驟5:映射物理地址

pte表項存儲的是物理頁首地址,pte+虛擬地址物理頁偏移就能定位到物理地址。JZI28資訊網——每日最新資訊28at.com

注意:定位到物理地址后,虛擬地址映射物理地址的過程就已完成。JZI28資訊網——每日最新資訊28at.com

思考:64位CPU頁表機制需要多少張表? 
JZI28資訊網——每日最新資訊28at.com

圖片圖片JZI28資訊網——每日最新資訊28at.com

表的數量如下:JZI28資訊網——每日最新資訊28at.com

  • pgd表1張,占用內存4KB。
  • pud表2的9次方張,占用內存4KB * 512 = 2MB。
  • pmd表2的18次方張,占用內存4KB * 512 * 512 = 1GB。
  • ptl表2的27次方張,占用內存4KB * 512 * 512 * 512 = 512GB。

如果每張表都固定分配一個物理頁,所有的表占用的內存空間已經達到500多GB,這只是一個進程占用的空間,如果有大量的進程,占用內存就非常恐怖了。JZI28資訊網——每日最新資訊28at.com

通常情況下,進程只會使用很小的內存,所以系統不會一下把所有的頁表都創建出來,而是采用動態分配的方式創建,當需要訪問虛擬地址時,通過缺頁中斷創建虛擬地址對應的各個頁表。JZI28資訊網——每日最新資訊28at.com

2.mmap實現原理

mmap函數是一種內存映射文件的方法,它可以將一個文件或設備映射到進程的地址空間中,使得進程可以像訪問內存一樣訪問文件或設備。JZI28資訊網——每日最新資訊28at.com

mmap可以分為:文件映射和匿名映射。JZI28資訊網——每日最新資訊28at.com

mmap函數主要工作就是創建VMA。JZI28資訊網——每日最新資訊28at.com

2.1 VMA簡介

VMA(Virtual Memory Area,虛擬內存區域)是Linux內核中用于管理進程虛擬內存的數據結構。每個進程都有一個VMA鏈表,用于描述進程的虛擬地址空間的不同區域。JZI28資訊網——每日最新資訊28at.com

VMA包含了一段連續的虛擬地址空間,它定義了該區域的起始地址、結束地址以及一些屬性信息。VMA可以表示進程的代碼段、數據段、堆、棧等不同的內存區域。JZI28資訊網——每日最新資訊28at.com

VMA對應Linux內核struct vm_area_struct對象。JZI28資訊網——每日最新資訊28at.com

注意:VMA用于指導虛擬內存映射物理內存,沒有VMA指導無法完成虛擬地址和物理地址映射。JZI28資訊網——每日最新資訊28at.com

圖片圖片JZI28資訊網——每日最新資訊28at.com

struct vm_area_struct結構體主要成員如下:JZI28資訊網——每日最新資訊28at.com

  • vm_start:虛擬內存區域起始地址。
  • vm_end:虛擬內存區域結束地址,vm_end減去vm_start為映射區域長度。
  • vm_page_prot:虛擬內存訪問權限,

PROT_READ:可讀JZI28資訊網——每日最新資訊28at.com

PROT_WRITE:可寫JZI28資訊網——每日最新資訊28at.com

PROT_EXEC:可執行JZI28資訊網——每日最新資訊28at.com

  • vm_page_flags:內存映射標志,

MAP_SHARED:共享映射JZI28資訊網——每日最新資訊28at.com

MAP_PRIVATE:私有映射JZI28資訊網——每日最新資訊28at.com

  • vm_ops:文件映射操作集合,匿名映射為NULL。
  • vm_pgoff:文件映射文件偏移量,匿名映射無效。
  • vm_file:映射文件,匿名映射為NULL。

3.缺頁中斷

Linux缺頁中斷是指當進程訪問尚未建立映射關系的虛擬內存時,系統會觸發缺頁中斷,并根據頁面的狀態來分配物理頁面并建立映射關系。JZI28資訊網——每日最新資訊28at.com

通過mmap創建VMA后,我們使用VMA內存映射區虛擬地址,但此時虛擬地址不能映射物理地址,原因是映射表還沒有動態創建出來。JZI28資訊網——每日最新資訊28at.com

圖片圖片JZI28資訊網——每日最新資訊28at.com

當缺頁中斷發生后,中斷處理函數會完成虛擬地址至物理地址各映射表創建。JZI28資訊網——每日最新資訊28at.com

各映射表的創建需要task_struct->mm_struct->pgd和虛擬地址表偏移量共同完成。JZI28資訊網——每日最新資訊28at.com

完成映射表創建后,還有最后一步工作需要完成,那就是pte創建。JZI28資訊網——每日最新資訊28at.com

pte該如何創建呢?JZI28資訊網——每日最新資訊28at.com

我們接著往下看...JZI28資訊網——每日最新資訊28at.com

4.文件映射

文件映射可以將文件的內容映射到進程的內存空間。JZI28資訊網——每日最新資訊28at.com

文件映射pte指向文件的物理內存頁,文件映射需要VMA指向對應的文件,由文件來生成物理頁。JZI28資訊網——每日最新資訊28at.com

圖片圖片JZI28資訊網——每日最新資訊28at.com

mmap函數實現文件映射時需指定文件fd,文件偏移量,文件映射長度。JZI28資訊網——每日最新資訊28at.com

內核會根據文件fd,文件偏移量,文件映射長度填充新創建的VMA。JZI28資訊網——每日最新資訊28at.com

文件映射創建pte時根據VMA記錄的文件file,文件偏移量,文件映射長度定位到具體文件以及文件偏移位置,將磁盤文件內容拷貝至物理內存頁,再將物理內存頁轉換成pte設置進ptl表。JZI28資訊網——每日最新資訊28at.com

至此文件映射已完成,就能通過虛擬地址訪問文件物理內存頁。JZI28資訊網——每日最新資訊28at.com

5.匿名映射

圖片圖片JZI28資訊網——每日最新資訊28at.com

匿名映射相對來說比較簡單,只要在創建pte的時候,從物理內存中申請一個物理內存頁,將物理內存頁轉換成pte設置進ptl表,就完成匿名映射。JZI28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-57924-0.html八張圖講清楚Mmap實現原理

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 揚名立萬的機會來了!Java 十億行全球挑戰

下一篇: 告別Java -Jar啟動!告訴你啟動單機SpringBoot服務的正確操作方式

標簽:
  • 熱門焦點
  • Find N3入網:最高支持16+1TB

    OPPO將于近期登場的Find N3折疊屏目前已經正式入網,型號為PHN110。本次Find N3在外觀方面相比前兩代有很大的變化,不再是小號的橫向折疊屏,而是跟別的廠商一樣采用了較為常見的
  • 線程通訊的三種方法!通俗易懂

    線程通信是指多個線程之間通過某種機制進行協調和交互,例如,線程等待和通知機制就是線程通訊的主要手段之一。 在 Java 中,線程等待和通知的實現手段有以下幾種方式:Object 類下
  • 不容錯過的MSBuild技巧,必備用法詳解和實踐指南

    一、MSBuild簡介MSBuild是一種基于XML的構建引擎,用于在.NET Framework和.NET Core應用程序中自動化構建過程。它是Visual Studio的構建引擎,可在命令行或其他構建工具中使用
  • 如何使用JavaScript創建一只圖像放大鏡?

    譯者 | 布加迪審校 | 重樓如果您曾經瀏覽過購物網站,可能遇到過圖像放大功能。它可以讓您放大圖像的特定區域,以便瀏覽。結合這個小小的重要功能可以大大改善您網站的用戶體驗
  • 微信語音大揭秘:為什么禁止轉發?

    大家好,我是你們的小米。今天,我要和大家聊一個有趣的話題:為什么微信語音不可以轉發?這是一個我們經常在日常使用中遇到的問題,也是一個讓很多人好奇的問題。讓我們一起來揭開這
  • 零售大模型“干中學”,攀爬數字化珠峰

    文/侯煜編輯/cc來源/華爾街科技眼對于絕大多數登山愛好者而言,攀爬珠穆朗瑪峰可謂終極目標。攀登珠峰的商業路線有兩條,一是尼泊爾境內的南坡路線,一是中國境內的北坡路線。相
  • iQOO 11S新品發布會

    iQOO將在7月4日19:00舉行新品發布會,推出杭州亞運會電競賽事官方用機iQOO 11S。
  • iQOO Neo8系列新品發布會

    旗艦雙芯 更強更Pro
  • DRAM存儲器10月價格下跌,NAND閃存本月價格與上月持平

    10月30日,據韓國媒體消息,自今年年初以來一直在上漲的 DRAM 存儲器的交易價格僅在本月就下跌了近 10%,此次是全年首次降價,而NAND 閃存本月價格與上月持平。市
Top 主站蜘蛛池模板: 星座| 永清县| 河池市| 衡东县| 那坡县| 独山县| 林周县| 正阳县| 呼和浩特市| 花垣县| 沁水县| 南宁市| 昌吉市| 阜阳市| 青川县| 九台市| 佛山市| 阜新| 香格里拉县| 曲松县| 灌云县| 攀枝花市| 武强县| 虹口区| 婺源县| 蓝田县| 思南县| 旬阳县| 乃东县| 平南县| 正安县| 莱阳市| 东城区| 黄大仙区| 滨州市| 清苑县| 清原| 莆田市| 贵州省| 兴隆县| 潍坊市|