艾克萨罗斯(ExarOS)是一款北京航空航天大学计算机学院强生、陈凝香和曹宏墚采用 C 语言开发的基于 RISCV64 的操作系统,提供部分 linux 系统调用。
在功能方面,目前全国赛第一阶段只有 lmbench
3 个测试点尚未调通,iperf, netperf
网络测试功能不支持,其他测试样例均完全通过。具体通过情况见下表:
测试 | busybox | libctest | lua | libcbench | iozone | cyclictest | unixbench | lmbench | iperf | netperf |
---|---|---|---|---|---|---|---|---|---|---|
样例个数 | 54 | 220 | 9 | 27 | 8 | 4 | 27 | 24 | 6 | 5 |
通过个数 | 54 | 220 | 9 | 27 | 8 | 4 | 27 | 21 | 0 | 0 |
在性能方面,我们与 qemu 上运行的 linux 进行对比,取得了较为优异的表现,具体的数据可以参考性能总结文档。
此外,我们还移植了 musl-gcc。
条目 | 工具 | 版本 |
---|---|---|
交叉编译器 | riscv64-unknown-elf-gcc | 12.2.0 |
硬件模拟器 | qemu-system-riscv64 | 7.0.0 |
SBI | openSBI | |
开发板 | HiFive Unmatched 开发板 | |
调试器 | gdb-multiarch | 12.1 |
宿主机需要为 Linux 系统,并具有区域赛要求的开发环境和工具。
运行如下指令编译内核:
make
使用如下指令在 qemu 上运行内核,此时 qemu 模拟的开发板是 hifive_u:
make run
如果希望 qemu 模拟的开发板是 virt,需要先修改 Exraos/include/arch.h
为如下内容
#define QEMU
#define VIRT
然后执行
make # compile
make virt # run
如果希望上板测试,需要修改 Exraos/include/arch.h
为如下内容
// #define QEMU
// #define VIRT
然后编译
make
我们采用的方式是利用 uboot 网络加载内核和初始 sd 卡,需要在宿主机上搭建 tftp 服务器,并在开发板的 uboot 上进行相关配置,具体的流程可以参考文档board 。
ExarOS
├── doc (项目文档)
│ └── img (项目图片)
├── include (头文件)
│ └── assembly
├── kernel (内核实现)
│ ├── driver (驱动)
│ ├── entry (内核入口)
│ ├── fs (文件系统)
│ ├── memory (内存)
│ ├── net (网络)
│ ├── process (进程管理)
│ ├── trap (异常及加载)
│ └── util (辅助工具)
├── linkscript (链接脚本)
├── testcase (测试样例)
│ └── mnt
├── user (用户程序)
│ ├── include(用户头文件)
│ │ └── arch
│ │ └── riscv
│ └── target
└── utility (辅助工具)
- 软件规范:包括注释规范、代码风格规范、git commit 规范。
- docker环境:符合官方要求的工具链 docker,并增设了自动化脚本,方便本地调试。
- 开发资源:记录开发手册、参考代码、前人博客和视频等资源。
- 硬件平台:
machine virt
平台的特性。 - 构建脚本:编译器参数、qemu 参数、自动化脚本、GUI 调试。
- SBI:SBI 相关知识。
- 开发板:包括搭建 tftp 服务器和 uboot 启动。
- 内核启动:启动流程和 SBI 应用。
- 内存管理:虚拟内存布局和内存管理。
- trap:包括相关概念,中断和异常处理。
- 进程管理:进程管理、进程调度、睡眠锁。
- 系统调用:系统调用框架。
- virtio 驱动:virtio 驱动实现。
- FAT32:FAT32 文件系统基础理论介绍。
- 文件系统:分层文件系统各层次介绍。
- 多核启动:多核启动相关。
- 信号:信号的相关概念和设计。
- 调度:新型调度方案,实现了 linux 相关的系统调用。
- 动态链接:动态链接的概念,需求,设计,实现。
- 线程:线程相关。
- 套接字:套接字的概念、时序逻辑和接口。
- 网络协议栈:网络协议栈的设计和实现思路,未能完成的教训。
- 网卡驱动:macb 网卡驱动的实现思路。
- 共享内存:共享内存的设计和实现。