目录
目录README.md

开放如意内核

开放如意内核(openKycore)是由国防科技大学麒麟操作系统团队主导自主设计、从零实现的新型架构操作系统内核。目标是针对特定领域系统安全可靠保障需求并结合技术发展趋势,探索适应未来复杂多端应用场景以及未来“人机物”融合时代的操作系统内核形态,构建一个非Linux技术体系、全自主的通用操作系统内核。“人机物”融合的一个特征是平台多样,另一个特征是人在回路。为此,开放如意内核的主要设计原则是架构灵活,可根据硬件平台的不同特性、用户对于性能或安全等属性的不同需求,动态变化系统架构,实现柔性可扩展支持。

内核架构

开放如意内核以微内核为基础,吸收融合了宏内核、外核等技术特征,涵盖了运行于内核态及用户态的诸多核心组件,最终形成一个为上层应用提供基础支撑的广义内核,并对应用提供编程接口(例如POSIX)。核心包括一个柔性微内核,提供内存管理、任务管理、IPC管理等功能,并基于对象化和权能机制实现,支持文件系统、设备驱动等系统功能模块运行模式的柔性切换。功能模块以组件库的形式构建,可根据用户需求配置,使用三种模式运行:

  • 模式1:构建用户态服务进程,通过IPC为应用提供IO、网络、显示等功能,类似微内核。适用于有安全风险应用或驱动使用。
  • 模式2:直接链接至应用软件,通过函数调用实现功能,类似外核。适用于性能敏感应用使用。
  • 模式3:构建内核态服务线程,通过系统调用实现上述功能,类似Windows内核。适用于一般应用默认使用。

目前系统仍在快速开发中,图中虚线边框表示相关模块正在开发或计划开发。从架构层面看,目前正在实现融合模式1(微内核模式)和模式2(外核模式)的新型用户态运行模式。针对外核模式下应用必须以独占资源(如文件系统或设备驱动)导致生态受限的问题,设计资源主进程模式。资源主进程模式相比传统外核模式避免了独占资源的问题,相比传统微内核可支持一个性能敏感应用达到外核性能。

代码目录树

KyCore
├── crates                  // 内核修改的第三方库
├── kyboot                  // 内核引导器,收集硬件信息、准备并启动内核,支持qemu\ft\rasp4b
├── kycomp                  // 组件库
│   ├── arch                // 架构抽象库,aarch64支持qemu\ft\rasp4b,x86_64只有qemu
│   ├── common              // 跨组件共性基础库,定义共性类型、接口等
│   ├── driver              // 设备驱动库
│   │   ├── blk             // 块设备驱动库,包括virtio、ram驱动,以及ipc、kt模式访问设备驱动
│   │   ├── chr             // 字符设备驱动库,包括pl011驱动,以及ipc、kt模式访问设备驱动
│   │   ├── component       // 组件库,对设备驱动进行封装。以组件的形式为用户态应用提供服务
│   │   ├── gpio            // GPIO设备驱动库
│   │   ├── i2c             // I2C设备驱动库
│   │   └── net             // 网络设备驱动库
│   ├── fs                  // 文件系统库,封装rcore-fs库,提供多种运行模式
│   ├── kycall              // 微内核系统调用库,封装微内核kycore对外提供接口
│   ├── net                 // 网络栈库
│   └── runtime             // 运行时库,设置堆、panic等rust语言项,解析应用环境变量、参数等
├── kycore                  // 微内核,包括十多种内核对象,几十个系统调用通过权能访问对象
├── kylib                   // POSIX系统调用库,支持30多个系统调用
├── kysys                   // 系统服务进程,包括root、shell、设备服务进程等
├── misc                    // 杂项
├── musl                    // C语言标准库
├── test                    // 系统集成测试
├── user-c                  // C语言测试程序
├── user-image              // 用户态镜像打包
└── user-rs                 // Rust语言测试程序

代码行统计cloc . --exclude-dir=target,book,build,crates,musl,source

其中target,book,build为编译生成目录,crates,musl,source为第三方库目录

编译运行

开放如意内核使用主流Linux发行版开发,推荐使用Ubuntu 2404、Kylin v10编译运行。内核基于UEFI或UBOOT引导,可运行于Qemu模拟器、飞腾开发板、树莓派等平台。

安装依赖(基于Ubuntu 2404系统测试安装)

# ubuntu依赖包
sudo apt install git make gcc gcc-aarch64-linux-gnu gcc-riscv64-linux-gnu socat cargo rustup cargo-binutils
sudo apt install qemu-system-x86 qemu-system-arm qemu-system-riscv64 qemu-system-gui
# rust环境
rustup component add rust-src llvm-tools-preview
rustup target add aarch64-unknown-none x86_64-unknown-none riscv64gc-unknown-none-elf
# 下载kycore并进入根目录
git clone --recursive https://gitee.com/openkylin/kycore.git
cd kycore

下载速度慢可换国内源,如:

export RUSTUP_DIST_SERVER=”https://rsproxy.cn"

export RUSTUP_UPDATE_ROOT=”https://rsproxy.cn/rustup"

编译并运行

make run
# 之后出现命令提示符,可执行命令,例如ls
[shell] / >>> ls

也可指定运行参数:

make run arch=[aarch64|x86_64|riscv64] mode=[release|debug] loader=[uefi|uboot] board=[qemu|rasp4b|ft204|ftpi|gem5|crosvm]

其中archmodeloaderboard为可选参数,默认均为第一个: qemu-system-x86 qemu-system-arm qemu-system-riscv64 qemu-system-gui

  • arch:选择CPU架构,可选:aarch64、x86_64、riscv64
  • mode:选择是否需要调试符号,可选:release、debug
  • loader:选择启动方式,可选:uefi、uboot
  • board:选择运行平台,可选:qemu、rasp4b、ft204、ftpi、gem5、crosvm

例如,以下可选命令:

  • make run arch=x86_64:基于qemu模拟x86_64架构处理器
  • make run arch=riscv64 loader=uboot:基于qemu模拟riscv64架构处理器(目前仅支持uboot方式)
  • make run mode=debug:编译调试符合,并基于qemu运行
  • make run loader=uboot:基于qemu模拟aarch64架构处理器,并使用uboot方式(进入uboot命令行后需要执行go 0x42000000
  • make build loader=uboot board=gem5:编译gem5平台镜像,须将bin格式内核镜像拷贝至gem5相关目录

目前经过测试的平台包括:

  • QEMU平台UEFI运行
# QEMU上使用UEFI运行VIRT虚机
make run loader=uefi board=qemu
# 网卡功能性测试
COMP=e1000-net test-net e1000-net 1 #内核态驱动
COMP=e1000-net test-net e1000-net 2 #内核态驱动->用户态驱动->内核态驱动
# 网卡(需要调整test-net-slave)
COMP=e1000-net test-net e1000-net 1 #内核态驱动吞吐量
# SD卡测试
make run
# 1是内核态驱动,2是外核模式
# seq是连续读取1MB,random是随机读,mix是混合读写,默认读写1000次
COMP=bcm2835-emmc test-sd [1|2] [random|seq|mix]
  • QEMU平台UBOOT运行
# QEMU上使用UBOOT运行VIRT,进入UBOOT后需要执行`go 0x42000000`
make run loader=uboot board=qemu
# QEMU上使用UBOOT运行树莓派4B
make run loader=uboot board=rasp4b

官方QEMU不支持树莓派4B,需要编译使用此仓库的QEMU

  • 开发板UBOOT运行
# 编译内核,在PhytiumPI(E2000)基于UBOOT运行
make build loader=uboot board=ftpi && make image && cp -r misc/boot path/to/sd/
# 编译内核,在树莓派4B基于UBOOT运行
make build loader=uboot board=rasp4b && make image && cp -r misc/boot/ path/to/sd/
# 编译内核,在GEM5运行
make build loader=uboot board=gem5 && make image && cp -r misc/boot path/to/gem5/resources/semihosting/

飞腾派运行需要设置环境变量: setenv bootcmd "dcache flush;ext4load mmc 0 0x82000000 boot/kycore.bin; ext4load mmc 0 0x85000000 boot/devicetree.dtb; ext4load mmc 0 0x86000000 boot/initrd.img; go 0x82000000"

树梅派运行需要配置文件cp misc/config-uboot.txt path/to/sd/(会覆盖sd卡上的config.txt,注意提前备份)

GEM5运行参考此文档

  • 开发板UEFI运行
# 编译内核,在ft204(D2000)基于UEFI运行
make build loader=uefi board=ft204 && make image && cp -r misc/esp/EFI path/to/sd/
# 编译内核,在树莓派4B基于UEFI运行
make build loader=uefi board=rasp4b && make image && cp -r misc/esp/EFI path/to/sd/
cp misc/ovmf/RPI_EFI.fd path/to/sd/
cp misc/config-uefi.txt path/to/sd/ (会覆盖sd卡上的config.txt,注意提前备份)

调试

  • 可通过make run-gdb mode=debug启用qemu调试模式,同时可在另一个终端使用make gdb连接到qemu
  • 可通过修改.gdbinit脚本指定make gdb的初始化行为

测试

shell内置命令

  • ps:展示系统后台进程
  • lscap:展示系统进程权能空间
  • lsmem:展示系统进程内存空间
  • environ:展示系统环境变量
  • history:展示历史命令
  • cd:改变当前路径,如cd dev
  • debug:调试开关,执行debug ondebug off调整内核输出级别,开启时输出debug级别日志
  • time:记录一个命令运行时间,如time ls
  • timer:改变系统时钟频率,如timer 128,设置时钟频率为每秒128次
  • repeat:重复命令,如repeat 5 ls,重复执行ls五次
  • exit:退出内核
  • lscom: 展示当前系统中的所有组件

应用程序

  • ls:rust语言测试程序
  • echo:c语言coreutils程序,如echo hi
  • cat:c语言coreutils程序,如cat cat.txt
  • env:c语言coreutils程序
  • md5sum:c语言coreutils程序,如md5sum cat.txt

展示系统运行状态

[shell] / >>> ps            // 展示系统进程  
[shell] / >>> lscap         // 展示系统进程权能空间  
[shell] / >>> lsmem         // 展示系统进程内存空间  
[shell] / >>> environ       // 展示系统环境变量  
[shell] / >>> lscom         // 展示系统中的所有组件

测试组件

  • 使用shell内置命令对组件进行测试:
[shell] / >>> time repeat 10 ls                        // 重复运行10次ls,并计时
[shell] / >>> time repeat 10 COMP=rootfs ls            // 指定ls为rootfs组件的主进程,运行10次,并计时
[shell] / >>> time repeat 10 COMP=rootfs:ram-blk ls    // 指定ls为rootfs组件和ram-blk组件的主进程,运行10次,并计时
[shell] / >>> debug on                                  // 可以开启debug级别日志再重复上述过程,查看内核内部执行过程
  • 使用专门测试组件性能的测试用例对组建进行测试:
[shell] / >>> COMP=ram-blk:rootfs io-test 8 1000
test1: 1 main process and 7 normal processes, read/write 1000 times
[5.648437] io-test-8-0 cost 270ms
[8.961848] io-test-8-1 cost 3556ms
[8.967762] io-test-8-2 cost 3561ms
[8.988183] io-test-8-3 cost 3581ms
[9.007191] io-test-8-4 cost 3600ms
[9.018370] io-test-8-5 cost 3611ms
[9.037943] io-test-8-6 cost 3630ms
[9.047538] io-test-8-7 cost 3639ms
test2: 8 normal processes, read/write 1000 times
[12.987833] io-test-8-7 cost 2764ms
[12.989375] io-test-8-0 cost 2773ms
[12.990696] io-test-8-1 cost 2772ms
[12.992032] io-test-8-2 cost 2772ms
[12.993359] io-test-8-3 cost 2772ms
[12.995088] io-test-8-6 cost 2772ms
[12.999679] io-test-8-5 cost 2777ms
[13.007024] io-test-8-4 cost 2785ms
----

此测试应用的第一个参数可以指定测试的进程数量,第二个参数指定每个进程文件读写次数。io-test 8 1000表示创建8个子进程,每个子进程对测试文件进行1000次读写。

在第一轮测试时,8个子进程中,第0个子进程为rootfs组件和ram-blk组件的主进程,其他子进程为普通进程。在第二轮测试时,8个子进程全部为普通进程。

可以发现,在第一轮测试时,0号子进程可以直接以函数调用的方式访问文件系统和块设备驱动,因此运行时间最快。其他7个普通进程需要以IPC的方式和0号子进程通行以访问0号子进程提供的文件系统服务和块设备驱动服务。因此运行时间最慢。在第二轮测试时,所有子进程都需要以IPC的方式访问内核中的文件系统和块设备驱动,运行时间适中。

自动化测试

# 单元测试
make test-unit
# 集成测试
make test-kernel
# 系统测试
make test-system

运行系统测试需要py依赖包:

python3 -m venv .venv && venv/bin/pip install avocado-framework avocado-framework-plugin-varianter-yaml-to-mux

文档

技术文档(施工中)

项目技术文档通过mdbook工具管理,位于tutorial目录中。

  • 安装mdbook:

    cargo install mdbook
    cargo install mdbook-toc
  • 编译并运行:

    mdbook serve tutorial/

之后可在127.0.0.1:3000打开手册。

在tutorial目录中修改手册内容时,网页中会同步更新。

接口文档(施工中)

项目使用Rust原生文档工具,根据代码注释自动生成接口文档,可通过如下命令生成:

make doc

也可单独打开各模块接口文档:

  • 组件库接口(目前主要维护kycall库)
cd kycomp
cargo doc --no-deps --document-private-items --target aarch64-unknown-none --open
  • 加载器接口
cd kyboot
cargo doc --no-deps --document-private-items --bins --target aarch64-unknown-uefi --open
  • 内核接口
cd kycore
cargo doc --no-deps --document-private-items --target aarch64-unknown-none --open
  • 兼容库接口
cd kylib
cargo doc --no-deps --document-private-items --target aarch64-unknown-none --open

如需查看其它架构,需修改target参数。如查看x86_64架构,需要将aarch64-unknown-none改为x86_64-unknown-none,将aarch64-unknown-uefi改为x86_64-unknown-uefi

关于
424.2 MB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

©Copyright 2023 CCF 开源发展委员会
Powered by Trustie& IntelliDE 京ICP备13000930号