前言
大家好吖,歡迎來到 YY 滴 系列 ,熱烈歡迎! 本章主要內(nèi)容面向接觸過Linux的老鐵
主要內(nèi)容含:
歡迎訂閱 YY滴C++專欄!更多干貨持續(xù)更新!以下是傳送門!
- YY的《C++》專欄
- YY的《C++11》專欄
- YY的《Linux》專欄
- YY的《數(shù)據(jù)結(jié)構(gòu)》專欄
- YY的《C語言基礎(chǔ)》專欄
- YY的《初學(xué)者易錯(cuò)點(diǎn)》專欄
- YY的《小小知識點(diǎn)》專欄
- YY的《單片機(jī)期末速過》專欄
- YY的《C++期末速過》專欄
- YY的《單片機(jī)》專欄
- YY的《STM32》專欄
- YY的《數(shù)據(jù)庫》專欄
- YY的《數(shù)據(jù)庫原理》專欄
一.什么是進(jìn)程地址空間?
1.進(jìn)程地址空間基本概念
- 每一個(gè) 進(jìn)程 運(yùn)行之后,都會有一個(gè)進(jìn)程地址空間 的存在
- 進(jìn)程地址空間是操作系統(tǒng)OS 給進(jìn)程花的大餅 , 欺騙進(jìn)程他有足夠的空間用——使每個(gè)進(jìn)程都認(rèn)為自己獨(dú)占系統(tǒng)內(nèi)存資源。(即虛擬空間)
- 結(jié)論:進(jìn)程地址空間并不是物理內(nèi)存,而是 虛擬內(nèi)存 的一部分(虛擬地址,不具備存儲能力)
- 進(jìn)程地址空間本質(zhì)上是一種 抽象概念 ,用于描述進(jìn)程如何看待和使用內(nèi)存。
- 每個(gè)進(jìn)程都有自己的內(nèi)存地址范圍,這樣就不會與其他進(jìn)程發(fā)生沖突。進(jìn)程地址空間通常被劃分為幾個(gè)部分,包括代碼段、數(shù)據(jù)段、堆和棧等,每個(gè)部分都有其特定的用途。
![]()
2.mm_struct 基本概念
- 進(jìn)程地址空間需要被操作系統(tǒng)OS 管理 起來,每一個(gè)進(jìn)程都有地址空間,需要 被先描述再組織 ,因此地址空間是一個(gè)內(nèi)核的 數(shù)據(jù)結(jié)構(gòu)(內(nèi)核結(jié)構(gòu)體) ,即我們接下來要提到的 mm_struct
- 先描述再組織原理博客:【Linux】程序員一定要了解的計(jì)算機(jī)管理理念——描述與組織(9)
3.mm_struct/進(jìn)程地址空間 實(shí)現(xiàn)“區(qū)域劃分”的原理
- mm_struct 及其實(shí)現(xiàn)區(qū)域劃分的原理: 對一段線性空間設(shè)置start與end
- 我們在這里舉個(gè)例子:小胖和小花同學(xué)要對座位進(jìn)行“區(qū)域劃分”,我們 從計(jì)算機(jī)語言角度如何實(shí)現(xiàn)呢?
![]()
- 如下所示,我們通過將其 描述成結(jié)構(gòu)體, 對一段線性空間設(shè)置start與end,實(shí)現(xiàn)了區(qū)域劃分
struct destop_area
{
int total size;
int xiaopang_start;
int xiaopang_end;
int xiaohua start;
int xiaohua end;
}
struct destop_area area={100,0,50,50,100};
- 我們打開linux內(nèi)核結(jié)構(gòu)體源碼,也可以找到證明
![]()
二.什么是頁表?
1.頁表基本概念
- 引入:進(jìn)程地址空間即虛擬地址,不具備存儲能力
- 因此操作系統(tǒng)OS會對每個(gè)進(jìn)程維護(hù)一張 映射表, 對應(yīng)著虛擬地址和物理地址 ,這就是 頁表
- 頁表是一種特殊的數(shù)據(jù)結(jié)構(gòu),它位于系統(tǒng)空間的頁表區(qū)
- 頁表還具有 權(quán)限控制 的功能,可以通過設(shè)置頁表項(xiàng)的 權(quán)限位,實(shí)現(xiàn)對內(nèi)存的讀、寫、執(zhí)行等操作的控制。
![]()
2.進(jìn)程是如何和“頁表”進(jìn)行聯(lián)系?
- 進(jìn)程各種訪問尋址的前提, 一定是它在cpu上運(yùn)行
- cpu上有個(gè) 特殊寄存器cr3 ,他會保存頁表地址,物理地址(頁表地址會保存在進(jìn)程的上下文當(dāng)中)
![]()
3.每個(gè)進(jìn)程都有頁表,頁表在“進(jìn)程切換”如何跟蹤
根據(jù)第二小點(diǎn)內(nèi)容:
- 答: 經(jīng)過cpu后,頁表地址加載到上下文中保存好, 一起切換
- 原理:進(jìn)程切換時(shí),地址也會被保存。
三.地址空間&頁表的作用機(jī)理
1.地址空間&頁表的基本原理
- 如圖:
- 頁表的主要作用是將虛擬地址空間映射到物理內(nèi)存空間,實(shí)現(xiàn)虛擬地址到物理地址的轉(zhuǎn)換。
![]()
2.【頁表實(shí)驗(yàn)1】探究為什么一對父子進(jìn)程,同樣虛擬地址,讀取數(shù)據(jù)不同?(OS對頁表的調(diào)整)
- 我們經(jīng)過fork,子進(jìn)程經(jīng)過寫時(shí)拷貝會將頁表 完整拷貝 下來一份
(寫時(shí)拷貝博客:【C++】STL容器——【深淺拷貝】與【寫時(shí)拷貝】對比詳解(拷貝構(gòu)造)(10))- 因?yàn)?font color="#FF0000"> 進(jìn)程具有獨(dú)立性 ,我們進(jìn)行寫入操作時(shí),我們無法通過子進(jìn)程修改父進(jìn)程(對應(yīng)同一塊物理內(nèi)存)
![]()
- 于是,操作系統(tǒng)會單獨(dú)給子進(jìn)程開辟一塊新的物理地址
![]()
3.【頁表實(shí)驗(yàn)2】為什么可執(zhí)行程序中有大量代碼和數(shù)據(jù),加載到內(nèi)存任意位置都可以,不用考慮順序位置(頁表映射功能)
- 答:地址空間,以無序變有序——是加載到內(nèi)存任意位置都可以,不用考慮順序位置, 因?yàn)槎紩豁摫碛成?
- 【減小內(nèi)存管理成本,沒有頁表每次都要變化pcb】
- 分析:進(jìn)程地址空間, 讓進(jìn)程以統(tǒng)一的視角看待內(nèi)存
- 一個(gè)進(jìn)程,可以通過地址空間+頁表可以將 亂序/亂序 的內(nèi)存數(shù)據(jù),變成 有序 ,分門別類的規(guī)劃好!
![]()
4.【頁表實(shí)驗(yàn)3】為什么字符常量區(qū)不可被修改?它曾經(jīng)是如何被修改的?(頁表的權(quán)限控制功能)
- 我們運(yùn)行下面所示程序,程序會崩潰
int main()
{
char *str= “hello Linux”; //常量區(qū)曾經(jīng)是如何被修改的?
*str= 'H'; //常量區(qū)不可被修改
return 0;
}
- 核心原理:頁表還具有 權(quán)限控制 的功能,可以通過設(shè)置頁表項(xiàng)的 權(quán)限位,實(shí)現(xiàn)對內(nèi)存的讀、寫、執(zhí)行等操作的控制。
![]()
問:為什么程序會崩潰?
- 答:語言程度上:字符常量區(qū)不可被修改
- 答:進(jìn)程地址空間上: 頁表權(quán)限設(shè)置 只讀 ,所以不可被修改
問:曾經(jīng)又是如何被加載的?
- 答:進(jìn)程地址空間上: 頁表權(quán)限設(shè)置 可讀寫 ,所以可以被修改
5.【頁表實(shí)驗(yàn)4】一個(gè)游戲的大小遠(yuǎn)比內(nèi)存大,他在內(nèi)存中如何加載呢?(頁表如何實(shí)現(xiàn)linux掛起狀態(tài))
- 系統(tǒng)并不需要全部將其加載到內(nèi)存中,加載一部分/不加載,需要時(shí)加載
- 其中涉及到掛起狀態(tài)
頁表如何實(shí)現(xiàn)linux掛起狀態(tài)?文章來源:http://www.zghlxwxcb.cn/news/detail-861865.html
- 頁表中有一個(gè)字段, 標(biāo)志內(nèi)存是否要分配空間 && 有內(nèi)容
- 例如:00 01 11 10 二進(jìn)制形式來表示【是否分配&& 有內(nèi)容】
![]()
- 頁表實(shí)現(xiàn)linux掛起狀態(tài)
- 把原來的11狀態(tài)變成00狀態(tài)
![]()
6.【頁表實(shí)驗(yàn)5】缺頁中斷(進(jìn)程地址空間建立“進(jìn)程管理”與“內(nèi)存管理”的聯(lián)系)【全流程配圖詳解】(重點(diǎn))
全流程講解:文章來源地址http://www.zghlxwxcb.cn/news/detail-861865.html
- 當(dāng)前有個(gè)進(jìn)程開始訪問,通過cpu得到了頁表的地址,訪問頁表,想找到物理地址
- 此時(shí)頁表并沒有物理地址,屬于缺頁;于是進(jìn)入暫停狀態(tài)
- 假設(shè)此時(shí)狀態(tài)為下圖
![]()
- 這時(shí)操作系統(tǒng)就把磁盤中的程序加載到內(nèi)存中,并把物理地址填入缺失的頁中
![]()
- 此時(shí)屬于"已分配(物理地址)"狀態(tài),標(biāo)志位置1
![]()
- 結(jié)論:進(jìn)程地址空間建立進(jìn)程管理與內(nèi)存管理的聯(lián)系
![]()
到了這里,關(guān)于【Linux-14】進(jìn)程地址空間&虛擬空間&頁表——原理&知識點(diǎn)詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!