From 9914a6ce10f604ff3668672e65ecf92dbbd7e1a4 Mon Sep 17 00:00:00 2001 From: SKTT1Ryze Date: Mon, 31 May 2021 18:18:23 +0800 Subject: [PATCH] update readme and add some assets --- README.md | 39 ++++++++++++++++++++++++++++++++++----- assets/system.png | Bin 0 -> 41224 bytes 2 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 assets/system.png diff --git a/README.md b/README.md index 8ef389c..5a54a53 100644 --- a/README.md +++ b/README.md @@ -2,16 +2,44 @@ 异步内核就像风一样快! ## 基于共享调度器的异步内核设计 -操作系统内核经历了几个主要的发展阶段,从裸机应用,批处理系统到多道任务系统,演变为至今主流的线程操作系统。这种系统基于线程的切换来调度任务;为了进一步提升性能,一些现代编程语言在应用层复用线程资源,提出了“协程的”的概念,节省任务调度的开销。 -在本项目中我们提出一种新的内核开发思想:由不同资源共享调度器,在操作系统层面提供协程。我们希望这种全新设计的内核在满足传统内核的易用性的同时,拥有着专有内核的高性能特点,“像风一样快”,因此取名**飓风内核**——**tornado-os**。 +操作系统内核经历了几个主要的发展阶段,从裸机应用,批处理系统到多道任务系统,演变为至今主流的线程操作系统。这种系统基于线程的切换来调度任务;为了进一步提升性能,一些现代编程语言在应用层复用线程资源,提出了“协程”的概念,节省任务调度的开销。 +在本项目中我们提出一种新的内核开发思路:由不同资源共享调度器,在操作系统层面提供协程。我们希望这种全新设计的内核在满足传统内核的易用性的同时,拥有着专有内核的高性能特点,“像风一样快”,因此取名**飓风内核**——**tornado-os**。 设计文档请参考[这里](https://qf.rs/2021/04/23/%E5%BC%82%E6%AD%A5%E5%86%85%E6%A0%B8%E7%9A%84%E8%AE%BE%E8%AE%A1%E4%B8%8E%E5%AE%9E%E7%8E%B0.html) 同时这里有开发成员制作的[PPT](doc/shared_scheduler_based_async_kernel_design.pdf) + +## 运行异步任务 +飓风内核中和传统内核最大的不同点就在于多任务的运行方式,在飓风内核中基于共享调度器来运行异步任务,伪代码呈现如下: +```Rust +pub extern "C" fn kernel_main() { + // 内核的一些初始化过程 + kernel::init(); + // 共享调度器的基地址 + let base = 0x8600_0000; + // 获取共享调度器 + let shared_scheduler = unsafe { task::SharedScheduler::load(base) }; + // 创建一个 Future + let future = MyFuture::new(); + // 用 future 创建一个任务 + let task = task::KernelTask::new(future); + // 往共享调度器里面添加任务 + shared_scheduler.add_task(task); + // 内核异步运行时中的执行器执行任务 + runtime::executor::run_until_idle(); +} + +``` + +用户态运行异步任务的方法和内核态基本一致。 + +## 系统架构 + 系统架构 + ## 如何运行 构建工具: + Rust 环境(nightly-2021-03-01或以上) + [Just 工具](https://github.com/casey/just) + [cargo-binutils](https://github.com/rust-embedded/cargo-binutils) -+ [qemu-system-riscv64](https://github.com/qemu/qemu) ++ [qemu-system-riscv64](https://github.com/qemu/qemu)(推荐 5.2.0 版本) 另外反汇编需要 `riscv64-linux-gnu-objdump`,该工具在 Ubuntu 操作系统上可以通过 `apt-get` 下载。 调试工具:RISC-V 指令集支持的 [gdb](https://mirrors.tuna.tsinghua.edu.cn/gnu/gdb/?C=M&O=D) @@ -40,7 +68,8 @@ just qemu user_task + tornado-kernel: 飓风内核实现 + tornado-user: 用户态代码实现 -其中飓风内核中与共享调度器通过 API 兼容方式进行交互,具体参考[代码](tornado-kernel/src/task/shared.rs),用户态代码同上,具体请参考[代码](tornado-user/src/task/shared.rs)。 +其中共享调度器以二进制包的形式编译,集成一些接口提供给内核和用户,具体实现参考[代码](shared-scheduler/src/main.rs)。 +飓风内核中与共享调度器通过 API 兼容方式进行交互,具体参考[代码](tornado-kernel/src/task/shared.rs),用户态代码同上,具体请参考[代码](tornado-user/src/task/shared.rs)。 内核态和用户态都分别实现了一个`执行器`,分别是[内核态执行器](tornado-kernel/src/task/executor.rs)和[用户态执行器](tornado-user/src/task/shared.rs)。 内核中任务的定义在[这里](tornado-kernel/src/task/kernel_task.rs),用户态中任务的定义在[这里](tornado-user/src/task/user_task.rs),不同的地址空间可以定义自己的任务语义,其他地址空间无法解析。 @@ -51,7 +80,7 @@ just qemu user_task - [执行器与生成语义](https://qf.rs/2021/05/01/%E6%89%A7%E8%A1%8C%E5%99%A8%E4%B8%8E%E7%94%9F%E6%88%90%E8%AF%AD%E4%B9%89.html) - [异步virtio之块设备驱动实现](https://qf.rs/2021/05/26/%E5%BC%82%E6%AD%A5%E7%89%88virtio%E5%9D%97%E8%AE%BE%E5%A4%87%E9%A9%B1%E5%8A%A8%E5%AE%9E%E7%8E%B0.html) + [doc](doc)目录 -+ 代码注释 ++ 代码注释,项目代码中有着充分的文档注释,包括一些实现思路 ## 衍生项目 项目开发过程中,我们经常会有一些想法和思路,在完整的项目中不是很好实现,因此衍生出一些其他的项目: diff --git a/assets/system.png b/assets/system.png new file mode 100644 index 0000000000000000000000000000000000000000..877c1f8b526f853b3579ea67b243875f0d3e3d07 GIT binary patch literal 41224 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

>+QfIw*wdNb5uE5`sT;w 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 Y-aN=lD0)&Fy0=g6hLTjaq`~9=0i|=N#sB~S literal 0 HcmV?d00001