Linux物理地址空間入門:從硬件到內核內存的基石

目錄

一、物理地址空間是什么?

二、物理地址空間的構成:不僅僅是內存

三、Linux內核如何管理物理地址空間

(1)物理內存的碎片化問題

(2)物理地址的分區管理

(3)物理地址與內核的直接映射

四、物理地址和虛擬地址的關系? ?


一、物理地址空間是什么?

? ? ? ? 對于剛剛接觸Linux的新手而言,物理地址空間是理解內存的第一道門檻。他是硬件與內核交互的核心紐帶,也是程序最終運行時候的真實地點。

? ? ? ? 簡單來說,物理地址空間是硬件層面的“內存地圖”,他主要是由cpu和內存控制器定義的,可以直接訪問的地址范圍。就好比有許多個格子,每一個編號對應一個格子,這個編號就是物理地址。

? ? ? ? 物理地址空間有兩個關鍵特性:

(1)硬件決定性:地址范圍由CPU位數和內存控制器決定。比如32位CPU理論上最大支持4GB的物理地址空間,因為他有32根地址線,2^32次方剛好對應4GB的編號。而64位CPU目前理論值遠超實際硬件的地址范圍,主流硬件支持48位物理地址,即256TB。

(2)直接關聯性:物理地址直接對應硬件存儲單元,CPU可以通過物理地址直接訪問這些硬件資源,而不需要額外的地址轉換或映射。(因為許多硬件廠家就預定了物理地址范圍,即CPU只能去這些地址訪問,否則硬件識別不了)

二、物理地址空間的構成:不僅僅是內存

? ? ? ? 很多人在學習的時候,會誤認為物理地址空間僅僅對應我們插在主板上的內存條,但實際上他包含了計算機中所有需要通過硬件訪問的硬件資源,主要分為以下幾類:

(1)DRAM動態隨機存取存儲器:就是我們平常說的內存,是物理地址空間中最為核心的部分,用于臨時存放程序的數據和程序。他的特點是可讀可寫,速度快,掉電丟失。

(2)ROM/Flash:用于存儲固件程序(如BIOS、UEFI等)在計算機啟動的時候,CPU會從ROM的固定物理地址開始執行程序(在計算機啟動的時候,CPU還沒有加載操作系統,它不知道自己應該從哪里開始執行,所以必須預設一個固定地址,從這里開始初始化硬件,并加載操作系統)。這部分地址通常是只可讀的(或者在燒錄的時候可寫)

(3)外設地址空間:計算機的顯卡、網卡等外設。他們的控制寄存器和數據緩沖區也會被映射到物理地址空間中。例如CPU向網卡發送數據的時候,實際上是向物理地址空間的某個特定地址寫入數據。

????????雖然他們都是物理地址空間的構成部分,但是我們說了CPU由于地址線的限制,比如32位CPU只能尋址到4GB空間,所以他們一定是屬于這4GB的一部分。

? ? ? ? 當然我們這里說的是內存映射方式,至于IO映射方式不在物理地址空間的4GB中,我們更多使用的是內存映射,這里不再討論IO映射。

為什么硬件必須有自己廠商固定好的地址?

? ? ? ? 其一,在早期沒有操作系統的時候,不存在虛擬地址空間、頁表等說法,所以CPU在執行的時候直接操作的就是物理地址(比如單片機)。但是各個硬件設備如果沒有規定好的地址范圍,可能網卡、和鍵盤起沖突了,都規定在了同樣的地址上,那么此時CPU訪問該物理地址就不知道是誰了。所以形成了一種約定,什么設備應該放在什么地址,如果不遵守這個規則,CPU就無法通過BIOS程序寫死的地址中找到對應的硬件設備。

????????其二,CPU在上電之后會執行BIOS程序,在這個程序之中,首先要做的就是硬件檢測,看看這些硬件設備能不能正常運行,有沒有哪里損壞。這個過程中還沒有加載操作系統,所以不可能存在虛擬地址以及頁表的概念。之后才會進行硬件初始化,加載引導程序開始加載操作系統,并將控制權從BIOS交給操作系統。

? ? ? ? 但并非所有的硬件都是CPU直接通過物理地址訪問(雖然硬件只認物理地址)。一般對于需要快速響應的設別,CPU會直接通過物理地址的對應設備的寄存器其訪問,減少了頁表這一層轉換,提高了效率。

? ? ? ? 然而對于大塊硬件資源(啟動的時候仍然是通過物理地址),如顯卡的顯存、網卡的緩沖區,因為對于大量的數據信息,可能該設備的寄存器根本不夠用,比如要渲染某個游戲畫面,往往需要幾個GB的數據。

????????操作系統會給這些物理地址分配一個虛擬地址,然后通過頁表映射到實際物理地址。這樣做的好處是應用程序不需要知道物理地址,只需要操作虛擬地址,且操作系統可以通過頁表權限控制防止應用程序錯誤修改硬件資源。

三、Linux內核如何管理物理地址空間

????????物理地址是硬件資源,而操作系統的任務就是高效、安全的管理這些資源。其管理邏輯主要圍繞著以下幾個關鍵點展開:

(1)物理內存的碎片化問題

? ? ? ? 物理內存由連續的頁框(通常為4kb)組成,就好像一張張A4紙,每次使用和回收的時候,由MMU內存管理單元一頁一頁的分配,但是實際軟件的數據可能并不存放在一張A4紙中,即兩張各存一部分。如果頻繁的申請內存以及釋放,就會導致碎片問題,即存在大量的頁都被一部分小數據占用,就好像每張A4紙寫幾個孤零零的字,由于他們已經被使用了,所以不能被回收成完整的大頁。也就是不能申請很大的連續空間,比如1MB的連續空間。

? ? ? ? 為了解決這個問題,Linux內核采用伙伴系統來管理空閑頁。就和我們之前做過的一個項目tcmalloc類似的內存池技術類似。

(1)把空閑頁按照1、2、4、8這種形式分組,每一組稱為一個伙伴塊

(2)當需要分配 n 頁內存時,尋找最小的、大于等于 n 的伙伴塊,若塊過大則拆分;釋放時若相鄰塊空閑則合并。

(2)物理地址的分區管理

????????內核會將物理地址劃分為不同的區域,針對不同區域采取不同的管理策略

(1)ZONE_DMA:直接內存訪問(DMA)區域,地址范圍較低(通常 16MB 以下),供需要 DMA 傳輸的外設使用(如老式硬盤控制器)。

(2)ZONE_HIGHMEM:高端內存區域(32 位系統中超過 896MB 的部分),內核不能直接映射,需要通過臨時映射機制訪問(64 位系統因地址空間充足,通常無需此區域)。

之所以直接的線性映射區只有896MB,是因為剩余的128MB需要留給其他用途,如映射IO設備的物理地址、內核自身的代碼數據等。

(3)ZONE_NORMAL:常規可直接映射區域,內核可以直接訪問的物理內存(32 位系統中通常為 1GB 左右)。常規映射區域是給內核使用的,內核范圍是3GB-4GB。所以這部分的虛擬地址=物理地址0-896MB+3GB。

(3)物理地址與內核的直接映射

????????Linux 內核自身需要快速訪問物理內存,因此會將物理地址空間的一部分(通常是 ZONE_DMA 和 ZONE_NORMAL)直接線性映射到內核虛擬地址空間中。例如,物理地址 0x100000 會被映射到內核虛擬地址 0xC0100000(32 位系統)(物理地址增加3GB),這種映射是固定的、一對一的,內核通過簡單的地址計算就能訪問物理內存,無需復雜的頁表查詢。

四、物理地址和虛擬地址的關系? ?

  • 物理地址空間是 “倉庫的真實貨架編號”,每個編號對應唯一的貨架位置,倉庫管理員(內核)必須知道它才能找到貨物。?
  • 虛擬地址空間是 “給客戶的取貨編號”,客戶(用戶程序)只需要記住這個編號,無需關心貨物實際放在哪個貨架。?
  • 即客戶來取貨的時候,只能通過倉庫管理員。而倉庫管理員掌握了一張頁表,知道用戶取貨編號和倉庫真實編號的映射關系。

兩者的映射關系由內核通過頁表維護:用戶程序使用虛擬地址訪問內存時,CPU 的內存管理單元(MMU)會根據頁表將虛擬地址轉換為物理地址,最終訪問實際的硬件內存。這種機制的好處是:?

  • 隔離進程:每個進程都有獨立的虛擬地址空間,互不干擾。?
  • 靈活利用內存:即使物理內存不足,也能通過 swap 分區(虛擬內存)暫時存儲數據。?
  • 安全性:用戶程序無法直接訪問物理地址,防止惡意程序破壞系統。

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

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

相關文章

【2025最新版】PDFelement全能PDF編輯器

工具https://pan.quark.cn/s/a56d17fd05dd強大全能的PDF編輯神器PDFelementPro 全能PDF工具套裝 PDF閱讀器 PDF創建器 PDF編輯器 PDF注釋器 PDF轉換器 OCR識別工具 表單填寫和創建 數據提取 批量處理 更多詳情萬興PDF專業版特性。格式轉換:PDFelement輕松…

基于單片機汽車駕駛防瞌睡防疲勞報警器自動熄火設計

(一)系統功能設計 51單片機汽車駕駛防疲勞防瞌睡報警器自動熄火15 本系統由STC89C52單片機、蜂鳴器、ADXL345重力加速度傳感器、繼電器控制、按鍵、指示燈及電源組成。 1、通過按鍵點亮led燈,代表車輛啟動和熄火。 2、車輛啟動后,…

OpenCV中的卷積高斯模糊與中值模糊

目錄 一、卷積高斯模糊 (Gaussian Blur) 1. 原理與數學基礎 2. OpenCV函數實現 3. 關鍵參數說明 4. 代碼示例 5. 特點與應用 二、中值模糊 (Median Blur) 1. 原理與數學基礎 2. OpenCV函數實現 3. 關鍵參數說明 4. 代碼示例 5. 特點與應用 三、兩種模糊方法對比分析…

macbookpro m1 max本兒上速搭一個elasticsearch+kibana環境

一、找個目錄,新建一個: docker-compose.yml version: "3.9" services:elasticsearch:image: docker.elastic.co/elasticsearch/elasticsearch:8.13.0 # 與 Kibana 版本一致container_name: elasticsearchenvironment:- discovery.typesingle-node- xpa…

部署zabbix企業級分布式監控

一. 監控系統的功能概述監控、從中文的字義來看,有兩個內容,一是檢測,二是控制。重點在第一個字眼,即檢測、預防的意思。監控,對應的英文單詞是 Monitoring。在計算機領域,可以將其分為5種監控類型。應用性…

【重學MySQL】redolog binlog

目錄 Buffer Pool是什么? redo log(Innodb獨有) 為什么需要redolog? 類比的方式巧記redolog binlog(Server層獨有) binlog是干啥的? 為什么有了 binlog, 還要有 redo log&…

企業信息化建設技術底座建設解決方案

1、企業數字化底座與數字化綜述2、企業數字化底座與數字化總體架構3、企業數字化底座與數字化規劃設計4、企業數字化底座與數字化建設運營5、企業數字化底座與數字化未來展望篇幅有限以下只展示部分截圖:

Spring Cloud Alibaba 之 Nacos

Spring Cloud Alibaba 之 Nacos . Nacos官方文檔: https://nacos.io/docs/latest/overview/?spm5238cd80.47ee59c.0.0.770fcd36HoVbU6 1.什么是Nacos Nacos(Dynamic Naming and Configuration Service)是阿里巴巴開源的一款動態服務發現、…

Car Kit重構車機開發體驗,讓車載應用開發駛入快車道

在智能座艙成為汽車行業“新四化”核心戰場的今天,開發者們正面臨這樣的挑戰:如何讓手機應用快速適配車機場景?如何實現手機與車機無感流轉?如何在保障駕駛安全的前提下提供沉浸式交互體驗? HarmonyOS SDK 車服務&…

ruoyi-flowable-plus Excel 導入數據 Demo

📁 項目結構簡述 ruoyi-flowable-plus 是基于 RuoYi 的擴展項目,使用: 后端:Spring Boot MyBatis Flowable前端:Vue.js 📥 Excel 導入功能 Demo 以導入用戶數據為例,展示完整導入流程。 …

kafka 日志索引 AbstractIndex

AbstractIndexAbstractIndex 是 Kafka 日志(Log)子系統中一個至關重要的基礎類。它為 Kafka 的各種索引文件(如偏移量索引 .index 和時間戳索引 .timeindex)提供了一個統一的、抽象的框架。這個類的設計目標是實現極高的讀寫性能和…

重學前端008 --- 響應式網頁設計 CSS 無障礙 Quiz

文章目錄meta 總結html 頁面結構img 尺寸子選擇器 >a 錨點僅屏幕閱讀器可見li 元素的懸停設置小屏幕防止溢出meta 總結 <head><!-- 基礎字符編碼聲明 --><meta charset"UTF-8"><!-- 視口設置&#xff0c;響應式設計必備 --><meta nam…

C# 調用CodeSoft模板打印標簽,編輯模板覆蓋根目錄的文件,不能拷貝

C# 調用CodeSoft模板打印標簽&#xff0c;編輯模板覆蓋根目錄的文件&#xff0c;不能拷貝&#xff0c;報文件已經打開。 原因&#xff1a;C#窗體關閉時&#xff0c;沒有關閉LabelManager2.ApplicationClass labApp&#xff0c;別忘記寫labApp1.Quit(); if (labApp1 ! null) {la…

Logback簡單使用

Logback 日志框架介紹 正如你所知&#xff0c;開發者擁有大量日志工具可供選擇。本節中&#xff0c;我們將學習一個非常流行的日志庫 —— Logback。它是 Log4j 日志庫的繼任者&#xff0c;基于相似的理念構建。Logback 在同步和異步日志記錄方面都非常快速&#xff0c;并提供了…

Python爬蟲實戰:研究langid.py庫相關技術

一、引言 在當今全球化的網絡環境下,互聯網上的內容呈現出多語言的特點。對于許多自然語言處理 (NLP) 任務,如文本分類、情感分析和信息檢索,準確識別文本的語言是首要步驟。網絡爬蟲作為獲取互聯網內容的重要工具,結合語言識別技術,可以為多語言信息處理提供豐富的數據來…

打車代駕 app 派單接單系統模塊搭建

一、邏輯分析打車代駕 APP 的派單接單系統模塊是整個應用的核心部分&#xff0c;它需要高效、準確地處理訂單分配和司機接單流程&#xff0c;以確保用戶能夠快速得到服務&#xff0c;司機能夠合理地接到訂單。用戶端下單邏輯&#xff1a;用戶打開 APP&#xff0c;輸入出發地、目…

Java Stream API性能優化:原理深度解析與實戰指南

Java Stream API性能優化&#xff1a;原理深度解析與實戰指南 技術背景與應用場景 隨著大數據量處理和高并發場景的普及&#xff0c;傳統的集合遍歷方式在代碼可讀性和性能上逐漸顯現瓶頸。Java 8引入的Stream API&#xff0c;通過聲明式的流式編程極大提升了開發效率和可讀性&…

Nginx配置proxy protocol代理獲取真實ip

Nginx配置proxy protocol 文章目錄Nginx配置proxy protocol前言一、PROXY Protocol協議二、配置方法代理服務器配置http模塊代理??Stream 模塊?代理測試配置是否生效端口檢查測試ip記錄驗證http驗證tcp注意事項和理解誤區應用程序機器配置總結前言 在現代開發中有很多場景需…

什么是商業智能BI數據分析的指標爆炸?

指標爆炸這個詞大家可能都是第一次聽說&#xff0c;指標怎么會爆炸呢&#xff1f;其實這個是我們很多年前在一些商業智能BI項目上總結出來的一種場景或者現象&#xff0c;就是過于的開放給業務人員在BI自助分析過程中創造了很多衍生性的分析指標&#xff0c;結果就造成了前端指…

Spring AI 系列之十八 - ChatModel

之前做個幾個大模型的應用&#xff0c;都是使用Python語言&#xff0c;后來有一個項目使用了Java&#xff0c;并使用了Spring AI框架。隨著Spring AI不斷地完善&#xff0c;最近它發布了1.0正式版&#xff0c;意味著它已經能很好的作為企業級生產環境的使用。對于Java開發者來說…