提交决赛其他材料
开放如意内核(openKycore)是由国防科技大学麒麟操作系统团队主导自主设计、从零实现的新型架构操作系统内核。目标是针对特定领域系统安全可靠保障需求并结合技术发展趋势,探索适应未来复杂多端应用场景以及未来“人机物”融合时代的操作系统内核形态,构建一个非Linux技术体系、全自主的通用操作系统内核。“人机物”融合的一个特征是平台多样,另一个特征是人在回路。为此,开放如意内核的主要设计原则是架构灵活,可根据硬件平台的不同特性、用户对于性能或安全等属性的不同需求,动态变化系统架构,实现柔性可扩展支持。
开放如意内核以微内核为基础,吸收融合了宏内核、外核等技术特征,涵盖了运行于内核态及用户态的诸多核心组件,最终形成一个为上层应用提供基础支撑的广义内核,并对应用提供编程接口(例如POSIX)。核心包括一个柔性微内核,提供内存管理、任务管理、IPC管理等功能,并基于对象化和权能机制实现,支持文件系统、设备驱动等系统功能模块运行模式的柔性切换。功能模块以组件库的形式构建,可根据用户需求配置,使用三种模式运行:
目前系统仍在快速开发中,图中虚线边框表示相关模块正在开发或计划开发。从架构层面看,目前正在实现融合模式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为第三方库目录
代码行统计cloc . --exclude-dir=target,book,build,crates,musl,source
cloc . --exclude-dir=target,book,build,crates,musl,source
其中target,book,build为编译生成目录,crates,musl,source为第三方库目录
target,book,build
crates,musl,source
开放如意内核使用主流Linux发行版开发,推荐使用Ubuntu 2404、Kylin v10编译运行。内核基于UEFI或UBOOT引导,可运行于Qemu模拟器、飞腾开发板、树莓派等平台。
# 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"
下载速度慢可换国内源,如:
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]
其中arch、mode、loader、board为可选参数,默认均为第一个: qemu-system-x86 qemu-system-arm qemu-system-riscv64 qemu-system-gui
arch
mode
loader
board
例如,以下可选命令:
make run arch=x86_64
make run arch=riscv64 loader=uboot
make run mode=debug
make run loader=uboot
go 0x42000000
make build loader=uboot board=gem5
目前经过测试的平台包括:
# 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运行VIRT,进入UBOOT后需要执行`go 0x42000000` make run loader=uboot board=qemu # QEMU上使用UBOOT运行树莓派4B make run loader=uboot board=rasp4b
官方QEMU不支持树莓派4B,需要编译使用此仓库的QEMU
# 编译内核,在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运行参考此文档
飞腾派运行需要设置环境变量: 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"
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,注意提前备份)
cp misc/config-uboot.txt path/to/sd/
GEM5运行参考此文档
# 编译内核,在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
make gdb
.gdbinit
cd dev
debug on
debug off
time ls
timer 128
repeat 5 ls
echo hi
cat cat.txt
md5sum cat.txt
[shell] / >>> ps // 展示系统进程 [shell] / >>> lscap // 展示系统进程权能空间 [shell] / >>> lsmem // 展示系统进程内存空间 [shell] / >>> environ // 展示系统环境变量 [shell] / >>> lscom // 展示系统中的所有组件
[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次读写。
io-test 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
运行系统测试需要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
也可单独打开各模块接口文档:
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。
target
x86_64
aarch64-unknown-none
x86_64-unknown-none
aarch64-unknown-uefi
x86_64-unknown-uefi
©Copyright 2023 CCF 开源发展委员会 Powered by Trustie& IntelliDE 京ICP备13000930号
开放如意内核
开放如意内核(openKycore)是由国防科技大学麒麟操作系统团队主导自主设计、从零实现的新型架构操作系统内核。目标是针对特定领域系统安全可靠保障需求并结合技术发展趋势,探索适应未来复杂多端应用场景以及未来“人机物”融合时代的操作系统内核形态,构建一个非Linux技术体系、全自主的通用操作系统内核。“人机物”融合的一个特征是平台多样,另一个特征是人在回路。为此,开放如意内核的主要设计原则是架构灵活,可根据硬件平台的不同特性、用户对于性能或安全等属性的不同需求,动态变化系统架构,实现柔性可扩展支持。
内核架构
开放如意内核以微内核为基础,吸收融合了宏内核、外核等技术特征,涵盖了运行于内核态及用户态的诸多核心组件,最终形成一个为上层应用提供基础支撑的广义内核,并对应用提供编程接口(例如POSIX)。核心包括一个柔性微内核,提供内存管理、任务管理、IPC管理等功能,并基于对象化和权能机制实现,支持文件系统、设备驱动等系统功能模块运行模式的柔性切换。功能模块以组件库的形式构建,可根据用户需求配置,使用三种模式运行:
目前系统仍在快速开发中,图中虚线边框表示相关模块正在开发或计划开发。从架构层面看,目前正在实现融合模式1(微内核模式)和模式2(外核模式)的新型用户态运行模式。针对外核模式下应用必须以独占资源(如文件系统或设备驱动)导致生态受限的问题,设计
资源主进程模式。资源主进程模式相比传统外核模式避免了独占资源的问题,相比传统微内核可支持一个性能敏感应用达到外核性能。代码目录树
编译运行
开放如意内核使用主流Linux发行版开发,推荐使用Ubuntu 2404、Kylin v10编译运行。内核基于UEFI或UBOOT引导,可运行于Qemu模拟器、飞腾开发板、树莓派等平台。
安装依赖(基于Ubuntu 2404系统测试安装)
编译并运行
也可指定运行参数:
其中
arch、mode、loader、board为可选参数,默认均为第一个: qemu-system-x86 qemu-system-arm qemu-system-riscv64 qemu-system-guiarch:选择CPU架构,可选:aarch64、x86_64、riscv64mode:选择是否需要调试符号,可选:release、debugloader:选择启动方式,可选:uefi、ubootboard:选择运行平台,可选: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相关目录目前经过测试的平台包括:
调试
make run-gdb mode=debug启用qemu调试模式,同时可在另一个终端使用make gdb连接到qemu.gdbinit脚本指定make gdb的初始化行为测试
shell内置命令
cd devdebug on或debug off调整内核输出级别,开启时输出debug级别日志time lstimer 128,设置时钟频率为每秒128次repeat 5 ls,重复执行ls五次应用程序
echo hicat cat.txtmd5sum cat.txt展示系统运行状态
测试组件
此测试应用的第一个参数可以指定测试的进程数量,第二个参数指定每个进程文件读写次数。
io-test 8 1000表示创建8个子进程,每个子进程对测试文件进行1000次读写。在第一轮测试时,8个子进程中,第0个子进程为rootfs组件和ram-blk组件的主进程,其他子进程为普通进程。在第二轮测试时,8个子进程全部为普通进程。
可以发现,在第一轮测试时,0号子进程可以直接以函数调用的方式访问文件系统和块设备驱动,因此运行时间最快。其他7个普通进程需要以IPC的方式和0号子进程通行以访问0号子进程提供的文件系统服务和块设备驱动服务。因此运行时间最慢。在第二轮测试时,所有子进程都需要以IPC的方式访问内核中的文件系统和块设备驱动,运行时间适中。
自动化测试
文档
技术文档(施工中)
项目技术文档通过mdbook工具管理,位于tutorial目录中。
安装mdbook:
编译并运行:
之后可在127.0.0.1:3000打开手册。
接口文档(施工中)
项目使用Rust原生文档工具,根据代码注释自动生成接口文档,可通过如下命令生成:
也可单独打开各模块接口文档: