Skip to content

Commit

Permalink
chore(lab/6): add begining of ata
Browse files Browse the repository at this point in the history
  • Loading branch information
GZTimeWalker committed Mar 18, 2024
1 parent 1fcd8bc commit f31d518
Show file tree
Hide file tree
Showing 5 changed files with 72 additions and 10 deletions.
3 changes: 2 additions & 1 deletion docs/labs/0x06/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@

对于本次实验内容,你需要参考学习如下实验资料:

- [用户空间](../../wiki/userspace.md)
- [文件系统概述](../../wiki/fs.md)
- [ATA 硬盘简介](../../wiki/ata.md)

## 实验任务与要求

Expand Down
26 changes: 26 additions & 0 deletions docs/labs/0x06/tasks.md
Original file line number Diff line number Diff line change
Expand Up @@ -106,10 +106,36 @@ impl MbrPartition {

## 磁盘驱动

在实现了 MBR 分区表解析后,笔者预计你对现有的代码结构已经有了一定的认知。现在,我们来实现 ATA 磁盘驱动,使得内核能够通过它访问“真实”的虚拟磁盘,并读取并解析其中的数据。

为了在内核中使用 `storage` 包的内容,需要对 `Cargo.toml` 进行修改,添加引用:

```toml
[dependencies]
storage = { package = "ysos_storage", path = "../storage" }
```

!!! note "明确概念:实验将实现 PATA 的 PIO 模式驱动,参考 [ATA PIO Mode - OSDev](https://wiki.osdev.org/ATA_PIO_Mode)"

回顾一下之前编写串口驱动的过程,它与即将实现的驱动类似,都是 PIO 来进行数据传输:

- 根据规范定义端口,使用端口进行读写操作控制外设寄存器
- 按照规定修改外设寄存器,使得设备按照预期的方式运行
- 通过数据和状态寄存器,实现数据的发送和接收
- 通过启用设备的中断,实现异步的数据传输(与轮询方式相对)

[ATA 硬盘简介](../../wiki/ata.md) 中,介绍了 ATA 硬盘的基本工作原理,以及相关概念。

`kernel/src/drivers/ata/bus.rs` 中,定义了 `AtaBus` 结构体,它扮演了实际与 CPU 进行数据交换的角色,而在 `mod.rs` 中定义的 `AtaDrive` 则扮演了磁盘的抽象。

这种设计类似于过往的实现中将 `serial``uart16550` 分开,不过磁盘会有自己的 `model` 等信息,需要获取并存储在 `AtaDrive` 中。

## FAT16 文件系统

## 思考题

1. 为什么在 `pkg/storage/lib.rs` 中声明了 `#![cfg_attr(not(test), no_std)]`,它有什么作用?哪些因素导致了 `kernel` 中进行单元测试是一个相对困难的事情?

2. 留意 `MbrTable` 的类型声明,为什么需要泛型参数 `T` 满足 `BlockDevice<B> + Clone`?为什么需要 `PhantomData<B>` 作为 `MbrTable` 的成员?在 `PartitionTable` trait 中,为什么需要 `Self: Sized` 约束?

## 加分项
51 changes: 42 additions & 9 deletions docs/labs/0x08/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,24 @@

请从下列任务中,选择一到两个目标进行实现:

### VGA 显示输出

串口输出只是最基本的交互方式,尝试在 bootloader 中,利用 `get_handle_for_protocol::<GraphicsOutput>` 获取到 VGA 显示的模式、分辨率、缓冲区地址等信息。

之后通过利用 `embedded-graphics` 等库,实现一个简单的图形输出驱动,赋予操作系统绘制图形的能力,之后实现一个简单的 Shell 显示,并激活键盘输入的驱动,通过和串口启动共享缓冲区的方式,响应键盘输入。

#### 实现目标

1. 在 bootloader 中,获取图形输出的相关信息,并传递给内核。
2. 实现一个简单的图形输出驱动,支持基本的 VGA 图形绘制操作。
3. 利用 `embedded-graphics` 实现字符渲染。
4. 为 VGA 显示实现一个 Shell 输出,使其能够输出字符、清屏等,并将其对接到合适的日志输出。

#### 加分项

1. 利用键盘输入中断,为 QEMU 的 GUI 界面实现输入输出。
2. 尝试将 Shell 部分限制在屏幕的下半部分,并在上半部分实现一些图像的绘制。作为一个例子,你可以利用 `sleep` 等方式,实现一个不断绘制转动的钟表的进程,并让它作为一个后台进程运行。

### 可读写的临时文件系统

根据现有的其他 OS 实验中的文件系统设计、或参考现有的文件系统设计,结合你学过的算法、组织数据的方式,实现一个简单的文件系统的驱动。
Expand All @@ -26,20 +44,35 @@
1. 尝试实现文件系统的硬链接,并测试读写操作。
2. 修改 QEMU 参数,挂载一块虚拟磁盘,尝试实现文件的持久化。

### VGA 显示输出
### 块设备的缓存层

串口输出只是最基本的交互方式,尝试在 bootloader 中,利用 `get_handle_for_protocol::<GraphicsOutput>` 获取到 VGA 显示的模式、分辨率、缓冲区地址等信息
`storage` 包中,基于目前已有的实现,实现一个块设备的缓存层

之后通过利用 `embedded-graphics` 等库,实现一个简单的图形输出驱动,赋予操作系统绘制图形的能力,之后实现一个简单的 Shell 显示,并激活键盘输入的驱动,通过和串口启动共享缓冲区的方式,响应键盘输入。
这里给出一个缓存设备结构体的设计参考:

```rust
pub struct CachedDevice<B, C>
where
B: BlockTrait,
C: CacheManager<B>,
{
cache: C,
device: Arc<dyn BlockDevice<B>>,
}
```

其中,`CacheManager` trait 定义缓存层的缓存管理器,在预期的实现中,你并不需要在这里实现具体的缓存策略,而将其留在 `kernel` 中实现。

#### 实现目标

1. 在 bootloader 中,获取图形输出的相关信息,并传递给内核。
2. 实现一个简单的图形输出驱动,支持基本的 VGA 图形绘制操作。
3. 利用 `embedded-graphics` 实现字符渲染。
4. 为 VGA 显示实现一个 Shell 输出,使其能够输出字符、清屏等,并将其对接到合适的日志输出。
1. 对设备缓存层、缓存管理器、缓存块进行抽象,并进行泛型设计。
2. 缓存管理器提供缓存块的获取、存储能力。
3. 缓存块实现脏数据标记、缓存块的读写,并为自身实现 `Drop` 时的自动写回。
4. 为设备缓存层实现 `BlockDevice<B>` trait。
5. 在内核中定义实际的缓存结构体,为它实现缓存管理器的相关功能。
6. 在最后的实现中,你应当能够将缓存层作为 `Fat16``inner`

#### 加分项

1. 利用键盘输入中断,为 QEMU 的 GUI 界面实现输入输出
2. 尝试将 Shell 部分限制在屏幕的下半部分,并在上半部分实现一些图像的绘制。作为一个例子,你可以利用 `sleep` 等方式,实现一个不断绘制转动的钟表的进程,并让它作为一个后台进程运行
1. 向操作系统暴露缓存的使用情况,并在系统状态中进行展示
2. 验证缓存是否能带来一定的性能提升,设计相关测试并记录输出
1 change: 1 addition & 0 deletions docs/wiki/ata.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# ATA 硬盘简介
1 change: 1 addition & 0 deletions mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ nav:
- x64 数据结构概述: wiki/structures.md
- 用户空间: wiki/userspace.md
- 文件系统概述: wiki/fs.md
- ATA 硬盘简介: wiki/ata.md

markdown_extensions:
- attr_list:
Expand Down

0 comments on commit f31d518

Please sign in to comment.