跳转至

特权态与 Bring-up

Bring-up 的主线可以压缩成一句话:从外部给定 reset vector 开始,在 M-mode 建立可控的异常、中断和地址翻译环境,再逐步把执行权交给 S/U 或 VS/VU。

Reset 到第一条指令

XSCore 顶层接收 reset_vector,经 MemBlock 内部旁路送到 Frontend;BPU 使用它初始化起始 PC。当前 CSR 实现把复位特权态初始化为 M-mode、虚拟化关闭。

源码入口:

核只负责执行,不等于完整启动平台

reset vector 指向什么 ROM、内存控制器何时可用、设备树如何提供、OpenSBI 或 bootloader 怎样装载,属于 SoC/仿真平台契约。调试时要把“核内错误”和 “平台地址图或设备模型错误”分开。

异常与中断入口

flowchart LR
  DETECT["Frontend / Decode / EXU / LSU<br/>发现异常"]
  ROB["ROB<br/>保存并仲裁最老事件"]
  IRQ["InterruptFilter<br/>pending · enable · delegation"]
  TRAP["TrapHandleModule<br/>cause · target privilege"]
  EVENT["TrapEntry M/MN/HS/VS/D<br/>写 xepc/xcause/xtval/status"]
  PC["mtvec / stvec / vstvec<br/>生成目标 PC"]
  FE["Frontend redirect<br/>重新取指"]

  DETECT --> ROB
  ROB --> TRAP
  IRQ --> TRAP
  TRAP --> EVENT
  EVENT --> PC
  PC --> FE

当前 NewCSR 把 ROB trap、InterruptFilter、delegation CSR、mtvec/stvec/vstvec 送入 TrapHandleModule,再由不同 TrapEntry event 更新相应状态。关键连线见 NewCSR.scala#L262-L460

Bring-up 时先验证的最小闭环

  1. mtvec 指向可执行、地址翻译前可访问的 handler;
  2. 主动触发 ecall/illegal instruction,确认 mepc/mcause/mtval
  3. handler 保存现场、修正或推进 mepc,执行 mret
  4. 再分别打开 timer/software/external interrupt;
  5. 最后测试 delegation 和 S/VS 路径。

一次只打开一种中断源。否则“中断未到”可能同时由设备 pending、IMSIC/CLINT 路由、mie/mip、全局 enable、delegation 或当前 privilege 决定。

CSR:不只是寄存器文件

CSR 指令会经历权限和只读检查;某些 CSR 写入还产生流水线副作用。当前实现把 machine、supervisor、hypervisor、virtual supervisor、debug、AIA、PMP/PMA 和 custom CSR 组合进映射。

软件调试 CSR 时要同时问:

  • 当前特权级和 V 位是否允许访问?
  • CSR 地址是否发生 S/VS 映射?
  • 写掩码、WARL/WPRI 规则是否改变了读回值?
  • 写入是否触发 redirect、TLB flush、状态开关或中断重评估?

例如写 satp/vsatp/hgatp 会设置刷新条件,源码见 NewCSR.scala#L973-L981

地址翻译路径

当前参数支持 Sv39/Sv48,以及 H 扩展下的 Sv39x4/Sv48x4 两阶段翻译。软件地址 访问大致经过:

VA
├── L1 TLB hit ───────────────┐
└── miss → Repeater/L2TLB/PTW ├→ GPA/PA → PMP/PMA/PBMT → ICache/DCache
              虚拟化时再做 G-stage ┘

关键软件动作与硬件含义:

软件动作 必须建立的硬件事实
写 PTE 后 sfence.vma 旧地址翻译不能继续命中 TLB/相关缓存
切换 satp 新 ASID/根页表生效,投机路径被正确刷新
修改 hgatp/vsatp VS 与 G-stage 组合翻译一致
配置 PMP/PMA 最终物理地址的访问许可和属性正确
访问 MMIO 不走普通 cacheable 路径,顺序和完成条件满足设备契约

源码从 cache/mmu 的 TLB、L2TLB、PTW、PMP/PMA 模块进入;XSCore.scala 则展示 CSR、sfence 和 前后端/MemBlock 之间的控制连线。

Fence、WFI 与系统事件

  • fence.i 连接后端与前端 ICache 控制,保证代码修改后重新取指;
  • sfence.vma 影响取指和数据侧地址翻译;
  • wfi 是否真正进入等待还受 CSR enable、pending interrupt 和核内安全条件约束;
  • L2 flush、MSI/IMSIC、CLINT time 通过顶层接口与 SoC 连接。

因此 bring-up 卡死在 WFI 附近时,要同时检查 WFI 请求、核是否确认 safe、待处理中断 是否能唤醒,以及平台中断是否真正送达。

分层调试清单

层级 最小测试 失败时优先观察
Reset/取指 固定地址死循环 reset vector、ICache/ITLB 请求、取指异常
基本执行 ALU/branch/stack commit PC、GPR 写回、redirect
Trap ecall/illegal/load fault ROB trap、xepc/xcause/xtval、target PC
Timer/IRQ 单一中断源 pending → enable → delegation → handler
MMU 一页恒等映射后再扩展 satp、TLB request/response、PTW、PTE 权限
Cache/内存 单核顺序访问再并发 LSU、DCache miss、uncache、总线 response
SMP/一致性 mailbox/锁/IPI fence、cache line ownership、IMSIC

每一层先用短、确定、可重复的测试闭环,再加入 Linux 或复杂 workload。