Jrinx 是一个基于 RISC-V 的 ARINC 653 多分区操作系统。其命名来自于 ARINC 653 与 JOS。
为什么提到了 ARINC 653:ARINC 653 是航空电子领域中的一个标准,定义了多分区操作系统的核心服务。本项目的目标是在 RISC-V 上实现 ARINC 653 的部分核心服务,为在 RISC-V 上建设 ARINC 653 多分区操作系统探路。
为什么提到了 JOS:作者 @Coekjan 在本科时期学习操作系统时,完成了 MOS(北京航空航天大学《操作系统》课程设计),而 MOS 的前身是 JOS。为致敬 JOS,本项目名以字母 J 开头。
- 安装基础构建工具 GNU/Make、GNU/Bash
- 安装 Python 3、PyYAML。
- 安装 RISC-V 64 位工具链。
- 安装 QEMU for RISC-V 64 bit。
克隆本代码仓库到本地,并进入仓库根目录,然后执行:
$ make
以调试模式构建 Jrinx,或执行:
$ make release
以发布模式构建 Jrinx。
可执行(可按实际设置恰当的环境变量 CROSS_COMPILE
来指定交叉编译器):
$ make run
以在 QEMU 中直接运行 Jrinx,此时 Jrinx 将因没有需要调度的分区,而在初始化后停机。
为让 Jrinx 调度分区、进程,可指定 SYSCONF
环境变量,其值为某个系统配置文件的路径(系统配置文件均位于 sys-conf
下),使 Jrinx 依据该系统配置文件来调度分区、进程。例如:
$ make run SYSCONF=./sys-conf/ping-pong.yml
另外,还可通过指定 BOARD
环境变量切换运行平台,目前仅支持 virt(默认选项)与 sifive_u 这两个平台。
.
├── .vscode/
├── docs/ # 项目文档
├── include/ # 头文件集
├── kern/
│ ├── boot/ # 内核启动
│ ├── chan/ # 分区间通信
│ ├── comm/ # 分区内通信
│ ├── drivers/ # 设备树解析与设备驱动
│ ├── lib/ # 内核函数库
│ ├── lock/ # 锁
│ ├── mm/ # 内存管理
│ ├── multitask/ # 分区、进程、调度管理
│ ├── tests/ # 内核单元测试集
│ ├── traps/ # 异常、中断处理
├── lib/ # 公共函数库
├── opensbi/ # OpenSBI 依赖
├── scripts/ # 项目脚本集
├── sys-conf/ # 系统配置文件集
├── tests-conf/ # 测试配置文件集
├── user/ # 用户程序集
├── .clang-format # Clang 格式化配置文件
├── .editorconfig # 编辑器配置文件
├── .gitignore
├── .gitlab-ci.yml # GitLab CI 配置文件
├── .gitmodules
├── Dockerfile # CI 使用的 Docker 镜像
├── jrinx.logo # Jrinx 的 LOGO
├── kern.ldS # 内核链接脚本
├── Makefile # 项目根目录的 Makefile
└── README.md # 本文件
- 分区管理:
-
GET_PARTITION_STATUS
-
SET_PARTITION_MODE
-
- 进程管理:
-
GET_PROCESS_ID
-
GET_PROCESS_STATUS
-
CREATE_PROCESS
-
SET_PRIORITY
-
SUSPEND_SELF
-
SUSPEND
-
RESUME
-
STOP_SELF
-
STOP
-
START
-
DELAYED_START
-
LOCK_PREEMPTION
-
UNLOCK_PREEMPTION
-
GET_MY_ID
-
INITIALIZE_PROCESS_CORE_AFFINITY
-
GET_MY_PROCESSOR_CORE_ID
-
GET_MY_INDEX
-
- 时间管理:
-
TIMED_WAIT
-
PERIODIC_WAIT
-
GET_TIME
-
REPLENISH
-
- 分区间通信:
-
CREATE_SAMPLING_PORT
-
WRITE_SAMPLING_MESSAGE
-
READ_SAMPLING_MESSAGE
-
GET_SAMPLING_PORT_ID
-
GET_SAMPLING_PORT_STATUS
-
CREATE_QUEUING_PORT
-
SEND_QUEUING_MESSAGE
-
RECEIVE_QUEUING_MESSAGE
-
GET_QUEUING_PORT_ID
-
GET_QUEUING_PORT_STATUS
-
CLEAR_QUEUING_PORT
-
- 分区内通信:
-
CREATE_BUFFER
-
SEND_BUFFER
-
RECEIVE_BUFFER
-
GET_BUFFER_ID
-
GET_BUFFER_STATUS
-
CREATE_BLACKBOARD
-
DISPLAY_BLACKBOARD
-
READ_BLACKBOARD
-
CLEAR_BLACKBOARD
-
GET_BLACKBOARD_ID
-
GET_BLACKBOARD_STATUS
-
CREATE_SEMAPHORE
-
WAIT_SEMAPHORE
-
SIGNAL_SEMAPHORE
-
GET_SEMAPHORE_ID
-
GET_SEMAPHORE_STATUS
-
CREATE_EVENT
-
SET_EVENT
-
RESET_EVENT
-
WAIT_EVENT
-
GET_EVENT_ID
-
GET_EVENT_STATUS
-
CREATE_MUTEX
-
ACQUIRE_MUTEX
-
RELEASE_MUTEX
-
RESET_MUTEX
-
GET_MUTEX_ID
-
GET_MUTEX_STATUS
-
GET_PROCESS_MUTEX_STATE
-
- 对内核的上下文切换、时钟中断等关键功能进行实时性分析,并做针对性优化
- 支持周期进程、进程 deadline 检测等
- 完整实现 ARINC 653 定义的所有核心服务
- 支持多核场景下的分区、进程调度
- 支持更丰富的外设