Linux内存管理 —— 为buddy做准备:MMU, TLB, ZONE

本文详细介绍了Linux系统中MMU的角色,如何通过虚拟地址访问物理内存,以及页表和TLB在提高转换效率方面的作用。此外,还探讨了内存ZONE的划分,包括DMA ZONE和HIGHMEM ZONE的用途,以及它们在不同内存大小和硬件限制下的应用场景。
摘要由CSDN通过智能技术生成

本文都是假设系统是32位,页大小为4KB,基于ARM架构(不过和体系结构相关的内容不多)。

1. 了解MMU

在启用MMU的Linux内核中,CPU是通过虚拟地址来访问物理内存的。MMU(Memory Management Unit),即内存管理单元,它集成在CPU中,负责虚拟地址到物理地址的映射,以及物理地址的访问,并提供内存访问权限检查机制,以达到内存保护的作用(ARM里面的MPU(Memory Protection Unit)也可以做内存保护,但不能做虚拟内存映射)。

一旦启动MMU,CPU就只通过虚拟地址访问内存了。虚拟地址通过页表找到其映射的物理地址,前面已经讲过,根据页号和页内偏移找到物理地址。页表的起始地址要告知MMU,这样,CPU访存的时候,MMU拿到虚拟地址,查找页表找到其物理地址,然后访问(读/写等)物理内存或cache。

这里写图片描述

由于每个进程都有自己的虚拟地址空间,因此每个进程要有自己独立的页表。在进程切换时,就要向MMU更新页表的起始地址。在ARM中,页表的起始地址就存放在TTB(Translation table base)寄存器中,在进程切换时,通过$(CPU_NAME)_switch_mm(),如cpu_v7_switch_mm来更新页表的base pointer,实际上就是协处理器的操作。

如上所说,页表是有权限管理的,权限也存放于页表中,包括RWX权限和kernel/user+kernel权限(权限都是以页即4KB为单位的),例如你试图对const变量或代码段进行写操作,而页表中这些页的权限是只读,就会发生page fault,导致应用程序段错误。
MMU找不到对应的物理地址或权限不对,都会触发page fault异常,当然不是所有pag

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值