Skip to content

第十四周工作总结

第一部分:完成多系统间通讯设计文档

本周完成了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文件系统挂载时停止,可能是因为:

  1. SD卡分区问题:缺少有效的ext4分区
  2. 根文件系统路径配置:StarryOS配置的根文件系统路径与实际不符
  3. lwext4_rust库问题:ext4文件系统驱动在挂载时遇到错误
  4. 硬件兼容性:星光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描述函数

架构改进

重构前

text
mod.rs (402行)
├── 平台初始化
├── trap处理
├── 异常处理
├── 中断处理
├── 栈回溯
└── 定时器驱动

重构后

text
mod.rs (109行) - 模块文档和导出
├── platform.rs - 平台初始化
├── trap.rs - Trap入口
│   └── exception.rs - 异常处理
│       └── backtrace.rs - 栈回溯
├── interrupt.rs - 中断处理
└── timer_driver.rs - 定时器驱动