先來(lái)個(gè)生活比喻:
假如你網(wǎng)購(gòu)商品??:
一、內(nèi)存尋址的挑戰(zhàn)
程序直接操作物理內(nèi)存會(huì)引發(fā)災(zāi)難:
// 危險(xiǎn)操作:直接寫(xiě)物理地址
*(0x0000FFFF) = 100; // 可能覆蓋操作系統(tǒng)代碼!
問(wèn)題?:
多程序可能互相覆蓋內(nèi)存(A程序破壞B程序數(shù)據(jù))
無(wú)法保證內(nèi)存隔離與安全
程序需知道物理布局才能運(yùn)行(移植性差)
解決方案:
引入地址空間抽象層,讓程序活在"虛擬世界"!
二、邏輯地址:程序眼中的"虛擬世界"
特點(diǎn):
程序員/編譯器看到的地址(如0x401000)
連續(xù)的地址空間(從0到最大值)
每個(gè)程序獨(dú)占自己的邏輯地址空間
// C語(yǔ)言代碼中的地址都是邏輯地址
int num = 10;
printf("變量地址:%p\n", &num); // 輸出類(lèi)似0x7ffd4a3b2c
邏輯地址空間布局:

三、物理地址:硬件的"真實(shí)坐標(biāo)"
特點(diǎn):

關(guān)鍵區(qū)別:
邏輯地址是連續(xù)的虛擬序列,物理地址是離散的硬件位置!
四、為什么需要雙重地址?
四大核心需求:
內(nèi)存保護(hù):防止程序越界訪問(wèn)(如A程序無(wú)法修改B程序數(shù)據(jù))
內(nèi)存擴(kuò)展:運(yùn)行比物理內(nèi)存更大的程序(虛擬內(nèi)存技術(shù))
程序重定位:相同程序可加載到任意物理位置
簡(jiǎn)化開(kāi)發(fā):程序員無(wú)需關(guān)心物理內(nèi)存布局
五、地址轉(zhuǎn)換:MMU的魔法
內(nèi)存管理單元(MMU) 負(fù)責(zé)實(shí)時(shí)轉(zhuǎn)換:

轉(zhuǎn)換過(guò)程詳解:
CPU生成邏輯地址(代碼中看到的地址)
MMU通過(guò)頁(yè)表/段表查詢(xún)映射關(guān)系
計(jì)算得到物理地址(硬件實(shí)際位置)
內(nèi)存控制器訪問(wèn)對(duì)應(yīng)物理位置
六、兩種轉(zhuǎn)換機(jī)制對(duì)比
1. 分段機(jī)制(早期方案)
// 段寄存器存儲(chǔ)基址
struct Segment {
uint32_t base; // 段基址
uint32_t limit; // 段長(zhǎng)度
};
// 轉(zhuǎn)換過(guò)程
physical_address = segment.base + logical_address;
缺點(diǎn):易產(chǎn)生內(nèi)存碎片
2. 分頁(yè)機(jī)制(現(xiàn)代方案)

頁(yè)表示例(4KB頁(yè)):

七、代碼實(shí)戰(zhàn):觀察地址轉(zhuǎn)換
C程序查看地址:
#include <stdio.h>
int global; // 全局變量(數(shù)據(jù)段)
int main() {
int stack = 0; // 棧變量
int *heap = malloc(sizeof(int)); // 堆變量
printf("代碼段地址:%p\n", main);
printf("數(shù)據(jù)段地址:%p\n", &global);
printf("堆地址:%p\n", heap);
printf("棧地址:%p\n", &stack);
free(heap);
return 0;
}
/* 輸出示例:
代碼段地址:0x401520
數(shù)據(jù)段地址:0x404000
堆地址:0x1e8b260
棧地址:0x7ffd4a3b2c
*/
Python查看內(nèi)存映射
# Linux查看進(jìn)程內(nèi)存映射
$ pmap -x <pid>
# 輸出示例:
Address RSS Mode Mapping
0000555555554000 4K r-x-- main # 代碼段
0000555555755000 4K rw--- [heap] # 堆
00007ffff7a00000 1800K r---- libc.so.6
00007ffff7dd6000 16K rw--- [stack] # 棧
八、物理地址 vs 邏輯地址 終極對(duì)決

九、總結(jié)
邏輯地址 = 程序的"虛擬門(mén)牌號(hào)"(開(kāi)發(fā)者可見(jiàn))
物理地址 = 內(nèi)存的"真實(shí)GPS坐標(biāo)"(硬件使用)
MMU = 實(shí)時(shí)地址轉(zhuǎn)換的"魔法翻譯官"
分頁(yè)機(jī)制 = 現(xiàn)代系統(tǒng)的內(nèi)存管理基石
參考文章:原文鏈接?
該文章在 2025/11/3 10:33:49 編輯過(guò)