Skip to content

Commit

Permalink
doc: update readme
Browse files Browse the repository at this point in the history
update docs and format the code
  • Loading branch information
Godones committed Jan 25, 2024
1 parent 70e8d80 commit c22c7a4
Show file tree
Hide file tree
Showing 12 changed files with 6,323 additions and 6,382 deletions.
4 changes: 0 additions & 4 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,3 @@ members = [
#lto = true
#codegen-units = 1



[workspace.dependencies]
spin = "0"
76 changes: 17 additions & 59 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,38 +12,24 @@ A simple operating system implemented in rust. The purpose is to explore how to
├── README.md (readme)
├── apps (rust程序)
├── assert
├── boot (内核启动代码)
├── kernel (核心子系统)
├── doc (开发文档与内核相关模块文档)
├── kernel
├── Cargo.toml
├── build.rs (系统调用+调式符号生成脚本)
└── src
├── arch (riscv相关代码)
├── board (板级设备扫描注册)
├── config.rs (内核配置)
├── device (设备注册管理)
├── driver (设备驱动)
├── error.rs (内核错误码定义)
├── fs (文件系统相关)
├── gui.rs (gui显示相关)
├── interrupt (外中断相关)
├── ipc (进程间通信模块)
├── lib.rs (内核代码模块导出)
├── memory (内存管理)
├── net (网络模块)
├── panic.rs (堆栈回溯)
├── print (内核输入输出)
├── sbi.rs (SBI系统调用)
├── sync (同步原语)
├── sys.rs (内核运行信息)
├── syscall.rs (系统调用表)
├── system.rs (机器信息)
├── task (进程/线程管理)
├── timer (计时器)
├── trace (堆栈回溯)
└── trap (异常处理)
├── modules (内核模块)
├── rust-toolchain.toml
├── subsystems
├── arch (riscv相关代码)
├── platform (平台相关代码)
├── config (内核配置)
├── devices (设备注册管理)
├── drivers (设备驱动合集)
├── unwinder (内核panic处理)
├── vfs (虚拟文件系统)
├── interrupt (外中断注册管理)
├── ipc (进程间通信模块)
├── mem (内存管理)
├── knet (网络模块)
├── ksync (内核锁实现)
├── timer (时间相关实现)
├── constants (常量、错误定义)
├── device_interface(设备接口定义)
├── tests (测试程序)
├── tools (一些dts文件)
└── userlibc (rust lib库)
Expand Down Expand Up @@ -125,34 +111,6 @@ make unmatched LOG= UNMATCHED=y SMP=2
## [Doc](docs/doc/doc.md)


## App/Test

- [x] libc-test
- [x] busybox
- [x] lua
- [x] lmbench
- [x] iozone
- [x] cyclictest
- [x] libc-bench
- [x] unixbench
- [x] netperf
- [x] iperf
- [x] bash
- [x] redis
- [x] sqlite3
- [x] slint gui
- [x] embedded graphic gui



## Working

- [ ] 重构重要子模块
- [x] pager
- [x] tracer
- [x] vfs
- [ ] vmm
- [ ] task

## Reference

Expand Down
22 changes: 21 additions & 1 deletion docs/doc/doc.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,24 @@
- [dbfs](https://github.com/Godones/dbfs2)
- [物理页帧分配器](https://github.com/os-module/pager)
- 更多: 查看[系统架构](系统架构.md)中module部分各个子模块的详细说明
- `make docs` 查看kernel源代码文档
- `make docs` 查看kernel源代码文档



## 测试通过

- [x] libc-test
- [x] busybox
- [x] lua
- [x] lmbench
- [x] iozone
- [x] cyclictest
- [x] libc-bench
- [x] unixbench
- [x] netperf
- [x] iperf
- [x] bash
- [x] redis
- [x] sqlite3
- [x] slint gui
- [x] embedded graphic gui
4 changes: 4 additions & 0 deletions docs/index.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
Welcome to the Alien OS blog, where Alien OS maintainers announce development and progress updates.

## Posts from 2024

**2024/1** [子系统划分](./subsystem.md)

## Posts from 2023

**2023/12** [更多模块的改进](./stage-refactor.md)
Expand Down
100 changes: 31 additions & 69 deletions docs/subsystem.md
Original file line number Diff line number Diff line change
@@ -1,23 +1,24 @@
# Subsystem

这一阶段,我们将原来的内核划分为一些较为松耦合的子系统。子系统与我们之前的模块化工作有相似之处,但是目标不一样。简单来说,之前的模块化是将内核中可独立的部分脱离内核,从而可被其它内核使用,而现在我们将内核继续划分,这些划分的子系统有点类似linux中的各个子系统,比如内存管理子系统、平台相关子系统、任务子系统等,这些子系统只是对原来的内核的交互进行了梳理,使得各个子系统之间的依赖关系,信息交互更加合理,这些子系统与我们的内核紧密相关,因此大多数是不能被其它内核所使用
这一阶段,我们将原来的内核划分为一些较为松耦合的子系统。子系统与我们之前的模块化工作有相似之处,但是目标不一样。简单来说,之前的模块化是将内核中可独立的部分脱离内核,从而可被其它内核所复用,而现在我们将内核继续划分,这些划分的子系统有点类似linux中的各个子系统,比如内存管理子系统、平台相关子系统、任务子系统等,这些子系统只是对原来的内核的交互进行了梳理,使得各个子系统之间的依赖关系,信息交互更加合理,这些子系统与我们的内核紧密相关,因此大多数不能被其它内核所使用

目前系统被划分为几个简单的子系统
目前系统被划分为几个较为简单的子系统

1. `config`:提供内核的相关配置,比如启动栈大小、用户程序栈大小,缓冲区大小等
2. `arch` : 提供体系结构相关的功能,我们的内核目前只运行在riscv平台上,所以这里只是简单提供一下开关中断/激活页表的功能
3. `platform` : 平台相关的部分,我们的内核可以跑在几个不同的开发板上,这部分主要负责系统的启动和初始输出初始化
4. `constants`: 提供内核子系统直接都会使用的数据结构定义
5. `device_interface`: 提供各种设备的接口定义,这在设备管理子系统和驱动子系统实现中被引用
6. `devices`: 设备管理子系统,负责扫描、注册所有的设备,其会引用任务管理子系统的功能
7. `drivers`: 驱动子系统,包含了支持的设备的驱动程序,这些驱动程序会引用任务管理子系统的功能
8. `interrupt`: 负责管理和分发外部中断处理
9. `ksync`: 只是对内核锁的简单封装
10. `mem` : 建立内核的映射,并负责管理整个系统的内存分配
11. `timer`: 负责获取时间
2. `constants`: 提供内核子系统都会使用的数据结构、常量定义
3. `timer`: 负责几个不同时间定义的获取和转换
4. `arch` : 提供体系结构相关的功能,我们的内核目前只运行在riscv平台上,所以这里只是简单提供一下开关中断/激活页表的功能
5. `platform` : 平台相关的部分,我们的内核可以跑在几个不同的开发板上,这部分主要负责系统的启动和初始的输出初始化,同时,它会提供平台相关的配置,并向外部导出一些基本的平台信息.
6. `device_interface`: 提供各种设备的接口定义,这在设备管理子系统和驱动子系统实现中被引用
7. `devices`: 设备管理子系统,负责扫描、注册所有的设备,同时为这些设备实现VFS相关的接口
8. `drivers`: 驱动子系统,包含了支持的设备的驱动程序,这些驱动程序可能会需要任务管理子系统的功能,并且需要实现`device_interface`中定义的接口
9. `interrupt`: 负责注册、管理和分发外部中断处理
10. `ksync`: 只是对内核锁的简单封装
11. `mem` : 建立内核的映射,并负责管理整个系统的页分配、内存分配
12. `vfs`: 负责注册内核支持的文件系统,并建立文件系统树
13. `unwinder`: 内核崩溃处理
14. `kernel`: 这部分包含了内核的所有系统调用实现,负责进行进程/线程的管理,以及中断/异常处理,其会协调其它子系统的初始化,然后使用其它子系统的数据和功能
14. `knet`: 网络相关的数据结构定义和实现
15. `kernel`: 这部分包含了内核的所有系统调用实现,负责进行进程/线程的管理,以及中断/异常处理,其会协调其它子系统的初始化,然后使用其它子系统的数据和功能



Expand All @@ -27,72 +28,33 @@



这里我们对几个比较核心且未来可能作为隔离域存在的子系统进行讨论。
这些子系统比较核心的的是`device` `drivers` `knet` `mem` `vfs` `kernel`。其中`kernel`部分作为系统中最核心的部分,需要协调各个子系统之间的初始化,并且通过调用这些子系统提供的功能,完成大多数系统调用的实现。在`device``drivers`的实现中,可能需要涉及到任务管理相关的功能,

`drivers` 子系统是不同设备的驱动实现集合,目前我们将其放在一个`crate`中,在未来驱动被作为一个隔离域实现时,需要将其拆分出来形成不同的`crate`

块设备驱动`GenericBlockDevice`:

1. 如果是一个virtio 设备,其会需要依赖一块设备地址空间。
2. 如果是一个sdio设备,其会需要依赖一块设备地址空间。

向上,块设备驱动使用一个接口暴露功能
首先对于`drivers`来说,一些设备可能需要实现非阻塞的功能,这需要在适当的时候进行任务切换并在中断到来后进行任务唤醒,这会产生一个依赖倒置的现象,即虽然这些驱动会被在任务管理子系统进行初始化之前被使用,但它们却依赖了任务管理子系统的功能。但因为这些依赖并不会在第一次使用驱动进行设备初始化的时候使用,我们可以不让`drivers`子系统直接依赖`kernel`,而是在`kernel`的初始化过程中将依赖注入,这通常需要定义接口来完成:

```rust
pub trait BlockDevice: Send + Sync + DeviceBase {
fn read(&self, buf: &mut [u8], offset: usize) -> AlienResult<usize>;
fn write(&self, buf: &[u8], offset: usize) -> AlienResult<usize>;
fn size(&self) -> usize;
fn flush(&self) -> AlienResult<()>;
pub trait DriverTask: Send + Sync + DowncastSync {
fn to_wait(&self);
fn to_wakeup(&self);
fn have_signal(&self) -> bool;
}
```

在设备管理子系统中,扫描程序会使用驱动程序实例化一个设备,并再次使用其提供的接口功能实现文件系统相关的接口。

因此,如果需要将其作为一个隔离域,这个隔离域向外暴露的功能就应该与其接口类似,而对于依赖,根据不同的设备,我们可能会传递一个`MmioTransport` 结构体或者 `SDIo`结构体。



串口设备驱动`Uart`:

1. 其依赖由几个寄存器构成的设备地址空间
impl_downcast!(sync DriverTask);

向上,其使用一个接口暴露功能:

```rust
pub trait UartDevice: Send + Sync + DeviceBase {
fn put(&self, c: u8);
fn get(&self) -> Option<u8>;
fn put_bytes(&self, bytes: &[u8]);
fn have_data_to_get(&self) -> bool;
fn have_space_to_put(&self) -> bool;
pub trait DriverWithTask: Send + Sync {
fn get_task(&self) -> Arc<dyn DriverTask>;
fn put_task(&self, task: Arc<dyn DriverTask>);
fn suspend(&self);
}

static DRIVER_TASK: Once<Box<dyn DriverWithTask>> = Once::new();
```

如果将其作为一个隔离域,其可能的形式应该如下:
通过这种方式,可以将各个子系统进行更强的解耦,但是一个负面作用是需要一个集中地来负责注入相关的依赖。

```rust
pub struct Registers<R: Register + Copy> {
pub thr_rbr_dll: RwReg<R>,
pub ier_dlh: RwReg<R>,
pub iir_fcr: RwReg<R>,
pub lcr: RwReg<R>,
pub mcr: RwReg<R>,
pub lsr: RoReg<R>,
pub msr: RoReg<R>,
pub scratch: RwReg<R>,
}
`devices`子系统同样也会有这样的问题,虽然我们目前不知道是否是因为系统的设计不够合理导致的这种状况的发生,但这并不是什么棘手的问题。

fn main(regs:Box<Registers>)->Box<dyn UartDomain>{
//
}
不过仍然有一些子系统可能会直接进行依赖,比如`vfs``devices`, 因为在`vfs`建立文件树的过程中,需要根据已有的设备信息建立`/dev/`目录,暂时还没有更好的方式来解决这个问题。

pub trait UartDomain{
fn put(&self, c: u8);
fn get(&self,[u8]) -> RpcResult<[u8]>;
fn put_bytes(&self, [u8;128]);
fn have_data_to_get(&self) -> RpcResult<()>;
fn have_space_to_put(&self) -> RpcResult<()>;
}
```
`kernel`中,因为各个系统调用的实现,中断/异常处理与任务管理子系统紧密相关,将他们进行拆分显得不是那么容易和直观,将他们放在一起同时也利于阅读和检查。

2 changes: 1 addition & 1 deletion kernel/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ vfscore = { git = "https://github.com/os-module/rvfs.git", features = [
syscall-table = { git = "https://github.com/os-module/syscall-table.git" }
smpscheduler = { git = "https://github.com/os-module/smpscheduler.git" }
page-table = { git = "https://github.com/os-module/page-table.git", branch = "dev" }
netcore = {git = "https://github.com/os-module/simple-net"}
netcore = { git = "https://github.com/os-module/simple-net" }


[features]
Expand Down
4 changes: 2 additions & 2 deletions subsystems/devices/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ vfscore = { git = "https://github.com/os-module/rvfs.git", features = [
"linux_error",
] }

virtio-drivers = { git = "https://github.com/rcore-os/virtio-drivers",rev = "de1c3b1"}
netcore = {git = "https://github.com/os-module/simple-net"}
virtio-drivers = { git = "https://github.com/rcore-os/virtio-drivers",rev = "de1c3b1" }
netcore = { git = "https://github.com/os-module/simple-net" }



Expand Down
12 changes: 6 additions & 6 deletions subsystems/drivers/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,20 +16,20 @@ timer = { path = "../timer" }
platform = { path = "../platform" }
spin = "0"

virtio-drivers = { git = "https://github.com/rcore-os/virtio-drivers",rev = "de1c3b1"}
virtio-drivers = { git = "https://github.com/rcore-os/virtio-drivers",rev = "de1c3b1" }
rtc = { git = "https://github.com/os-module/rtc.git" }
lru = "0.10.0"

# uart
uart16550 = { version = "0.0.1"}
uart8250 = { git = "https://github.com/os-module/uart-rs.git"}
uart8250 = { git = "https://github.com/os-module/uart-rs.git" }


# net
loopback = {git = "https://github.com/os-module/simple-net"}
virtio-net = {git = "https://github.com/os-module/simple-net"}
netcore = {git = "https://github.com/os-module/simple-net"}
loopback = { git = "https://github.com/os-module/simple-net" }
virtio-net = { git = "https://github.com/os-module/simple-net" }
netcore = { git = "https://github.com/os-module/simple-net" }

visionfive2-sd = { git = "https://github.com/os-module/visionfive2-sd.git"}
visionfive2-sd = { git = "https://github.com/os-module/visionfive2-sd.git" }
downcast-rs = { version = "1.2.0", default-features = false }

2 changes: 1 addition & 1 deletion subsystems/knet/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ edition = "2021"
[dependencies]
constants = { path = "../constants" }
ksync = { path = "../ksync" }
netcore = {git = "https://github.com/os-module/simple-net"}
netcore = { git = "https://github.com/os-module/simple-net" }
vfs = { path = "../vfs" }
vfscore = { git = "https://github.com/os-module/rvfs.git", features = [
"linux_error",
Expand Down
4 changes: 2 additions & 2 deletions subsystems/mem/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
config = {path = "../config" }
arch = {path = "../arch" }
config = { path = "../config" }
arch = { path = "../arch" }
ksync = { path = "../ksync" }
pager = { git = "https://github.com/os-module/pager", default-features = false, optional = true }
platform = { path = "../platform" }
Expand Down
2 changes: 0 additions & 2 deletions subsystems/platform/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@ preprint = "0.1.0"
fdt = { git = "https://github.com/repnop/fdt" }

[features]
default = []

qemu_riscv = []
vf2 = []
hifive = []
Expand Down
Loading

0 comments on commit c22c7a4

Please sign in to comment.