特权态与 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 时先验证的最小闭环¶
mtvec指向可执行、地址翻译前可访问的 handler;- 主动触发
ecall/illegal instruction,确认mepc/mcause/mtval; - handler 保存现场、修正或推进
mepc,执行mret; - 再分别打开 timer/software/external interrupt;
- 最后测试 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。