Linux —— 虛擬進程地址空間

在這里插入圖片描述
在這里插入圖片描述


🎁個人主頁:工藤新一1

🔍系列專欄:C++面向對象(類和對象篇)

🌟心中的天空之城,終會照亮我前方的路

🎉歡迎大家點贊👍評論📝收藏?文章


文章目錄

  • 虛擬進程地址空間
    • 一、虛擬地址空間經典布局
    • 二、頁表
      • 2.1 核心定義:什么是頁表?
      • 2.2 為什么需要頁表?
    • 三、虛擬地址空間
      • 3.1 虛擬地址空間是什么?
      • 3.2 如何管理虛擬地址空間?
      • 3.3 為什么要有虛擬地址空間?
    • 四、工業疑問
      • a. 創建進程時,是否可以只創建 PCB/地址空間/頁表?
      • b. 創建進程現有task_struct,還是先加載數據/代碼
      • c. 如何理解進程掛起?
    • 五、虛擬內存管理

虛擬進程地址空間

虛擬地址空間 是指一個 OS為每個運行中的進程(程序)提供的一個抽象的、獨立的、連續的邏輯地址范圍。這個空間是 “虛擬的”,這并不意味著物理內存中真的有這么一大塊連續的區域,而是通過硬件(MMU,內存管理單元)和 Kernel 的協作,將虛擬地址映射到分散的物理內存頁上

在這里插入圖片描述


一、虛擬地址空間經典布局

一個進程的典型內存地址空間布局如下圖所示,它被劃分為多個具有不同權限(讀、寫、執行)的段(Segments):

從高地址到低地址:

  1. 內核空間(Kernel Space)
    • 通常位于地址空間的最高處(例如,在32位Linux中,0x C000 0000以上)。
    • 存放操作系統內核的代碼、數據和數據結構。
    • 所有進程共享同一份內核映射。但這段空間受保護,用戶態進程無法直接訪問,必須通過系統調用(Syscall)進入內核態才能訪問。
  2. (Stack)
    • 向下增長(向低地址方向)。
    • 用于存儲局部變量函數參數返回地址等。
    • 每個函數被調用時,會在棧上分配一個新的“棧幀”。
    • 它的增長是自動的,但大小有限(通常默認為幾MB),溢出會導致“棧溢出”錯誤。
  3. 內存映射段(Memory Mapping Segment)
    • 用于映射文件或匿名內存。
    • 動態鏈接庫(如 .so.dll 文件)就加載在這里。
    • 也可以通過 mmap() 系統調用創建,用于大塊內存的分配或進程間共享內存。
  4. (Heap)
    • 向上增長(向高地址方向)。
    • 用于動態內存分配。當程序員使用 malloc()new 等申請內存時,內存就從這里分配。
    • 堆的大小只受限于系統可用的虛擬內存總量,管理由程序員負責(分配和釋放), improper management leads to memory leaks.
  5. BSS 段(.bss)
    • 存放未初始化的全局變量和靜態變量
    • 在程序開始執行前,操作系統會將此段初始化為零。
  6. 數據段(.data)
    • 存放已初始化的全局變量和靜態變量
  7. 代碼段(文本段)(.text)
    • 存放程序的執行代碼(機器指令)。
    • 通常是只讀和可執行的,以防止代碼被意外修改。
  8. 保留區(Reserved)
    • 通常是最低地址的一段空間(例如 0x00x400000),不允許訪問,用于捕捉空指針等錯誤。

地址區域分布:

在這里插入圖片描述


在這里插入圖片描述


感受虛擬地址:

fork():一次調用,兩次返回

這是理解 fork() 最關鍵也是最反直覺的一點:

  • 在父進程中,fork() 返回新創建子進程的進程ID(PID)(一個大于0的數)。
  • 在子進程中,fork() 返回 0
  • 如果創建失敗(例如系統資源不足),fork() 返回 -1

在這里插入圖片描述


進程具有獨立性:數據層面上,互不影響;此時就需寫時拷貝,實現進程的個性化

在這里插入圖片描述

相同地址,獲取不同變量值


二、頁表

2.1 核心定義:什么是頁表?

頁表是虛擬內存系統的核心數據結構,是連接 虛擬地址物理地址 的“地圖”或“翻譯官”;是 Kernel 為每個進程維護的一個映射表,它記錄了該進程的虛擬內存頁對應到物理內存幀映射關系

簡單來說,它的工作就是回答這個問題:

“這個進程看到的虛擬地址 X,實際上在物理內存的哪個地方?”


在這里插入圖片描述


在這里插入圖片描述


在這里插入圖片描述


在這里插入圖片描述


在這里插入圖片描述

OS 會將進程物理地址隱藏起來,我們只能觀測到進程的虛擬地址


解決歷史遺留問題:

在這里插入圖片描述


2.2 為什么需要頁表?

頁表是實現虛擬地址空間這一抽象概念的技術基礎。沒有頁表,虛擬內存就無法工作。它的存在是為了:

  1. 實現地址翻譯:將程序使用的 虛擬地址轉換 為硬件使用的 物理地址
  2. 實施內存保護:通過頁表項中的權限位,控制進程對內存的訪問(可讀?可寫?可執行?)。
  3. 支持“換出”到磁盤:通過頁表項中的“存在/不存在”位,操作系統可以知道某頁是否在物理內存中,如果不在,它的數據存放在硬盤的哪個位置。

三、虛擬地址空間

3.1 虛擬地址空間是什么?

  • **虛擬地址空間本質上就是 OS 給進程畫的一張餅! **《大富翁例子》 讓進程誤以為其獨占整個內存的相關資源

畫大餅的作用:讓每一個進程都認為自己有 4GB的物理內存空間,或者:讓每一個進程都認為自己在獨占物理內存空間

OS 為每個進程都畫了大餅,所以我們也要把這張大餅管理起來


3.2 如何管理虛擬地址空間?

先描述,在組織!

將所有的 虛擬進程地址空間[餅],用鏈表的方式管理起來;因此,對餅的管理就轉化為了對鏈表的增刪查改

虛擬地址空間本質:Kernel當中為進程創建的結構體對象!

在這里插入圖片描述


在這里插入圖片描述


在這里插入圖片描述

在這里插入圖片描述


3.3 為什么要有虛擬地址空間?

1. 將無/亂序的物理地址轉變為有序的虛擬地址!

  • 對用戶(進程)而言:虛擬地址空間是連續且有序的
  • 對系統(操作系統)而言:物理內存[完全隨機且不連續]的分配是靈活且混亂的

在這里插入圖片描述


2. 地址轉化過程中對地址與操作進行合法性判定,進而保護物理內存!

在這里插入圖片描述


a. 什么是野指針?

在這里插入圖片描述


b. char* str = “hello linux!”; *str = ‘H’;為什么在字符常量區寫入就會崩潰?

在這里插入圖片描述


在這里插入圖片描述


3. 缺頁中斷 與 按需調頁

缺頁中斷是操作系統 “欺騙” 進程的基礎,也是它管理內存的得力工具(畫大餅)

在這里插入圖片描述


4. 使進程管理與內存管理,進行一定程度的解耦合

在這里插入圖片描述


在這里插入圖片描述

進程管理 & 內存管理 –——> 直線脫鉤


四、工業疑問

a. 創建進程時,是否可以只創建 PCB/地址空間/頁表?

核心觀點:惰性加載 (Lazy Loading) 與按需調頁 (Demand Paging)

問題背后隱藏著一個關鍵思想:為什么要在進程一開始就把它可能永遠用不到的東西全部加載好呢? 這太浪費了….它們遵循 “惰性”原則,只在真正需要時才分配資源。這個過程就是通過 **缺頁中斷 ** 來實現的


在這里插入圖片描述


在這里插入圖片描述


b. 創建進程現有task_struct,還是先加載數據/代碼

一定先有管理結構task_structmm_struct,空頁表[虛物]。滯后加載代碼和數據[實物],發生在第一次訪問時,由缺頁中斷機制驅動。并且,加載過程本身也是由這些數據結構指導

在這里插入圖片描述


c. 如何理解進程掛起?

在這里插入圖片描述


在這里插入圖片描述


在這里插入圖片描述


在這里插入圖片描述


在這里插入圖片描述


五、虛擬內存管理

虛擬內存管理是一種內存抽象機制。虛擬內存管理系統的任務,就是將進程使用的這些虛擬地址(Virtual Address)動態地映射到物理內存上的物理地址(Physical Address),或者必要時映射到磁盤上的交換空間(Swap Space)

這個過程主要由計算機的 內存管理單元(MMU) 和操作系統內核共同完成。


描述 Linux 下進程的地址空間的所有的信息的結構體是 mm_struct (內存描述符)。每個進程只有? 個 mm_struct結構,在每個進程的 task_struct結構中,有?個指向該進程的結構

在這里插入圖片描述

struct mm_struct{/*...*/struct vm_area_struct *mmap; /* 指向虛擬區間(VMA)鏈表 */        struct rb_root mm_rb; /* red_black樹 */                unsigned long task_size; /*具有該結構體的進程的虛擬地址空間的??*/             
/*...*/// 代碼段、數據段、堆棧段、參數段及環境段的起始和結束地址。unsigned long start_code, end_code, start_data, end_data;unsigned long start_brk, brk, start_stack;unsigned long arg_start, arg_end, env_start, env_end;/*...*/

  • Virtual Memory

在這里插入圖片描述


在這里插入圖片描述


進程具有獨立性:

  1. 內核數據結構獨立!
  2. 加載進內存的代碼和數據獨立!

在這里插入圖片描述


目前,我們對于虛擬地址空間的理解只能做到局部性的邏輯自洽


🌟 各位看官好我是工藤新一1呀~

🌈 愿各位心中所想,終有所致!
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/96080.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/96080.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/96080.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

簡單聊一聊js

JavaScript 是一種高級的、解釋型的編程語言。它是現代 Web 開發的三大核心基石之一,與 HTML 和 CSS 并列。?HTML?:負責網頁的結構和內容?(如標題、段落、圖片)。?CSS?:負責網頁的樣式和布局?(如顏色…

造粒機cad+設計說明書

摘要 隨著現代化工業的快速發展,生產出大量的固體廢棄物。這些廢棄物對環境造成了很大的污染,因此需要采取有效的措施進行處理。機械強壓式造粒機就是一種非常有效的處理工具,它可以將廢渣、廢料、飼料和化肥等材料通過機械強力擠壓&#xff…

第五課 C#語言基本元素概覽,初始類型,變量與方法,算法簡介

熟悉C#語言要求:對構成C#語言的基本元素,隨便拿出一個你都認識,對于常見基本元素,都能正確使用它 精通C#語言要求:對于構成C#語言的基本元素,隨便拿出一個都會使用,對于常用基本元素&#xff0…

LLM學習:大模型基礎——視覺大模型以及autodl使用

1、常見的VLM 在大模型中,VLM 是視覺語言模型(Vision-Language Model)的縮寫,是一種多模態、生成式 AI 模型,能夠理解和處理視頻、圖像和文本。 VLM 通過將大語言模型(LLM)與視覺編碼器相結合構建而成,使 LLM 具有 “看” 的能力,從而可以處理并提供對提示中的…

Vue—路由配置中設置了meta.title,但頁面標題仍然顯示為“Vite App“?【讓我來看看~】

路由配置中明明設置了meta.title,但是頁面標題仍然顯示為"Vite App"?這是因為僅僅在路由配置中設置meta.title是不夠的,還需要在路由守衛中動態設置頁面標題。需要做以下幾件事來正確設置頁面標題:1.首先更新HTML文件的…

【機器學習】綜合實訓(二)

項目五 電影評分預測【教學內容】使用 MovieLens 數據集,訓練一個模型預測用戶對電影的評分。主要有以下幾個知識點:(1)數據加載與探索性分析(EDA)。(2)處理稀疏數據(如用…

STM32 UART + DMA + 空閑中斷使用中的幀錯誤(FE)問題及解決方案

STM32 UART + DMA + IDLE中斷使用中的幀錯誤(FE)問題及解決方案 在我調試STM32H7串口空閑中斷DMA接受時遇到了一個bug,這個現象發生在系統剛上電時,有個串口由于幀錯誤FE掛起了中斷,之后在HAL_UART_IRQHandler這個全局中斷處理函數結束后,所有的中斷使能標志位都被清除了,經過…

TDengine 選擇函數 BOTTOM() 用戶手冊

BOTTOM() 函數用戶手冊 函數定義 BOTTOM(expr, k)功能說明 BOTTOM() 函數統計表/超級表中某列的值最小 k 個非 NULL 值。如果多條數據取值一樣,全部取用又會超出 k 條限制時,系統會從相同值中隨機選取符合要求的數量返回。 返回值 數據類型: 同應用…

西門子 S7-200 SMART PLC 實現星三角降壓啟動控制:原理、案例與完整程序

在工業控制場景中,中型異步電機直接啟動時會產生遠超額定電流的沖擊電流(通常為額定電流的 5-7 倍),不僅會影響電網穩定性,還可能對機械設備造成損傷。星三角(Y-Δ)降壓啟動是解決這一問題的經典…

【Android】View 的基礎知識

【Android】View 的基礎知識 1. 什么是 View? View 是 Android 中所有UI組件的基礎類。它表示屏幕上的一個矩形區域,負責繪制內容和處理用戶交互事件。所有的 UI 組件(如按鈕、文本框等)都是 View 的子類,而 ViewGroup…

西門子 S7-200 SMART PLC 實現電機點動與連續運行綜合控制

在工業生產中,電機控制并非單一模式:調試設備時需要 “按動即轉、松開即停” 的點動功能,正常生產時則需要 “一鍵啟動、持續運行” 的連續控制。本文以西門子 S7-200 SMART PLC 為載體,詳細講解電機點動控制原理,并設…

如何解決pip安裝報錯ModuleNotFoundError: No module named ‘sphinx-rtd-theme’問題

【Python系列Bug修復PyCharm控制臺pip install報錯】如何解決pip安裝報錯ModuleNotFoundError: No module named ‘sphinx-rtd-theme’問題 摘要 在使用 PyCharm 開發 Python 項目時,pip install 報錯是常見痛點。特別是在構建文檔或引入第三方庫時,開…

HakcMyVM-Literal

目錄信息搜集漏洞利用權限提升信息搜集 主機發現 ┌──(kali?kali)-[~] └─$ nmap -sn 192.168.21.0/24 Nmap scan report for 192.168.21.5端口掃描 ┌──(kali?kali)-[~] └─$ nmap -sS -sV -O -p- 192.168.21.5 Starting Nmap 7.95 ( https://nmap.org ) a…

0904 類的繼承

Part 1.梳理思維導圖一.繼承中的特殊成員函數1.構造函數父類的構造函數會被繼承到子類中&#xff0c;在構造的順序中&#xff0c;是先構造父類&#xff0c;再構造子類#include <iostream>using namespace std;class Father { public:string name; protected:int *age; pr…

PDF教程|如何把想要的網頁保存下來?

前段時間有個小伙伴咨詢了小白&#xff1a;領導想要某個網頁的整個頁面&#xff0c;有沒有比較好的方法把它保存下來&#xff1f; 在他找到小白之前&#xff0c;這種事情他已經接到好幾次了&#xff0c;每次都是怎么解決的呢&#xff1f;其實很簡單&#xff0c;就是打開Word&a…

【bash】命令查看當前目錄下文件個數

要用 ls 查看當前目錄下的文件個數&#xff0c;可以結合 wc -l 來統計行數&#xff1a; ls -1 | wc -l說明&#xff1a; ls -1&#xff1a;以一行一個文件的方式列出。wc -l&#xff1a;統計行數&#xff0c;也就是文件/目錄的數量。 ?? 需要注意&#xff1a; 這個方法會把文…

「日拱一碼」081 機器學習——梯度增強特征選擇GBFS

目錄 什么是梯度增強特征選擇&#xff08;GBFS&#xff09; 為什么 GBM 適合做特征選擇 GBFS 的一般步驟 代碼示例 什么是梯度增強特征選擇&#xff08;GBFS&#xff09; GBFS 并非一個像 Lasso 或隨機森林那樣有嚴格標準定義的獨立算法&#xff0c;而是一種基于梯度提升機…

解構匯編, 萬物起源

匯編的誕生匯編全景圖核心主干: CPU架構主要分支: 語法和工具共同的地貌: 核心概念延伸: 跨平臺 & 跨架構跨平臺跨架構總結以 GAS vs. NASM 為例NASM 不支持跨架構 ≠ 無法在ARM架構上的系統安裝匯編的誕生 機器語言的困境 早期的程序員直接使用機器語言進行編程機器語言由…

廣州旅游網站系統 - 純靜態旅游展示平臺

&#x1f31f; 廣州旅游網站系統 - 純靜態旅游展示平臺觀世界才有世界觀 - 一個集景區展示、旅游攻略、文化傳播于一體的精美旅游網站&#x1f4cb; 項目概述 這是一個專注于廣州旅游文化的純靜態網站系統&#xff0c;采用現代化的前端技術棧&#xff0c;為游客提供全方位的廣州…

Qt UDP通信學習

Qt UDP通信學習 一、項目概述 本項目基于Qt框架實現了UDP通信功能&#xff0c;支持單播與廣播消息收發&#xff0c;展示了UDP套接字的基本用法&#xff0c;適合初學者學習Qt網絡模塊的實際應用。 二、項目結構 55.pro&#xff1a;Qt工程文件&#xff0c;配置模塊與源碼文件main…