基于 rCore,兼容 Linux,用 Rust 编写的单一内核操作系统。
可运行在 riscv64imac 环境下。
名称化用自 Nuclear 即原子核,与内核 (kernel) 虽然在英文上没什么关联,但至少都带个核不是()
由于开发人员都来自东北大学 (Neu),因此化用为 Neuclear 作为队伍名称与系统名称
项目文档见 doc 目录。
- Even Better TOML
- crates
- Error Lens
- C/C++(调试用)
- RISC-V Support
- rust-analyzer
- AutoCorrect(请尽量注意中英文之间加空格隔开,该扩展就是自动做这个的)
- todo tree(用于查看项目中的 TODO/FIXME/NOTE 请尽量下载)
https://gitee.com/LoanCold/ultraos_backup
https://github.com/equation314/nimbos
https://gitlab.eduxiji.net/dh2zz/oskernel2022
https://tooldiy.ry.rs/firmware/RustSBI/
https://gitlab.eduxiji.net/scPointer/maturin
vscode 调试用
放一些调试用的工具,像是探查 elf 内容,打包 elf 之类的。
常常也会在此目录下进行二进制文件的反汇编等工作(通过 rust-objdump)
一些第三方库,可能会需要做出修改来适应本项目的需求
- rust-fatfs 库,做了点细微的修改(添加
pub
和/或const
) - buddy_system_allocator 库,做了些小修改(主要是添加
const
)
项目的一些文档。分模块讲解了 Neuclear 的整体设计和实现方式。
内核部分,会编译得到内核的二进制文件
参考资料;系统镜像;BootLoader 之类的。总之是一些相关的资源
rCore 的残留,不过也可以拿来做测试用,所以不急着删。
根目录下 make run
。
如希望带有日志,则设置环境变量 LOG=DEBUG
。
- gdb 命令行式,操作更精细,当然也更麻烦
- 打开两个终端,工作目录都是 Neuclear 目录
- 在一个终端
make dbg
- 在另一个终端
make dbg-listener
- vscode 交互式,方便点
- 终端中运行
make dbg
- vscode 中按 F5
- 终端中运行
由于虚拟映射的变换,断点的打法是有技巧的,以 gdb 方式为例:
- 操作系统刚刚启动,此时起始点是在 linker 脚本里的地址,也即 0x80200000,所以先
break *0x80200000
,然后 continue 过去。 - 启动后会加载临时页表,加载后才可以直接给
rust_main
打断点,因此先来个stepi 15
- 此时高地址载入页表,已经可以用
break rust_main
了。 - 另外,因为很快页表会再次变化,所以低地址的断点会无效,记得
d 1
删掉第一个断点
其实 1、2 步可以合并,最初就直接 break *0x8020001a
,然后直接 continue 过去,就可以进行第 3 步了。
vscode 方式也差不多,要手动在调试窗口加个 break *0x8020001a
的断点,运行到那里用鼠标点击打断点才有效。
- 页表机制要换。目前是 rCore 式的双页表,通过跳板进行 trap 处理。但实践下来感觉造成的问题更多,切成 linux 或者 windows 那样的最好。这个工作越早进行越好,因为影响面比较广。
- Cow 虚拟页
- 页面置换
- 信号机制。目前还没有具体的处理。
- 标记
unsafe
。这里的阻碍是我不太敢对unsafe
乱下手,可能还得花时间看死灵书 - 多核启动
- 需要探索的:如何做内核 profile、页表中的 ASID、D/A/G 位、能否用 riscv64gc Linux musl 来试试、链接 musl 集成 libc
- rust-analyzer 在 riscv target 下可能有误报 can't find crate for
test
,解决它需要设置rust-analyzer.check.allTargets
为 false