Linux 内存管理单元 MMU

前言:Linux系统中的一个重要概念 ------ 内存管理单元,也叫MMU。今天我们来通俗易懂的解释一下这MMU的工作机制。

目录

一、什么是MMU

二、分页机制

三、地址转换过程

四、用"借书"来比喻


一、什么是MMU

内存管理单元(MMU)是中央处理器(CPU)与主内存之间的关键桥梁 ,它负责将程序所使用的++虚拟地址++ (逻辑地址)转换为实际的++物理地址++。

虚拟地址:在 Linux 上,每个进程拿到的都是"虚拟地址空间"(比如 0--4GB(32位),64 位更大)。

物理地址:内存条上真实的地址叫做"物理地址"。

二、分页机制

MMU的"单位"是页。MMU 不是"一个字节一个字节"地翻译,而是"分页"。分页将虚拟地址空间划分为固定大小的块,称为页 ,常见的页大小为4KB。又将物理内存划分为固定大小的块,称为页框。

每个虚拟页通过页表映射到一个物理页框。页表中除了存储映射关系外,还包含一些控制位,如权限位和存在位。

bash 复制代码
typedef struct {
    unsigned long pfn; // 物理页框号
    unsigned int present : 1; // 页表项是否存在
    unsigned int rw : 1; // 读/写权限
    unsigned int us : 1; // 用户权限
    // 其他控制位
} PageTable;

多级页表:随着虚拟地址空间的增大,单级页表会占用大量内存。为了减少内存占用并提高灵活性,Linux 使用多级页表结构。x86架构中,通常使用四级页表。

三、地址转换过程

MMU将虚拟地址分为页号 和页内偏移 两部分。当进程访问一个虚拟地址时,MMU会根据虚拟地址页号 去页表中查找,得到对应的物理页号 ,然后将物理页号与页内偏移组合,形成完整的物理地址,最就能够访问真实的物理地址了。

为帮助理解,这里举一个非常简易的例子:

bash 复制代码
============================================
; 单级页表虚拟地址转换演示
;'页大小:4KB(12位偏移)
============================================
mov ecx, eax            ; 保存原始虚拟地址到 ECX
shr eax, 12             ; 提取虚拟页号(虚拟地址 >> 12)

; 计算页表项地址
mov ebx, page_table_base ; EBX = 页表虚拟地址(假设已设置)
mov edx, [ebx + eax*4]   ; EDX = 页表项(PTE)
    
; 检查页是否存在(P位)
test edx, 0x1           ; 测试Present位(bit 0)
jz .page_not_present    ; 如果为0,页不存在
    
; 提取物理页框号
and edx, 0xFFFFF000     ; 清除低12位标志位,保留物理页框号
    
; 计算物理地址
and ecx, 0xFFF          ; ECX = 页内偏移(原始虚拟地址低12位)
or eax, edx             ; EAX = 物理页框号
or eax, ecx             ; EAX = 物理页框号 | 偏移 = 完整物理地址

四、用"借书"来比喻

假如你去图书馆借书:

CPU = 你

虚拟地址 = 书编号

物理地址 = 图书馆仓库

MMU +页表 = 借书管理系统(包含书编号与实际所在仓库位置的对应关系等)

写在最后 :本文采用通俗易懂的方式解释了MMU的工作过程,旨在让大家快速理解入门,其中还有很多细节(如缺页异常处理 、**TLB(**转换旁路缓冲)技术)这里暂未涉及,感兴趣的童鞋可以继续深入研究。

相关推荐
像风一样的男人@21 分钟前
python --基于scp的文件传输助手
开发语言·python
一条破秋裤21 分钟前
SDIO Wi‑Fi 设备的驱动向insmod + 反向rmmod
开发语言·php
必须得开心呀24 分钟前
字节序大小端科普
c++·程序人生
m0_6399069427 分钟前
Java 重写 Override 与重载 Overload 区别、访问修饰符、static 关键字
java·开发语言
Evand J28 分钟前
【MATLAB例程】平面下,5基站对待定位点的定位。基于距离辅助下的AOA。完整代码下载链接
开发语言·matlab·平面·定位·导航·测距·aoa
云宏信息34 分钟前
超融合和存算分离怎么选?从性能、可靠性、扩展、成本四个维度讲述如何精准匹配架构选型 | 附企业降本轻量云方案
运维·服务器·架构·云计算
会编程的小孩38 分钟前
C++ 子集
c++
mounter62539 分钟前
深入理解 gccrs:GCC 如何实现 Rust 编译器,以及编译 Linux 内核面临的挑战
linux·驱动开发·rust
垚垚学技术_聚焦云原生40 分钟前
Ansible Playbook 进阶:when 条件、loop 循环、handlers 触发器落地
linux·ansible·自动化运维·devops
GIS数据转换器41 分钟前
基于CIM的城市智慧供热监管服务平台
java·大数据·开发语言·人工智能·后端·物联网·struts