第十四周工作总结
第一部分:完成多系统间通讯设计文档
本周完成了JH7110多系统间通讯的详细设计文档,记录了embassy_preempt与Linux/StarryOS之间的通信机制设计。
工作目的
为JH7110的非对称多处理器配置设计完整的通信方案(初步),实现:
- hart0 (M态): embassy_preempt RTOS
- hart1-4 (S态): Linux/StarryOS
双系统间的高效、可靠通信。
工作成果
文档
在 blogs/docs/多系统间通讯.md 中的详细记录
设计了基于CLINT MSIP寄存器的IPI(处理器间中断)通信机制。
2. IPI通信机制
场景1:Linux → OpenSBI → embassy_preempt
Linux写消息到共享内存
→ SBI ecall调用
→ OpenSBI设置MSIP0
→ embassy_preempt接收MSI中断
→ 处理消息场景2:embassy_preempt → Linux
embassy_preempt写消息到共享内存
→ 直接写MSIP1-4寄存器
→ OpenSBI委托中断(mideleg)
→ Linux接收SSI中断
→ 处理消息3. 共享内存设计
设计了环形缓冲区队列结构:
rust
struct SharedMessageQueue {
magic: AtomicU32,
version: AtomicU32,
linux_to_rtos: MessageQueue, // 8KB
rtos_to_linux: MessageQueue, // 8KB
sync: SyncFlags, // 8KB
// 心跳、错误状态等
}
struct MessageQueue {
buffer: [Message; 256],
read_idx: AtomicU16,
write_idx: AtomicU16,
sent: AtomicU64,
received: AtomicU64,
}第二部分:星光2平台StarryOS移植尝试
本周在星光2开发板上尝试启动StarryOS,遇到文件系统相关问题。
工作目的
验证StarryOS在JH7110平台上的运行情况,为后续的多系统通信实现做准备。
遇到的问题
启动日志分析
StarryOS启动过程中在文件系统初始化阶段停止响应:
[ 28.544256] Initialize platform devices...
[ 28.550930] Initialize scheduling...
[ 28.588908] Initializing SD/MMC driver at 0xffffffc016020000
[ 28.620450] SD card is ready
[ 28.626614] SD card supports high capacity
[ 28.634188] cid: Cid { mid: 3, oid: "SD", pnm: "SD64G", ... }
[ 28.705567] SD card capacity: 0x76f5000 blocks
[ 28.757741] Initialize filesystem subsystem...
[ 28.763813] open ext4 block device
[ 28.777926] close ext4 block device ← 之后停止输出问题诊断
系统成功识别了64GB SD卡,但在ext4文件系统挂载时停止,可能是因为:
- SD卡分区问题:缺少有效的ext4分区
- 根文件系统路径配置:StarryOS配置的根文件系统路径与实际不符
- lwext4_rust库问题:ext4文件系统驱动在挂载时遇到错误
- 硬件兼容性:星光2平台的SD/MMC驱动存在兼容性问题
下一步计划
询问成功的同学SD卡分区表和文件系统格式,寻找解决方案
第三部分:JH7110平台代码重构、修复和模块化
本周对JH7110平台实现进行了重要的代码重构,将原来集中在单个文件中的代码拆分为多个模块。
工作目的
随着平台功能的增加,mod.rs文件已经变得过于庞大(超过400行),包含多种不同的功能。为了提高代码质量,需要将代码按功能模块化拆分。
修复
- ecall路径寄存器破坏:原先的汇编会导致t0~t1寄存器可能被破坏,重写汇编修复
重构
新增模块:
1. backtrace.rs
- 功能:栈回溯和调试支持
- 实现:
- 基于帧指针(fp/s0)的精确栈回溯
- 代码地址和栈地址验证
- 寄存器状态打印
- 最多支持16层栈帧回溯
2. exception.rs
- 功能:异常处理和系统终止
- 实现:
- 异常原因解析(mcause寄存器)
- 同步异常处理
- 系统终止功能(abort)
- 与backtrace模块集成,自动打印调用栈
3. interrupt.rs
- 功能:中断处理和分发
- 实现:
- 中断处理函数表(支持16种中断类型)
- 中断注册API
- PLIC(平台级中断控制器)支持
- 外部中断处理(UART、SPI、I2C、GPIO等)
4. trap.rs
- 功能:Trap处理入口和常量定义
- 实现:
- 汇编级trap入口(
__trap_entry) - 零开销ecall路径(
MachineEnvCall) - 完整的中断和异常编码常量
- Trap描述函数
- 汇编级trap入口(
架构改进
重构前
text
mod.rs (402行)
├── 平台初始化
├── trap处理
├── 异常处理
├── 中断处理
├── 栈回溯
└── 定时器驱动重构后
text
mod.rs (109行) - 模块文档和导出
├── platform.rs - 平台初始化
├── trap.rs - Trap入口
│ └── exception.rs - 异常处理
│ └── backtrace.rs - 栈回溯
├── interrupt.rs - 中断处理
└── timer_driver.rs - 定时器驱动