ARMv7-A小系统实践(十二):用QEMU和GDB把整条实现链验清楚

本章记录什么

最后一章不再增加新的架构功能,而是把整条系统路径重新走一遍,并建立一套可复用的验证与排错方法。目标是让“能够运行”变成一组可以复查的证据:ELF 段与符号正确,启动输出按阶段出现,任务切换有双向进展,Timer IRQ 能重复触发,设备清源与 EOI 都发生,MMU/Cache 状态可读,CPU1 能完成 SGI 往返。

在这一章之前做了什么

前十章已经依次建立处理器状态、ABI、启动、协同上下文、异常现场、GIC/Timer、抢占、MMU、Cache 和双核底座。系统越完整,故障越不适合靠“多加几行打印”猜测,因为串口本身可能不可重入,读取 IAR 还有副作用,Cache 又可能让共享状态的观察滞后。

本章按照静态检查、分层断点、寄存器观察、串口证据和已知 Bug 五条线组织。文章末尾给出能力边界,避免把教学闭环夸大成完整产品操作系统。

ARMv7-A小系统实践(九):用短描述符页表建立MMU与内存保护

本章记录什么

这一章建立 ARMv7-A short-descriptor MMU 的最小可用映射。内容从虚拟地址的拆分开始,解释 16 KiB 一级表、粗页表、Section 与 Small Page 描述符,然后把链接脚本中的代码、只读数据、可写数据、栈、页表和 MMIO 映射成不同权限与内存类型。

在这一章之前做了什么

前面的启动、上下文和中断仍可在 MMU 关闭时运行,但所有地址都只有“数值”,缺少权限与类型约束。打开 Cache 前更不能回避这一层:同一物理区域被标成 Normal Memory 还是 Device Memory,会直接改变访问排序、缓存和推测行为。

本章采用恒等映射降低早期调试难度,但不会把恒等映射误解为“没有地址转换”。文章给出页表构造代码、开启顺序、PAR 验证方式和常见故障定位。

ARMv7-A小系统实践(二):处理器模式、寄存器组与CPSR

本章记录什么

这一章解释 ARMv7-A 程序最先遇到的一组概念:处理器模式、可见寄存器、banked 寄存器、CPSR 和 SPSR。目标不是背诵一张寄存器表,而是能够回答三个工程问题:为什么启动代码要多次切换模式设置 sp,为什么 IRQ 到来后同名的 lrsp 会指向另一份物理寄存器,以及异常返回时为什么必须同时恢复程序地址和处理器状态。

在这一章之前做了什么

上一章确定了整个小系统的能力边界和资料分工,但还没有进入任何一条具体执行路径。现在从 CPU 的“当前身份”开始,因为启动、异常和调度最终都要落到寄存器可见性上。若这一层没有建立,看到 cps #0x12mrs r0, spsrrfeia 时只能记住指令表面,无法解释状态为什么能够恢复。

本章会先建立模式与寄存器组的基础,再把规则放进启动代码和一次 IRQ 中推演,最后列出可以在调试器里验证的观察点。任务切换只在结尾用于对比,不会提前混入。

ARMv7-A小系统实践(一):从Cortex-A9与Zynq-7020开始

本章记录什么

这一章不急着写第一条汇编,而是先回答一个更容易被忽略的问题:要在 ARMv7-A、Cortex-A9 和 Zynq-7020 上做出一个能启动、能切换任务、能响应中断的小系统,究竟需要建立哪些知识和软件部件?如果一开始不把层次分清,后面很容易把 ARMv7-A 的架构规定、Cortex-A9 的实现细节和 Zynq-7020 的片上地址混成一张表,遇到故障时也不知道该查哪一本手册。

本系列的目标不是照抄一份现成工程,也不是把 x86_64 汇编逐行翻译成 ARM 汇编。真正要迁移的是系统能力:处理器从复位入口进入 C 环境,任务拥有独立栈和可恢复现场,定时器能够触发 IRQ,GIC 能够完成中断状态闭环,MMU 与 Cache 按内存属性工作,第二个处理器核能够被安全释放。每一项能力都要给出可观察证据和明确边界。

在这一章之前做了什么

动手前已经具备一个很小的 x86_64 参考系统和两套 ARM 侧参照:一套是按同样功能合同搭建的 Zynq-7020 教学实现,另一套是 RTEMS 6.2 的成熟 ARM 端口。前者适合看最小闭环,后者适合验证设计方向。官方架构手册、Cortex-A9 MPCore 技术参考手册和 Zynq-7000 技术参考手册负责裁决寄存器和硬件语义。

接下来的文章会从处理器模式开始,逐步走到 ABI、启动、任务上下文、异常现场、GIC、抢占、MMU、Cache、SMP 和调试。读者只看博客也能顺着这条链完成推演;文中出现的源码路径只用于说明工程如何组织,不作为理解前提。


:D 一言句子获取中...