Skip to content

Godones/libos

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

LibOS

libos的简单尝试。尝试使用rust的条件编译选项与cargo add/rm 工具完成。

功能

  • 一个打印字符的hello world程序
  • 一个使用堆分配的程序

设计思路:

对于打印功能来说,在plat/cconsole中定义了一个Stdiotrait,在不同平台上需要实现此接口,同时不同的平台还应该提供一个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;

构建

  1. 确保安装了cargo-edit

  2. 安装qemu-system-riscv64

  3. 选择应用程序

示例

hello-world

image-20221101233041236

heap-consumer

这里选择使用伙伴分配器。

image-20221101233126217

错误

目前的xtask逻辑有些混乱需要修改。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages