国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

八張圖講清楚Mmap實(shí)現(xiàn)原理

開發(fā) 前端
Linux缺頁中斷是指當(dāng)進(jìn)程訪問尚未建立映射關(guān)系的虛擬內(nèi)存時(shí),系統(tǒng)會觸發(fā)缺頁中斷,并根據(jù)頁面的狀態(tài)來分配物理頁面并建立映射關(guān)系。

大家好,最近在研究Linux內(nèi)核以及Linux系統(tǒng)編程的時(shí)候,經(jīng)常會碰到mmap內(nèi)存映射,mmap函數(shù)是實(shí)現(xiàn)高性能編程的一個(gè)關(guān)鍵點(diǎn),下面我通過幾張圖詳細(xì)介紹一下mmap實(shí)現(xiàn)原理。

(本文以64位CPU為原型講解)

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

要了解mmap實(shí)現(xiàn)原理,首先必須了解虛擬地址如何映射物理地址,如果沒掌握這個(gè)知識點(diǎn),后續(xù)閱讀會有很大的困難,切記!

虛擬地址映射物理地址采用的是頁表機(jī)制,64位CPU采用的是4級頁表。

圖片圖片

64位CPU虛擬地址長度為64位,但實(shí)際只用48位就已滿足虛擬地址映射物理內(nèi)存的要求,如下圖:

圖片圖片

64位CPU地址空間可分為三個(gè)部分:

  • 128T用戶空間
  • 128T內(nèi)核空間
  • 其他:保留空間

用戶空間和內(nèi)核空間共256T,2的48次方剛好為256T,所以48位地址空間能映射所有的虛擬地址。

48位虛擬地址由五部分組成:

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

問題1:為什么pgd,pud,pmd,ptl表偏移是9位?

pgd,pud,pmd,ptl表實(shí)現(xiàn)原理都相同,我們以pgd來講解。

一張pgd表對應(yīng)一個(gè)物理頁,一個(gè)物理頁的大小為4KB,一個(gè)pgd_t表項(xiàng)為8個(gè)字節(jié),一張pgd表能存儲4*1024/8=512個(gè)表項(xiàng)。

2的9次方等于512,所以采用9位的表偏移就能索引整張表的表項(xiàng)。

圖片圖片

問題2:為什么物理頁偏移為12位?

一個(gè)物理頁為4KB,物理頁訪問是單字節(jié)訪問,2的12次方剛好為4KB,所以物理頁偏移為12位。

1.1 虛擬地址映射物理地址過程

虛擬地址映射物理地址需要依次索引pgd,pud,pmd,ptl表,具體過程如下:

  • 步驟1:查詢pgd表

查詢pgd表,首先需要找到pgd表物理頁首地址,pgd表物理頁首地址由task_struct->mm_struct->pgd成員保存,每個(gè)進(jìn)程的task_struct->mm_struct->pgd成員數(shù)值不同,所以不同的進(jìn)程即使使用相同的虛擬地址也不會訪問相同到物理地址。

通過pgd表首地址+虛擬地址pgd表偏移索引到pgd_t表項(xiàng)完成pgd表查詢。

  • 步驟2:查詢pud表

pgd_t表項(xiàng)存儲的是pud表物理頁首地址。

通過pud表首地址+虛擬地址pud表偏移索引到pud_t表項(xiàng)完成pud表查詢。

  • 步驟3:查詢pmd表

pud_t表項(xiàng)存儲的是pmd表物理頁首地址。

通過pmd表首地址+虛擬地址pmd表偏移索引到pmd_t表項(xiàng)完成pmd表查詢。

  • 步驟4:查詢ptl表

pmd_t表項(xiàng)存儲的是ptl表物理頁首地址。

通過ptl表首地址+虛擬地址ptl表偏移索引到pte表項(xiàng)完成ptl表查詢。

  • 步驟5:映射物理地址

pte表項(xiàng)存儲的是物理頁首地址,pte+虛擬地址物理頁偏移就能定位到物理地址。

注意:定位到物理地址后,虛擬地址映射物理地址的過程就已完成。

思考:64位CPU頁表機(jī)制需要多少張表? 

圖片圖片

表的數(shù)量如下:

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

如果每張表都固定分配一個(gè)物理頁,所有的表占用的內(nèi)存空間已經(jīng)達(dá)到500多GB,這只是一個(gè)進(jìn)程占用的空間,如果有大量的進(jìn)程,占用內(nèi)存就非常恐怖了。

通常情況下,進(jìn)程只會使用很小的內(nèi)存,所以系統(tǒng)不會一下把所有的頁表都創(chuàng)建出來,而是采用動(dòng)態(tài)分配的方式創(chuàng)建,當(dāng)需要訪問虛擬地址時(shí),通過缺頁中斷創(chuàng)建虛擬地址對應(yīng)的各個(gè)頁表。

2.mmap實(shí)現(xiàn)原理

mmap函數(shù)是一種內(nèi)存映射文件的方法,它可以將一個(gè)文件或設(shè)備映射到進(jìn)程的地址空間中,使得進(jìn)程可以像訪問內(nèi)存一樣訪問文件或設(shè)備。

mmap可以分為:文件映射和匿名映射。

mmap函數(shù)主要工作就是創(chuàng)建VMA。

2.1 VMA簡介

VMA(Virtual Memory Area,虛擬內(nèi)存區(qū)域)是Linux內(nèi)核中用于管理進(jìn)程虛擬內(nèi)存的數(shù)據(jù)結(jié)構(gòu)。每個(gè)進(jìn)程都有一個(gè)VMA鏈表,用于描述進(jìn)程的虛擬地址空間的不同區(qū)域。

VMA包含了一段連續(xù)的虛擬地址空間,它定義了該區(qū)域的起始地址、結(jié)束地址以及一些屬性信息。VMA可以表示進(jìn)程的代碼段、數(shù)據(jù)段、堆、棧等不同的內(nèi)存區(qū)域。

VMA對應(yīng)Linux內(nèi)核struct vm_area_struct對象。

注意:VMA用于指導(dǎo)虛擬內(nèi)存映射物理內(nèi)存,沒有VMA指導(dǎo)無法完成虛擬地址和物理地址映射。

圖片圖片

struct vm_area_struct結(jié)構(gòu)體主要成員如下:

  • vm_start:虛擬內(nèi)存區(qū)域起始地址。
  • vm_end:虛擬內(nèi)存區(qū)域結(jié)束地址,vm_end減去vm_start為映射區(qū)域長度。
  • vm_page_prot:虛擬內(nèi)存訪問權(quán)限,

PROT_READ:可讀

PROT_WRITE:可寫

PROT_EXEC:可執(zhí)行

  • vm_page_flags:內(nèi)存映射標(biāo)志,

MAP_SHARED:共享映射

MAP_PRIVATE:私有映射

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

3.缺頁中斷

Linux缺頁中斷是指當(dāng)進(jìn)程訪問尚未建立映射關(guān)系的虛擬內(nèi)存時(shí),系統(tǒng)會觸發(fā)缺頁中斷,并根據(jù)頁面的狀態(tài)來分配物理頁面并建立映射關(guān)系。

通過mmap創(chuàng)建VMA后,我們使用VMA內(nèi)存映射區(qū)虛擬地址,但此時(shí)虛擬地址不能映射物理地址,原因是映射表還沒有動(dòng)態(tài)創(chuàng)建出來。

圖片圖片

當(dāng)缺頁中斷發(fā)生后,中斷處理函數(shù)會完成虛擬地址至物理地址各映射表創(chuàng)建。

各映射表的創(chuàng)建需要task_struct->mm_struct->pgd和虛擬地址表偏移量共同完成。

完成映射表創(chuàng)建后,還有最后一步工作需要完成,那就是pte創(chuàng)建。

pte該如何創(chuàng)建呢?

我們接著往下看...

4.文件映射

文件映射可以將文件的內(nèi)容映射到進(jìn)程的內(nèi)存空間。

文件映射pte指向文件的物理內(nèi)存頁,文件映射需要VMA指向?qū)?yīng)的文件,由文件來生成物理頁。

圖片圖片

mmap函數(shù)實(shí)現(xiàn)文件映射時(shí)需指定文件fd,文件偏移量,文件映射長度。

內(nèi)核會根據(jù)文件fd,文件偏移量,文件映射長度填充新創(chuàng)建的VMA。

文件映射創(chuàng)建pte時(shí)根據(jù)VMA記錄的文件file,文件偏移量,文件映射長度定位到具體文件以及文件偏移位置,將磁盤文件內(nèi)容拷貝至物理內(nèi)存頁,再將物理內(nèi)存頁轉(zhuǎn)換成pte設(shè)置進(jìn)ptl表。

至此文件映射已完成,就能通過虛擬地址訪問文件物理內(nèi)存頁。

5.匿名映射

圖片圖片

匿名映射相對來說比較簡單,只要在創(chuàng)建pte的時(shí)候,從物理內(nèi)存中申請一個(gè)物理內(nèi)存頁,將物理內(nèi)存頁轉(zhuǎn)換成pte設(shè)置進(jìn)ptl表,就完成匿名映射。

責(zé)任編輯:武曉燕 來源: 物聯(lián)網(wǎng)心球
相關(guān)推薦

2024-02-22 12:20:23

Linux零拷貝技術(shù)

2020-07-29 09:21:34

Docker集群部署隔離環(huán)境

2021-07-05 22:22:24

協(xié)議MQTT

2024-07-01 13:45:18

2021-04-21 10:00:08

MySQL索引數(shù)據(jù)庫

2021-10-29 11:30:31

補(bǔ)碼二進(jìn)制反碼

2025-02-10 08:55:47

2021-01-20 06:02:24

數(shù)據(jù)分析驅(qū)動(dòng)

2019-07-07 08:18:10

MySQL索引數(shù)據(jù)庫

2022-01-05 09:27:24

讀擴(kuò)散寫擴(kuò)散feed

2025-06-10 04:11:00

2018-08-13 09:20:21

NoSQLSQL數(shù)據(jù)

2021-12-06 07:15:47

Pulsar地域復(fù)制

2019-06-20 17:49:51

RPCHTTP協(xié)議

2017-12-17 20:17:23

NoSQLSQL數(shù)據(jù)

2024-04-01 10:09:23

AutowiredSpring容器

2020-12-24 15:18:27

大數(shù)據(jù)數(shù)據(jù)分析

2020-10-16 17:20:21

索引MySQL數(shù)據(jù)庫

2023-07-26 00:40:25

AI工具備忘錄

2018-05-21 07:08:18

行為驅(qū)動(dòng)開發(fā)BDD編碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

久久国产精品-国产精品| 国产精品日韩一区二区免费视频| 国际av在线| 久久精品一区八戒影视| 欧美激情第六页| 欧美一区影院| 国产精品女视频| 久久伊人精品天天| 91在线直播| 欧美不卡高清| 中日韩午夜理伦电影免费| 国内精品久久久久久久影视简单 | 白白色 亚洲乱淫| 亚洲精品国产精品久久清纯直播| 欧美人体视频xxxxx| 精品国模一区二区三区| 美女在线视频免费| 国产精品三级av在线播放| 欧美一区二区美女| 猫咪在线永久网站| 亚洲国产中文字幕在线视频综合| 91视频最新| 337p日本欧洲亚洲大胆鲁鲁| 色综合久久久久久久久久久| bdsm精品捆绑chinese| 午夜欧美理论片| 国产在线视频2019最新视频| 欧美日韩视频免费在线观看| 国产成人免费av一区二区午夜| 伊人网在线免费观看| 成年人免费在线视频| 欧美日韩国产免费| 欧美性猛交xxxxx免费看| 中文字幕电影在线观看| 午夜精品国产更新| 国产三级视频在线播放线观看| 欧美精选一区二区| 精精国产xxxx视频在线播放| 91麻豆.com| 亚洲国产小视频在线观看| 在线观看a视频| 亚洲国产精品yw在线观看| 中文字幕 91| 亚洲国产91| www亚洲欧美| 粉嫩精品导航导航| 国产精品第10页| 亚洲天堂黄色| 亚洲免费视频播放| 亚洲激情播播| 欧美在线视频观看| 欧美福利在线| 亚洲视频欧美在线| www国产亚洲精品久久麻豆| 黄色免费看片| 欧美巨大另类极品videosbest | a天堂在线资源| 欧美日韩高清在线播放| 电影一区二区三| 欧美自拍视频在线观看| 亚洲国产美女 | 555www成人网| 一本久道久久综合狠狠爱| 欧洲精品一区二区三区久久| 国产精品美女久久久久久久| 成人性生交大片免费看午夜| 亚洲无限av看| 激情小视频在线观看| 亚洲精品在线免费播放| 中文字幕视频免费在线观看| 日韩三级在线观看| 毛片在线免费| 亚洲级视频在线观看免费1级| 凹凸av导航大全精品| 久久99精品国产99久久| 久久噜噜亚洲综合| 2024短剧网剧在线观看| 欧美日韩爱爱视频| 国户精品久久久久久久久久久不卡| 亚洲国产一二三精品无码| 欧美日韩国产一区精品一区| 欧美精品一区二区三区国产精品 | 91麻豆视频网站| 六十路在线观看| 中文字幕亚洲欧美一区二区三区 | 97精品久久久| 日韩av二区在线播放| 99热免费观看| 日韩欧美成人一区二区| 男人久久精品| 亚洲视频axxx| 一区二区在线| 欧美成人精品欧美一级乱| 国产一区免费电影| 最近中文字幕mv2018在线高清| 亚洲第一黄色网| 国产探花一区| 亚洲熟妇av一区二区三区漫画| 欧美在线一区二区| 欧美理伦片在线播放| 99精品视频网站| 色噜噜狠狠成人中文综合| 国产va在线| 亚洲少妇中文在线| 欧美激情视频一区二区三区在线播放| 青青草原成人网| 亚洲精品wwww| 亚洲一级特黄| jizzjizz中文| 亚洲天堂福利av| 天堂√中文最新版在线| 欧美xxxxxxxx| 外国成人激情视频| 九九九在线观看视频| 日韩成人中文字幕在线观看| 欧美日韩免费观看一区=区三区| 中文字幕免费中文| 亚洲香蕉成视频在线观看| 天堂一区二区在线| 伦理片一区二区三区| 国产精品视频导航| 中文字幕永久在线不卡| 久久国际精品| 少妇av一区二区三区无码| 精品网站999www| 久久性天堂网| 欧美日韩在线资源| 成人资源视频网站免费| 亚洲大型综合色站| 日韩成人午夜| 国产精品18久久久久久首页狼| 久久久精品国产免费观看同学| 男人天堂视频在线观看| 亚洲精品在线免费| 成人午夜又粗又硬又大| 成人av网页| 久久国产精品偷| 久久午夜老司机| 日韩在线你懂得| 免费成人在线视频网站| 国产亚洲欧美日韩美女| 粉嫩欧美一区二区三区高清影视| 日本免费不卡一区二区| 亚洲经典中文字幕| 国产一区二区女| 美女露胸视频在线观看| 亚洲色图都市激情| 亚洲人午夜精品免费| 国产伦理精品不卡| 亚洲高清黄色| 91视频最新入口| 久精品免费视频| 国产精品网友自拍| 猛男gaygay欧美视频| 瑟瑟在线观看| 日韩成人黄色av| 成人av一区二区三区| 亚洲永久精品免费| 欧美成人性战久久| 日韩成人一级片| 亚洲最大成人| 日本在线视频www| 国产成人精品免高潮费视频| 97精品资源在线观看| 国产尤物久久久| 成人看片网站| 年轻的保姆91精品| 伊人久久大香线蕉综合网蜜芽| 蜜臀久久久99精品久久久久久| 日本一区二区三区视频在线观看| 欧美一二三区在线| 国产精品一区二区在线看| 久久久精品区| 欧美日韩激情视频一区二区三区| 久久影视中文粉嫩av| 精品精品国产国产自在线| 欧美午夜不卡| 精精国产xxxx视频在线播放| 加勒比成人在线| 国产成人久久久| 欧美麻豆精品久久久久久| 国产激情一区二区三区桃花岛亚洲| fc2人成共享视频在线观看| 国产在线视频2019最新视频| 日韩一级高清毛片| 91一区在线观看| 亚洲欧美综合国产精品一区| 亚洲黄色网址| 美女激情网站| 五月天久久狠狠| 欧美国产一区二区三区| 色婷婷精品久久二区二区蜜臂av | 高清一区二区三区| 如如影视在线观看经典| 亚洲电影网站| 91精品国产网站| 欧美草草影院在线视频| 91精品国产91久久久久游泳池| 搞av.com| 鬼打鬼之黄金道士1992林正英|