diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 322c67c..0fad9bf 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -30,7 +30,7 @@ - [Perl](./chap02/apps/perl.md) - - [动态加载应用二进制](./chap02/ELF-loader.md) + - [动态加载应用ELF文件](./chap02/ELF-loader.md) - [自定义应用](./chap03/your_app.md) diff --git a/src/chap01/Overview.md b/src/chap01/Overview.md index 34aa9b9..b132bdd 100644 --- a/src/chap01/Overview.md +++ b/src/chap01/Overview.md @@ -20,7 +20,9 @@ RuxOS 支持多核环境运行,支持多线程应用。RuxOS 采用先初始 RuxOS 支持三种调度策略: - 先入先出调度(First In First Out),任务依次执行,直到运行结束或主动让出。 + - 时间片轮转调度(Round Robin),任务基于分配的时间片运行,基于时钟中断进行切换。 + - 完全公平调度(Complete Fair Schedueling),基于CFS算法,尽可能保证任务获取相等的CPU时间。 ### VirtIO 驱动 @@ -36,8 +38,11 @@ RuxOS 基于 Rust 第三方库 smoltcp 实现了 TCP/UDP 网络协议栈,适 RuxOS 适配了多类文件系统: - fatfs。基于 Rust 第三方库 rust-fatfs 进行了封装,支持文件系统相关接口,并借助 VirtIO 块设备完成数据的持久化。 + - ramfs。内存文件系统,数据保留在内存中,借助 ramfs 生成了匹配 Linux 的 procfs、etcfs 等。 + - 9pfs。基于 VirtIO-9p 支持了 9pfs,使得 RuxOS 在 QEMU 环境中能够与 host 共享目录。 + - devfs。初步实现了部分设备文件(random、null、zero)。 ### 动态加载应用程序 @@ -49,10 +54,15 @@ RuxOS 支持动态加载应用的 ELF 文件,以及相关的动态链接库。 RuxOS 目前对如下应用完成了适配和验证: - [Redis](../chap02/apps/redis.md)。在 RuxOS 上运行 Redis Server,并通过标准 redis-cli 和 redis-benchmark 进行测试和验证。 + - [Nginx](../chap02/apps/nginx.md)。在 RuxOS 上运行 Nginx 作为网络服务器,运行指定网页。 + - [Wamr](../chap02/apps/wamr.md)。在 RuxOS 上运行 wasm 字节码解释器 WAMR,并借助 wasi-nn 神经网络后端运行简单的 tensorflow 测试。 + - [Iperf](../chap02/apps/iperf.md)。在 RuxOS 上运行标准 Iperf 测试。 + - [Sqlite](../chap02/apps/sqlite.md)。在 RuxOS 上运行数据库应用 Sqlite。 + - C/C++。基于 musl libc 完成对 C/C++ 程序的适配。 ## 工具 diff --git a/src/chap02/ELF-loader.md b/src/chap02/ELF-loader.md index b295f9c..11bccb4 100644 --- a/src/chap02/ELF-loader.md +++ b/src/chap02/ELF-loader.md @@ -1,8 +1,9 @@ -# 动态加载应用二进制 +# 动态加载应用ELF文件 ELF Loader: 使 RuxOS 能够运行未经修改的 Linux ELF 应用。 - ELF 必须是 PIE。 + - 支持静态和动态 PIE ELF, 前者使用 `-static-pie` 编译。 目前支持运行 Musl 编译的 x86_64 和 aarch64 Linux 的静态和动态 PIE 应用。 diff --git a/src/chap02/apps/root.md b/src/chap02/apps/root.md index 947b3ac..bc0db61 100644 --- a/src/chap02/apps/root.md +++ b/src/chap02/apps/root.md @@ -5,19 +5,27 @@ 应用的适配思路为: - 静态链接。借助 ruxlibc 或者 musl libc 对应用源码进行静态编译,再链接内核的相关静态库,并放到 QEMU 中运行。 + - 动态链接。借助 RuxOS 提供的[动态链接器](../ELF-loader.md)动态链接应用的 ELF 文件,其中要求该 ELF 基于 musl gcc 进行编译生成。 编程语言适配思路: - 支持相关解释器。以 Python 为例,通过支持 cpython 解释器来运行 Python 终端和相关的 Python 文件。 + - 支持相关标准库。以 Rust 为例,通过标准 musl libc 支持 Rust std,进而支持 Rust 应用。 本小节包括: - [helloworld](./helloworld.md) + - [Iperf3](./iperf.md) + - [Sqlite](./sqlite.md) + - [Redis](./redis.md) + - [Nginx](./nginx.md) + - [Wamr](./wamr.md) + - [Perl](./perl.md) diff --git a/src/chap02/apps/sqlite.md b/src/chap02/apps/sqlite.md index d7123de..a4d5267 100644 --- a/src/chap02/apps/sqlite.md +++ b/src/chap02/apps/sqlite.md @@ -13,7 +13,9 @@ make A=apps/c/sqlite3/ LOG=error BLK=y run 参数解释: - `A`:SQLite 的测试程序 main 函数所在目录路径。 + - `LOG`:运行的日志等级,不同的日志等级能够打印出不同的调试信息。 + - `BLK`:使用块设备进行数据持久化。 diff --git a/src/chap03/your_app.md b/src/chap03/your_app.md index 07b9549..8479dbb 100644 --- a/src/chap03/your_app.md +++ b/src/chap03/your_app.md @@ -2,3 +2,8 @@ # 自定义应用 本章节将包含如何将您的应用在 RuxOS 上运行起来。 + + + + + diff --git a/src/chap04/ruxgo.md b/src/chap04/ruxgo.md index e550640..5ba33aa 100644 --- a/src/chap04/ruxgo.md +++ b/src/chap04/ruxgo.md @@ -1,10 +1,6 @@ # 使用ruxgo构建 -本章节将包含: +RuxGo 是由矽望社区开发的,与 RuxOS 紧耦合的工具,通过简洁的命令即可完成应用的编译、运行、清除等功能,方便了应用的快速部署,提高 RuxOS 用户友好度。 -* 什么是 ruxgo - -* 如何使用 ruxgo 来运行 RuxOS 上现有的应用 - -本章节内容请参考[ruxgo手册](https://ruxgo.syswonder.org) +本章节内容请参考[ruxgo手册](https://ruxgo.syswonder.org)。其中包含了如何布置目录结构、如何借助 RuxGo 快速运行现有的 RuxOS 应用。 diff --git a/src/chap05/Raspi4.md b/src/chap05/Raspi4.md index 6930c1a..d3558e2 100644 --- a/src/chap05/Raspi4.md +++ b/src/chap05/Raspi4.md @@ -3,14 +3,20 @@ 所需要的硬件: - 树莓派以及SD卡 + - usb转串口模块 + - JTAG调试器(debug需要用到,只是运行则不需要),调试部分可参考上面提到的文章。 + #### 步骤一:烧录好SD卡 给 sd 卡分一个 FAT32 的 boot 区,然后放入启动所需要的文件: - 下载以下三个文件:`bcm2711-rpi-4-b.dtb`,`start4.elf`,`fixup4.dat`。下载地址:[https://github.com/raspberrypi/firmware/tree/master/boot](https://github.com/raspberrypi/firmware/tree/master/boot) + - 基本启动镜像`kernel8.img`。首先clone `rust-raspberrypi-OS-tutorials`( [https://github.com/rust-embedded/rust-raspberrypi-OS-tutorials](https://github.com/rust-embedded/rust-raspberrypi-OS-tutorials))到本地,然后进入`06_uart_chainloader`文件夹,运行`make BSP=rpi4` 即可在文件夹内生成一个`kernel8.img`。 + - 配置文件`config.txt`,该配置文件是用于正确设置启动选项,内容为: + ```bash arm_64bit=1 init_uart_clock=48000000 @@ -22,7 +28,9 @@ device_tree_address=0x03000000 - 按照以下图片接线: ![serial-connect](img/serial-connect.jpg) + - 进入Ruxos目录,运行命令:`make ARCH=aarch64 PLATFORM=aarch64-raspi4 chainboot` + - 如果正常则终端会输出: ```bash Minipush 1.0 @@ -33,7 +41,7 @@ Minipush 1.0 ``` - 此时给树莓派上电,结果如下: -```bash +```shell __ __ _ _ _ _ | \/ (_)_ _ (_) | ___ __ _ __| | | |\/| | | ' \| | |__/ _ \/ _` / _` | @@ -66,8 +74,10 @@ Hello, C app! #### 步骤三:运行Ruxos并使用SD卡驱动: - 进入Ruxos目录下,运行命令:`make ARCH=aarch64 PLATFORM=aarch64-raspi4 A=apps/fs/shell FEATURES=driver-bcm2835-sdhci chainboot` + - 和步骤二类似,再看到开机提示后给树莓派上电,结果如下: -```bash + +```shell Minipush 1.0 [MP] ✅ Serial connected @@ -129,7 +139,9 @@ ruxos:/$ ``` #### 可能出现的问题: + ##### 串口设备异常: + 串口设备设置不正确时会一直卡在: ```bash Minipush 1.0 @@ -137,9 +149,13 @@ Minipush 1.0 [MP] ⏳ Waiting for /dev/ttyUSB0 ``` - 在linux系统里可以通过`ls /dev`来显示所有外设,可以观察插上usb转ttl模块后,是否有名为ttyUSB0的设备(这是默认usb设备名称,也是后续我们写死在makefile里的名称)。如果没有该设备,可能是驱动没安装上。可以参考该文章来安装驱动 [https://blog.csdn.net/weixin_43790050/article/details/131362540](https://blog.csdn.net/weixin_43790050/article/details/131362540) + - 如果想要验证串口设备是否正常,可以将TX和RX连接上,然后发送信息。如果串口设备是正常的,则每发送一条信息就会收到一条同样的信息 + ##### SD卡驱动的问题: + Ruxos现在实现了解析设备树,但是与qemu不同,树莓派不会将dtb文件的指针放在某个寄存器上,于是只能通过相关设置,来固定dtb文件的位置。在`config.txt`中`device_tree_address=0x03000000`指定了dtb文件的物理地址。在`modules/ruxhal/src/platform/aarch64_raspi/mod.rs`中,修改`rust_entry`函数,即启动时默认从`0x03000000`地址来初始化设备树。 + ```rust pub(crate) unsafe extern "C" fn rust_entry(cpu_id: usize) { crate::mem::clear_bss(); @@ -155,9 +171,12 @@ pub(crate) unsafe extern "C" fn rust_entry(cpu_id: usize) { rust_main(cpu_id, 0x03000000); } ``` + ##### docker报错 var/run/docker.sock 权限不够: + 运行以下两行命令即可 + ```bash cd / sudo chmod 666 var/run/docker.sock -``` \ No newline at end of file +``` diff --git a/src/chap05/multiplatforms.md b/src/chap05/multiplatforms.md index 2ef7a9e..2c413b8 100644 --- a/src/chap05/multiplatforms.md +++ b/src/chap05/multiplatforms.md @@ -1,4 +1,8 @@ # 多平台支持 -本章节将介绍如何将 RuxOS 运行在除了 qemu 以外的真实硬件上。 +在前面的章节中,RuxOS 均是运行在 QEMU 环境中,后续矽望社区将结合自研虚拟机监控器 Hvisor,将 RuxOS 运行在 Hvisor 上,借助 Hvisor 适配各类不同的硬件。 + +但在 RuxOS 的初期探索中,也完成了逻辑环境的适配,RuxOS 能够运行在树莓派4B上,支持了相应的 SD 卡驱动,并进行了验证。 + + diff --git a/src/chap06/design_overview.md b/src/chap06/design_overview.md index 64552b5..07055c4 100644 --- a/src/chap06/design_overview.md +++ b/src/chap06/design_overview.md @@ -1,4 +1,53 @@ # 设计概述 -本章节将介绍设计架构、框图等内容。 +本章节将对 RuxOS 的结构进行介绍。 + +RuxOS 整体结构如下图所示: + +

+ RuxOS-Structure +

+ +下面自下而上进行简要介绍,并在后面章节中对具体模块进行详细介绍。 + +### Hypervisor + +RuxOS 底层运行在虚拟机监控器上,目前运行在 QEMU 中,后续将与矽望社区自研的 Hvisor 进行对接。 + +### 底层组件 [RuxOS Crates](./crates/crates.md) + +该层包含操作系统底层相互独立的功能组件,各个组件以 Rust Crate 的形式独立存在,互不依赖,与具体操作系统无关,可在多个操作系统之间进行共享。这是基于组件化操作系统理念设计的层级结构,底层组件的独立是内核裁剪的基础。 + +例如,在底层组件中独立实现了各类内存分配算法,上层的具体操作系统模块可以进行自由选择,来构建自己操作系统的内存分配器。 + +### 功能模块 [RuxOS Modules](./modules/modules.md) + +该层包含了 RuxOS 自身的操作系统模块,基于底层的独立组件进行组合、封装,构成操作系统内核的重要部分。 + +功能模块这一层与具体的操作系统相关,里面包含了具体操作系统的功能子模块初始化,例如网络、调度、内存分配等,也包括了具体操作系统的参数,例如地址空间大小、虚拟地址起始位置、网络端口等,是不可共享的部分。 + +### 特征选择 ruxfeat + +基于 Unikernel 的设计理念,将内核模块构建为可裁剪、可定制的形式,需要使用 Rust Feature 机制。ruxfeat 模块用于对内核中繁杂、细碎的 Feature 进行整合和统一管理,对上层提供整合过后简洁的特征集,用于 API 层进行特征选择。 + +### API 层 RuxOS API + +API 层提供的是用户库的兼容层,里面包含了 Rust 兼容层和 POSIX 兼容层。其中 Rust 兼容层目前用于支持 Rust 标准库,后续将会统一通过 musl libc 来进行支持。POSIX 兼容层提供的是 POSIX 规范的系统调用接口,细节及实现情况在[这里](../chap07/ulib/ruxos-posix-api.md)进行了详细说明。 + +### 用户库 RuxOS ulib + +目前 RuxOS 中包含三类用户库,分别是: + +- 移植 ArceOS 的 Rust 标准接口库 axstd,提供部分的 Rust 标准库模块,能支持简单的 Rust 应用,以直接函数调用的形式实现。 + +- 基于 C 语言和 Rust 语言自研的 [ruxlibc](../chap07/ulib/ruxlibc.md) 标准库,提供标准 C 语言的 API,以直接函数调用形式实现。 + +- 通过 [ruxmusl](../chap07/ulib/ruxmusl.md) 兼容层支持的标准 musl libc 标准库,以标准系统调用的形式实现。 + +应用程序可以根据需求选择合适的标准库。 + +### 应用程序 User Apps + +该层为标准的应用程序,应用程序与编程语言支持情况在[第二章](../chap02/apps/root.md)中进行了展示。 + diff --git a/src/chap06/modules/9pfs.md b/src/chap06/modules/9pfs.md index f4bda9c..ab34983 100644 --- a/src/chap06/modules/9pfs.md +++ b/src/chap06/modules/9pfs.md @@ -10,7 +10,9 @@ 9P 事实上是一种用来进行文件读写的通信协议,它只是在会话层的。这就意味着在本质上9P与物理层、数据链路层等无关。9P通信协议的版本存在 `9P2000`、`9P2000.L` 和 `9P2000.u` 三种,其协议内容可以参考以下链接: * [9P2000的基本协议内容](https://ericvh.github.io/9p-rfc/rfc9p2000.html) + * [9P2000.L拓展协议版本](https://github.com/chaos/diod/blob/master/protocol.md) + * [9P2000.u拓展协议版本](http://ericvh.github.io/9p-rfc/rfc9p2000.u.html) ## virtio-9p diff --git a/src/figures/RuxOS-Structure.jpg b/src/figures/RuxOS-Structure.jpg new file mode 100644 index 0000000..29706f0 Binary files /dev/null and b/src/figures/RuxOS-Structure.jpg differ diff --git a/src/figures/ruxos.svg b/src/figures/ruxos.svg new file mode 100644 index 0000000..7d06cf7 --- /dev/null +++ b/src/figures/ruxos.svg @@ -0,0 +1,4 @@ + + + +
ruxos modules
ruxos modules
Basic OS Components as Rust Crates
Basic OS Components as Rust Crates
User Apps
User Apps
Hypervisor
Hypervisor
axnet
axnet
ruxtask
ruxtask
ruxconfig
ruxconfig
ruxruntime
ruxruntime
ruxhal
ruxhal
ruxdriver
ruxdriver
allocator
allocator
axalloc
axalloc
scheduler
scheduler
page_table
page_table
linked_list
linked_list
driver_blk
driver_blk
ruxdisplay
ruxdisplay
smoltcp
smoltcp
buddy
buddy
slab
slab
FIFO
FIFO
CFS
CFS
ixgbe
ixgbe
driver_virtio
driver_virtio
driver_net
driver_net
ruxfs
ruxfs
page_table_entry
page_table_entry
ruxos API
ruxos API
ruxos_posix_api
ruxos_posix_api
arceos_api
arceos_api
ruxos ulib
ruxos ulib
axstd
axstd
ruxlibc
ruxlibc
rust std
rust std
Rust App
Rust App
C App
C App
Rust std App
Rust std App
C App
C App
ruxmusl
ruxmusl
ruxfeat
ruxfeat
feature selection
feature selection
rux9p
rux9p
driver_9p
driver_9p
Text is not SVG - cannot display
\ No newline at end of file