libos的简单尝试。尝试使用rust
的条件编译选项与cargo add/rm
工具完成。
- 一个打印字符的
hello world
程序 - 一个使用堆分配的程序
对于打印功能来说,在plat/cconsole
中定义了一个Stdio
的trait
,在不同平台上需要实现此接口,同时不同的平台还应该提供一个boot0
的宏和linker
文件,libs/cboot
会完成应用程序运行前的初始化工作,其将所有的平台实现作为依赖导入,通过cfg
选项,选择导入不同的平台的启动代码,并初始化平台相关的串口打印功能。
kernel-app
是一个模板crate
,其内部的代码只有两行:
#[no_mangle]
pub unsafe fn rust_main()->!{
//启动准备
cboot::boot();
//程序运行
app::app_main();
loop {}
}
所有的app
以相同的app_main()
作为入口函数。在运行选择的程序时,使用cargo add
命令修改kernel-app
的依赖项将不同的app重命名为app
,此命令也可以添加feature
。
对于堆分配功能来说,如果用户程序直接导入alloc
模块功能,则构建程序无法发现应用程序需要启用堆分配,这里选择在libs
定义了一个calloc-trait
,重新导出alloc
功能,这样让应用程序通过引入我们定义的库去使用alloc
中数据结构,我们就可以从应用程序的依赖中发现应用程序需要堆分配功能。在这个系统中我们模拟了两个可用的堆分配,两个库都在crates.io
可以找到,同样的,这个堆分配功能也在cboot
中通过编译选项导入,在构建程序发现用户程序需要堆分配时会询问用户使用哪个堆分配器,在两个堆分配器的实现calloc_impl
中也是用条件编译进行导出。
#[cfg(feature = "buddy")]
pub type Allocator = buddy::BuddyAllocator;
#[cfg(feature = "linked-list")]
pub type Allocator = link_list::LinkAllocator;
-
确保安装了
cargo-edit
-
安装
qemu-system-riscv64
-
选择应用程序
这里选择使用伙伴分配器。
目前的xtask
逻辑有些混乱需要修改。