065、Zephyr RTOS内核基础:内存管理之内存域
Zephyr RTOS内核基础:内存管理之内存域从一次诡异的HardFault说起去年调试一个多传感器采集节点,跑Zephyr 2.7,任务间通过共享内存传递数据。代码跑着跑着就进HardFault,复位后有时能撑半小时,有时三分钟就挂。最头疼的是——同样的二进制,换一块板子就稳定。当时我盯着MPU配置看了三天,直到发现一个细节:两个不同优先级的线程,都在往同一个内存区域写数据,但其中一个线程的栈空间恰好和共享缓冲区在同一个内存域(Memory Domain)里。Zephyr的内存域隔离机制,在MPU使能后,会严格限制线程对域外内存的访问——哪怕那个地址物理上存在,只要不在当前线程的域里,一碰就挂。这个坑让我意识到:内存域不是“高级特性”,而是MPU安全模型的核心骨架。不理解它,多任务下的内存保护就是纸糊的。内存域到底是什么简单说,内存域是一组内存区域的集合,这些区域被绑定到特定线程或线程组。Zephyr的MPU(Memory Protection Unit)会根据当前线程所属的内存域,动态切换访问权限。和Linux的VMA不同,Zephyr的内存域更轻量——它不管理虚拟地址映射,只管理物理地址的访问许可。每个域包含若干k_mem_partition,每个分区定义一段连续的物理地址空间及其权限(读/写/执行)。关键点:一个线程只能属于一个内存域。线程切换时,MPU配置会跟着切换。这意味着,线程A的栈、堆、数据段,线程B默认是碰