Skip to content
/ Jrinx Public

ARINC653 Multi-Partition Operating System Based On RISC-V, capable of running on SiFive HiFive Unmatched.

Notifications You must be signed in to change notification settings

Jrinx/Jrinx

Repository files navigation

Jrinx

check-style status regression-test status

什么是 Jrinx?

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 开头。

快速开始

环境准备

编译 Jrinx

克隆本代码仓库到本地,并进入仓库根目录,然后执行:

$ make

以调试模式构建 Jrinx,或执行:

$ make release

以发布模式构建 Jrinx。

运行 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           # 本文件

现已基本实现的 ARINC 653 核心服务

  • 分区管理:
    • 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 定义的所有核心服务
  • 支持多核场景下的分区、进程调度
  • 支持更丰富的外设

About

ARINC653 Multi-Partition Operating System Based On RISC-V, capable of running on SiFive HiFive Unmatched.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published