《龙虾OpenClaw系列:从嵌入式裸机到芯片级系统深度实战60课》041、虚拟内存与MMU——页表管理与地址转换
OpenClaw系列041:虚拟内存与MMU——页表管理与地址转换一次让我熬夜到凌晨三点的MMU故障去年做一款基于Cortex-A7的工业控制器,板子跑起来后,DMA搬运的数据总是莫名其妙地错位。用逻辑分析仪抓总线,发现DMA写的是物理地址0x8000_0000,但CPU读到的却是0x8000_1000——整整偏移了4KB。查了三天,最后发现是MMU的页表配置里,一个二级页表的粒度写错了,导致虚拟地址到物理地址的映射偏移了一个页面。从那以后,我养成了一个习惯:每次调试MMU相关代码,第一件事就是打印当前页表基地址和TTBCR寄存器。虚拟内存:不是“虚拟”的,是“隔离”的很多嵌入式工程师觉得“裸机不需要虚拟内存”,这个观点在跑Linux时当然成立,但当你开始做AMP(非对称多核)或者需要保护关键内存区域时,虚拟内存就是你的防火墙。MMU做的不是“把内存变多”,而是“给每个任务一个独立的内存视图”。举个实际例子:你的系统里同时跑着实时控制任务和网络协议栈,如果不做隔离,网络栈的一个野指针就能把控制任务的实时数据踩掉。有了MMU,控制任务看到的是0x0000_00000x0000_FFFF,网络栈看到的是0x1000_00000x1000_FFFF,物理上它们可能交错分布在DDR的不同bank里,但谁也不知道谁的存在。页表:MMU的“翻译词典”MMU做地址转换靠的是页表,页表本质上是存放在内存里的一个多级索引结构。以ARMv7-A为例,典型的配置是两级页