Linux內存管理章節一:深入淺出Linux內存管理:從物理內存到ARM32的用戶與內核空間

引言

如果說操作系統是計算機的心臟,那么內存管理就是它的靈魂脈絡。它默默地工作在Linux內核的最底層,卻決定著整個系統的穩定性、安全性和性能。今天,我們將撥開迷霧,深入探索Linux內存管理的核心概念,并結合熟悉的ARM32架構,看看這些理論是如何在具體芯片上實踐的。

一、 內存管理在內核中的位置和作用

想象一下,如果沒有操作系統,多個應用程序同時運行會怎樣?它們可能會爭搶同一塊內存地址,導致數據互相覆蓋,最終系統崩潰。

Linux內核的內存管理(Memory Management, MM)子系統就是為了解決這些問題而存在的,它是內核中最復雜、最核心的子系統之一。

它的核心作用可以概括為:

  1. 抽象與虛擬化:為所有進程提供一套統一的、獨立的虛擬地址空間,讓每個進程都“自以為”獨享整個內存資源。這是內存管理的基石。
  2. 分配與回收:高效地響應內核和應用程序的內存申請請求(如mallockmalloc),并在適當的時候回收閑置內存。
  3. 隔離與保護:嚴格隔離內核空間與用戶空間,隔離不同用戶進程的空間。一個進程的崩潰不會影響整個系統或其他進程,極大地提升了系統穩定性。
  4. 優化與擴展:利用磁盤空間作為輔助(Swap),讓進程可以使用比實際物理內存更大的地址空間;并通過緩存(Cache)等技術來提升訪問速度。

可以說,內存管理是內核資源的“大管家”,負責所有資源的分配、調度和保護。

二、 物理內存 vs 虛擬內存

這是理解內存管理的第一道門檻。

物理內存(Physical Memory)
  • 是什么:這就是我們插在開發板或手機主板上的實際RAM芯片。例如ARM開發板上常見的512MB DDR RAM。
  • 特點
    • 地址是連續唯一的物理地址。CPU通過地址總線直接訪問。
    • 容量有限,且被所有進程和內核共享。
    • 直接管理物理內存非常困難,容易出現碎片化和沖突。
虛擬內存(Virtual Memory)
  • 是什么:它是一個抽象層,是Linux內核為每個進程提供的一個“幻象”。每個進程都認為自己獨享一塊從0開始的、連續的、巨大的(如3GB)內存空間。
  • 特點
    • 地址是虛擬地址,由進程使用。CPU在執行指令時使用的都是虛擬地址。
    • MMU(內存管理單元):這是硬件核心!ARM處理器內部的MMU負責在運行時將虛擬地址動態翻譯為物理地址。
    • 頁表(Page Table):翻譯所依賴的“地圖”,由內核維護,存儲在內存中。它記錄了虛擬頁到物理頁幀的映射關系。

它們之間的關系
虛擬內存就像是一本厚厚的作業本(虛擬地址空間),而物理內存是你手邊所有的草稿紙(物理內存)。你做作業時(進程運行),只需要關注作業本上的題目和頁碼(虛擬地址)。你的大腦(MMU)會根據需要,隨時把作業本上的內容安排到某張草稿紙(物理地址)上進行運算,這個過程對你來說是透明的。內核則是課代表,負責分配和回收草稿紙(管理頁表)。

三、 ARM32內核空間 vs 用戶空間內存布局

在Linux中,每個進程的4GB虛擬地址空間(32位系統)會被嚴格地劃分為兩部分:用戶空間內核空間。ARM32架構采用了一種經典的劃分方式:3:1分割

這意味著:

  • 0~3GB(0x0000 0000 ~ 0xBFFF FFFF):分配給用戶空間
  • 3GB~4GB(0xC000 0000 ~ 0xFFFF FFFF):分配給內核空間

讓我們結合ARM32來看一張經典的布局圖:

+----------------------+ 0xFFFF FFFF (4GB)
|     內核空間         |
|   - 內核鏡像         |    | 所有進程**共享**同一份內核空間映射
|   - 物理內存映射     |    | 運行在高端地址,具有最高權限(ARM的SVC模式)
|   - 內核棧           |    | 用戶進程無法直接訪問,否則會觸發段錯誤
|   - 設備寄存器映射   |    |
+----------------------+ 0xC000 0000 (3GB)
|                      |
|     用戶空間         |    | 每個進程**獨有**一份
|   - 代碼段 (.text)   |    | 運行在低端地址,權限受限(ARM的USR模式)
|   - 數據段 (.data)   |    |
|   - BSS段 (.bss)     |    |
|   - 堆 (Heap)        |    | 向上增長 (malloc)
|   - ...              |    |
|   - 內存映射段       |    | 加載動態庫、文件映射
|   - 棧 (Stack)       |    | 向下增長 (局部變量)
|   - 環境變量/參數    |    |
+----------------------+ 0x0000 0000
為什么這樣設計?
  1. 特權級與安全

    • ARM處理器有不同模式(USR, SVC, IRQ等)。用戶代碼運行在USR模式,權限最低,無法直接執行特權指令或訪問硬件。
    • 內核代碼運行在SVC模式,擁有最高權限。
    • 當用戶程序需要請求內核服務(如分配內存、讀寫文件)時,必須通過系統調用(如swi指令或svc指令)陷入內核。此時CPU會切換到SVC模式,并跳轉到內核空間的高地址端執行相應代碼。這個過程伴隨著地址空間的切換,但內核空間的部分始終存在。
  2. 效率

    • 內核空間被所有進程共享。這意味著內核的代碼和數據(如驅動、數據結構)只需要在物理內存中存在一份,就可以被所有進程使用,極大地節省了內存。
    • 進程切換時(上下文切換),只需要切換用戶空間的頁表,內核空間的頁表保持不變,效率很高。
ARM32的特殊考量

在ARM32上,物理內存到內核空間的線性映射通常從0xC000 0000開始。例如,物理地址0x1000 0000對應的內核虛擬地址可能就是0xC100 0000。這種固定偏移的映射方式使得內核訪問物理內存非常高效。

總結

Linux內存管理是一個龐大而精妙的系統。我們總結了三個核心點:

  1. 內存管理是內核的基石,負責抽象、分配、隔離和優化內存資源。
  2. 虛擬內存是提供給進程的“幻象”,通過MMU和頁表將其映射到寶貴的物理內存上,這是多任務管理的基石。
  3. 在ARM32上,采用3:1的地址空間劃分,通過硬件特權級和系統調用機制,嚴格且高效地隔離了用戶態和內核態,保障了系統的安全與穩定。

理解這些基礎概念,是后續學習分頁機制、內存分配器(Buddy, Slab)、換頁機制等更深入話題的關鍵。希望這篇博客能為你打開Linux內存管理的大門!

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

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

相關文章

ECMAScript (5)ES6前端開發核心:國際化與格式化、內存管理與性能

好的,我將根據【國際化與格式化】和【內存管理與性能】這兩個主題,為你生成詳細的課件內容,涵蓋概念、應用和實例。 📗 前端開發核心:國際化與格式化、內存管理與性能 1. 國際化與格式化 (Internationalization & …

3D 可視化數字孿生運維管理平臺:構建 “虛實協同” 的智慧運維新范式

3D 可視化數字孿生運維管理平臺通過 “物理空間數字化建模 實時數據動態映射 智能分析決策”,將建筑、園區、工業設施等物理實體 1:1 復刻為虛擬孿生體,打破傳統運維 “信息割裂、依賴經驗、響應滯后” 的痛點,實現從 “被動搶修” 到 “主…

DP-觀察者模式代碼詳解

觀察者模式: 定義一系列對象之間的一對多關系;當一個對象改變狀態,它的依賴都會被通知。 主要由主題(Subject)和觀察者(Observer)組成。 代碼實現 package com.designpatterns.observer;/*** 定…

1983:ARPANET向互聯網的轉變

一、ARPANET早期1969年誕生的ARPANET最初還算不上互聯網,不過在ARPANET構建之初就已經考慮了分組交換:1970年代的ARPANET:其實這個時候我就有疑問,TCP/IP是1983年1月1日更新到ARPANET的,但是1970年代的ARPANET已經連接全美的重要單…

自動化運維-ansible中的變量運用

自動化運維-ansible中的變量運用 一、變量命名規則 組成:字母、數字、下劃線。必須以字母開頭。 合法: app_port, web_1, varA非法: 2_var (以數字開頭), my-var (包含其他字符), _private (以下劃線開頭) 避免使用內置關鍵字:例如 hosts, tasks, name…

深入學習并發編程中的volatile

volatile 的作用 保證變量的內存可見性禁止指令重排序1.保證此變量對所有的線程的可見性,當一個線程修改了這個變量的值,volatile 保證了新值能立即同步到主內存,其它線程每次使用前立即從主內存刷新。 但普通變量做不到這點,普通…

使用Java獲取本地PDF文件并解析數據

獲取本地文件夾下的PDF文件要獲取本地文件夾下的PDF文件,可以使用Java的File類和FilenameFilter接口。以下是一個示例代碼片段:import java.io.File; import java.io.FilenameFilter;public class PDFFileFinder {public static void main(String[] args…

吳恩達機器學習補充:決策樹和隨機森林

數據集:通過網盤分享的文件:sonar-all-data.csv 鏈接: https://pan.baidu.com/s/1D3vbcnd6j424iAwssYzDeQ?pwd12gr 提取碼: 12gr 學習來源:https://github.com/cabin-w/MLBeginnerHub 文末有完整代碼,由于這里的代碼和之前的按…

Shell腳本一鍵監控平臺到期時間并釘釘告警推送指定人

1. 監控需求客戶側有很多平臺需要定期授權,授權后管理后臺才可正常登錄,為避免授權到期,現撰寫腳本自動化監控平臺授權到期時間,在到期前15天釘釘或其他媒介提醒。2. 監控方案2.1 收集平臺信息梳理需要監控的平臺地址信息&#xf…

華為HCIE數通含金量所剩無幾?考試難度加大?

最近網上很火的一個梗——法拉利老了還是法拉利,這句話套在華為HCIE數通身上同樣適用,華為認證中的華為數通和云計算兩大巨頭充斥著大家的視野里面,也更加廣為人知,但隨著時代的發展,華為認證體系的調整,大…

#數據結構----2.1線性表

在數據結構的學習中,線性表是最基礎、最核心的結構之一 —— 它是后續棧、隊列、鏈表等復雜結構的 “基石”。今天從 “是什么”(定義)到 “怎么用”(基本操作),徹底搞懂線性表的核心邏輯。 一、先明確&…

2508C++,skia動畫

gif動畫原理 先了解一下gif動畫的原理: gif動畫由一系列靜態圖像(或叫幀)組成.這些圖像按特定的順序排列,每一幀都代表動畫中的一個瞬間,幀圖像是支持透明的. 每兩幀之間有指定的時間間隔(一般小于60毫秒),gif播放器每渲染一幀靜態圖像后,即等待此時間間隔,依此邏輯不斷循環渲染…

AI + 機器人:當大語言模型賦予機械 “思考能力”,未來工廠將迎來怎樣變革?

一、引言1.1 未來工廠變革背景與趨勢在科技飛速發展的當下,全球制造業正站在變革的十字路口。隨著消費者需求日益多樣化、市場競爭愈發激烈,傳統工廠模式的弊端逐漸顯現。生產效率低下、難以適應個性化定制需求、設備維護成本高昂且缺乏前瞻性等問題&…

pinia狀態管理的作用和意義

1. 什么是狀態管理 狀態管理就是統一管理應用中的數據,讓數據在多個組件之間共享和同步。 // 沒有狀態管理 - 數據分散在各個組件中 // 組件A const user ref({ name: 張三, age: 25 })// 組件B const user ref({ name: 張三, age: 25 }) // 重復定義// 組件C c…

十四、STM32-----低功耗

一、電源框圖VDDA 供電區域,主要是 ADC 電源以及參考電壓,STM32 的 ADC 模塊配備獨立的供電方 式,使用了 VDDA 引腳作為輸入,使用 VSSA 引腳作為獨立地連接,VREF 引腳為提供給 ADC 的 參考電壓。電壓調節器是 STM32 的…

一篇文章帶你徹底搞懂 JVM 垃圾收集器

垃圾收集器是 JVM 內存管理的執行引擎,負責自動回收無用的對象內存。其設計核心是 權衡:主要是吞吐量和停頓時間之間的權衡。沒有“最好”的收集器,只有“最適合”特定場景的收集器。一、核心基礎:分代收集模型主流 HotSpot JVM 采…

服務器排故隨筆:服務器無法ssh遠程登錄

文章目錄服務器排故隨筆:服務器無法遠程登錄問題現象解決過程第一步:確認故障描述是否準確第二步:確認網絡是否有問題第三步:確認ssh服務是否有問題第四步:確認防火墻是否放行sshd服務第五步:試試萬能的“重…

Deeplizard深度學習課程(六)—— 結合Tensorboard進行結果分析

前言 Tensorboard最初是tensorflow的可視化工具,被用于機器學習實驗的可視化,后來也適配了pytorch。Tensorboard是一個前端web界面,,能夠從文件里面讀取數據并展示它(比如損失、準確率、網絡圖)。具體使用可…

C語言————實戰項目“掃雷游戲”(完整代碼)

無論是找工作面試,還是課設大作業、考研,都離不開實戰項目的積累,如果你能把一個項目搞明白,并且給別人熟練的講出來,即使你沒有過項目經歷,也可以說是非常加分的,下面來沉浸式體驗一下這款掃雷…

數據結構之加餐篇 -順序表和鏈表加餐

目錄一、鏈表分割二、隨機鏈表的復制總結一、鏈表分割 鏈表分割 題目描述的意思就如下圖: 也就是把1,2挪到前面,6,3,5挪到后面,前者的相對順序不發生改變 這里要想往后挪就要先遍歷,遍歷到6…