Ver código fonte

排版,增加导航栏 (#25)

* 增加DragonOS教案配置

* 排版,增加导航栏

---------

Co-authored-by: Yuzizhou <[email protected]>
DaJiYuQia 1 ano atrás
pai
commit
9a800ba923
2 arquivos alterados com 84 adições e 98 exclusões
  1. 70 84
      docs/DragonOS/Assignment/Lab1.md
  2. 14 14
      docs/DragonOS/Lab/Lab1.md

+ 70 - 84
docs/DragonOS/Assignment/Lab1.md

@@ -1,8 +1,16 @@
-## 实验内容
+---
+sidebar: auto
+---
+
+# 文件系统
+
+## 补写代码
+
+### 创建文件
 
 ramfs的基本功能在/kernel/src/filesystem/ramfs/mod.rs中,实现过程中请参考文件../vfs/mod.rs以及已实现函数的相关代码和注释。在实现基本的文件操作之前,需要先实现创建文件结构的辅助函数:create_with_data。其用于创建文件时,在父目录下创建带初始化数据的inode。
 
->**练习1:**实现位于/kernel/src/filesystem/ramfs/mod.rs中的 create_with_data。
+>练习1:实现位于/kernel/src/filesystem/ramfs/mod.rs中的 create_with_data。
 
 ```rust
     // 该函数用于在当前目录下创建一个新的inode,并传入一个简单的data字段,方便进行初始化。
@@ -31,11 +39,11 @@ ramfs的基本功能在/kernel/src/filesystem/ramfs/mod.rs中,实现过程中
     }
 ```
 
-文件读写是文件系统的基本功能,ramfs的读写操作会将文件数据块中内容读入内存缓冲区,或将缓冲区内容写入对应文件数据块。read_at和 write_at两个函数分别用于以一定偏移量读取和写入一段长度的数据,并且返回实际的读写字节长度 (读取不能超过文件大小)
-
+### 文件读写
 
+文件读写是文件系统的基本功能,ramfs的读写操作会将文件数据块中内容读入内存缓冲区,或将缓冲区内容写入对应文件数据块。`read_at`和 `write_at`两个函数分别用于以一定偏移量读取和写入一段长度的数据,并且返回实际的读写字节长度 (读取不能超过文件大小)
 
->**练习2:**实现位于/kernel/src/filesystem/ramfs/mod.rs中的 read_at和 write_at。
+>练习2:实现位于/kernel/src/filesystem/ramfs/mod.rs中的 read_at和 write_at。
 
 ```rust
     // 该函数用于实现对文件以一定偏移量读取一段长度的数据,并且返回实际的读字节长度。
@@ -89,41 +97,33 @@ ramfs的基本功能在/kernel/src/filesystem/ramfs/mod.rs中,实现过程中
     }
 ```
 
+## 实现 myramfs
 
+> 练习3:模仿 ramfs 实现 my_ramfs,并更正 ramfs
 
-> **练习3:**模仿ramfs实现my_ramfs,并更正ramfs
-
-原ramfs其实是有点小问题的,需要在my_ramfs更正后再测试,具体如下:
-
-
+原 ramfs 其实是有点小问题的,需要在 my_ramfs 更正后再测试,具体如下:
 
-**open和close**
+### open和close
 
-测试代码中打开文件调用的open函数,最终会进行系统调用,在**kernel/src/syscall**中,标志是**SYS_OPEN**
+测试代码中打开文件调用的`open`函数,最终会进行系统调用,在 **kernel/src/syscall** 中,标志是`SYS_OPEN`
 
-![图片1](/OS_lab_tutorial/docs/.vuepress/public/DragonOS/SYS_OPEN.png)
+![图片1](../../.vuepress/public/DragonOS/SYS_OPEN.png)
 
-检查文件路径正确后会调用同级目录下的**syscall.rs**中的open函数
+检查文件路径正确后会调用同级目录下的 **syscall.rs** 中的 open 函数
 
+测试代码中的关闭文件调用`close`函数也和 open 类似,标志为`SYS_CLOSE`,然后调用 **syscall.rs** 中的 close 函数
 
+![图片2](../../.vuepress/public/DragonOS/SYS_CLOSE.png)
 
-测试代码中的关闭文件调用close函数也和open类似,标志为**SYS_CLOSE**,然后调用**syscall.rs**中的close函数
-
-![图片2](/OS_lab_tutorial/docs/.vuepress/public/DragonOS/SYS_CLOSE.png)
-
-
-
-再看**kernel/vfs/mod.rs**的IndexNode接口中
-
-![图片3](/OS_lab_tutorial/docs/.vuepress/public/DragonOS/IndexNode_open_and_close.png)
-
-如果文件系统没有具体实现open和close函数,就返回不支持,所以这就是出错的原因
+再看 **kernel/vfs/mod.rs** 的`IndexNode`接口中
 
+![图片3](../../.vuepress/public/DragonOS/IndexNode_open_and_close.png)
 
+如果文件系统没有具体实现 open 和 close 函数,就返回不支持,所以这就是出错的原因
 
 **解决方式:**
 
-在我们模仿的ramfs文件系统里,添加open和close函数的具体实现,如下:
+在我们模仿的 ramfs 文件系统里,添加 open 和 close 函数的具体实现,如下:
 
 ```rust
 fn open(&self, _data: &mut FilePrivateData, _mode: &super::vfs::file::FileMode) -> Result<(), SystemError> {
@@ -135,26 +135,21 @@ fn close(&self, _data: &mut FilePrivateData) -> Result<(), SystemError> {
 }
 ```
 
+### fopen
 
+测试代码中我们用到了`fopen`来打开文件,第二个参数的"w+"的含义可以在 **user/libs/libc/src/stdio.c** 文件中查看,表示读写文件,并且如果文件不存在的话就创建这个文件
 
-**fopen**
-
-测试代码中我们用到了fopen来打开文件,第二个参数的"w+"的含义可以在**user/libs/libc/src/stdio.c**文件中查看,表示读写文件,并且如果文件不存在的话就创建这个文件
+ fopen 的系统调用也是 SYS_OPEN ,但是和 open 的区别在于:
 
+![图片4](../../.vuepress/public/DragonOS/SYS_OPEN_truncate.png)
 
+ fopen 在满足条件的情况下会调用`truncate`函数,这个函数和 open 、close 一样,也是定义在 **vfs/mod.rs** 中的 IndexNode 接口中,但是没有具体实现,需要文件系统自己实现,如下:
 
-fopen的系统调用也是SYS_OPEN,但是和open的区别在于:
-
-![图片4](/OS_lab_tutorial/docs/.vuepress/public/DragonOS/SYS_OPEN_truncate.png)
-
-fopen在满足条件的情况下会调用truncate函数,这个函数和open、close一样,也是定义在**vfs/mod.rs**中的IndexNode接口中,但是没有具体实现,需要文件系统自己实现,如下:
-![图片5](/OS_lab_tutorial/docs/.vuepress/public/DragonOS/truncate.png)
-
-
+![图片5](../../.vuepress/public/DragonOS/truncate.png)
 
 **解决方式:**
 
-所以需要在我们模仿的ramfs中,添加truncate的具体实现,如下:
+所以需要在我们模仿的 ramfs 中,添加 truncate 的具体实现,如下:
 
 ```rust
 fn truncate(&self, _len: usize) -> Result<(), SystemError> {
@@ -169,106 +164,97 @@ fn truncate(&self, _len: usize) -> Result<(), SystemError> {
 
 ## 测试文件系统
 
-测试我们模仿实现的my_ramfs
+测试我们模仿实现的 my_ramfs
 
 ### 创建测试文件夹
 
-在**DragonOS/user/apps**目录下新建一个文件夹**my_test**
+在 **DragonOS/user/apps** 目录下新建一个文件夹 **my_test**
 
 ### 配置文件
 
 #### 拷贝文件
 
-找到**DragonOS/user/apps**目录下其他测试文件夹(例如:test_fstat)的两个文件:**link.lds** + **Makefile**,将这两个文件拷贝到我们新建的测试文件夹**my_test**中
+找到 **DragonOS/user/apps** 目录下其他测试文件夹(例如:test_fstat)的两个文件:**link.lds** + **Makefile**,将这两个文件拷贝到我们新建的测试文件夹 **my_test** 
 
 #### 更改Makefile内容
 
-将**Makefile**中的测试目录名改回来,假设拷贝的是test_fstat目录的,则按如下修改:
-
-**test_fstat/Makefile**
-
-![图片6](/OS_lab_tutorial/docs/.vuepress/public/DragonOS/test_fstat_Makefile.png)
-
+将 **Makefile** 中的测试目录名改回来,假设拷贝的是 test_fstat 目录的,则按如下修改:
 
+#### test_fstat/Makefile
 
-**my_test/Makefile**
+![图片6](../../.vuepress/public/DragonOS/test_fstat_Makefile.png)
 
-![图片7](/OS_lab_tutorial/docs/.vuepress/public/DragonOS/my_test_Makefile.png)
+#### my_test/Makefile
 
-将代码里的**test_fstat**改为**my_test**(**PS:**注意区分大小写)
+![图片7](../../.vuepress/public/DragonOS/my_test_Makefile.png)
 
-### 配置dadk
+将代码里的 **test_fstat** 改为 **my_test**(**PS:** 注意区分大小写)
 
-#### 拷贝文件
-
-在**DragonOS/user/dadk/config**目录下模仿其它文件新建一个文件**my_test-0.1.0.dadk**(**PS:**这里的my_test和我们在第一步创建的测试目录名相同),然后拷贝其他文件的内容到里面,比如拷贝**test_fstat-0.1.0.dadk**
+## 配置dadk
 
-#### 更改dadk内容
+### 拷贝文件
 
-还是和 2.2 类似,按如下修改:
+在 **DragonOS/user/dadk/config** 目录下模仿其它文件新建一个文件 **my_test-0.1.0.dadk**(**PS:** 这里的my_test和我们在第一步创建的测试目录名相同),然后拷贝其他文件的内容到里面,比如拷贝 **test_fstat-0.1.0.dadk**
 
-**test_fstat-0.1.0.dadk**
+### 更改dadk内容
 
-![图片8](/OS_lab_tutorial/docs/.vuepress/public/DragonOS/test_fstat_dadk.png)
+还是和之前类似,按如下修改:
 
+#### **test_fstat-0.1.0.dadk**
 
+![图片8](../../.vuepress/public/DragonOS/test_fstat_dadk.png)
 
-**my_test-0.1.0.dadk**
+#### **my_test-0.1.0.dadk**
 
-![图片9](/OS_lab_tutorial/docs/.vuepress/public/DragonOS/my_test_dadk.png)
+![图片9](../../.vuepress/public/DragonOS/my_test_dadk.png)
 
-将代码里的**test_fstat**都改成**my_test**
+将代码里的 **test_fstat** 都改成 **my_test**
 
-### 挂载文件系统
+## 挂载文件系统
 
 将你要测试的文件系统挂载到我们的操作系统上面
 
-打开**DragonOS/kernel/src/filesystem/vfs/core.rs**文件
+打开 **DragonOS/kernel/src/filesystem/vfs/core.rs** 文件
 
-#### 导入
+### 导入
 
 导入你自己实现的文件系统,比如我这里是模仿ramfs写了一个my_ramfs,就按如下添加:
-![图片10](/OS_lab_tutorial/docs/.vuepress/public/DragonOS/crate_my_ramfs.png)
 
-#### 创建文件夹、实例并挂载
-
-在**vfs_init**函数中:
+![图片10](../../.vuepress/public/DragonOS/crate_my_ramfs.png)
 
+### 创建文件夹、实例并挂载
 
+在`vfs_init`函数中:
 
 模仿其它文件系统创建当前准备测试的文件系统的文件夹,如下:
 
-![图片11](/OS_lab_tutorial/docs/.vuepress/public/DragonOS/vfs_init_mkdir.png)
-
+![图片11](../../.vuepress/public/DragonOS/vfs_init_mkdir.png)
 
+紧接着在下面创建 ramfs 实例,并挂载,照样是模仿其它文件系统挂载,如下:
 
-紧接着在下面创建ramfs实例,并挂载,照样是模仿其它文件系统挂载,如下:
+![图片12](../../.vuepress/public/DragonOS/vfs_init_mount.png)
 
-![图片12](/OS_lab_tutorial/docs/.vuepress/public/DragonOS/vfs_init_mount.png)
+### 迁移伪文件系统的inode
 
-#### 迁移伪文件系统的inode
+在 **migrate_virtual_filesystem** 函数中:
 
-在**migrate_virtual_filesystem**函数中:
-
-##### 获取inode,
+#### 获取inode
 
 模仿其它文件系统获取ramfs的inode,如下:
 
-![图片13](/OS_lab_tutorial/docs/.vuepress/public/DragonOS/binding.png)
+![图片13](../../.vuepress/public/DragonOS/binding.png)
 
-##### 迁移到新的文件系统下
+#### 迁移到新的文件系统下
 
-![图片14](/OS_lab_tutorial/docs/.vuepress/public/DragonOS/do_migrate.png)
+![图片14](../../.vuepress/public/DragonOS/do_migrate.png)
 
-### 开始测试
+## 开始测试
 
 至此,我们就可以开始测试文件系统了。
 
-在之前我们新建的测试文件夹**DragonOS/user/apps/my_test**目录下添加**main.c**文件,用来测试文件系统的开、关、读、写
-
-
+在之前我们新建的测试文件夹 **DragonOS/user/apps/my_test** 目录下添加 **main.c** 文件,用来测试文件系统的开、关、读、写
 
-测试的过程中会出现一些问题,具体原因在接下来的**ramfs的更正**
+测试的过程中会出现一些问题,具体原因在上文的 **ramfs的更正** 中
 
 ```c
 #include<sys/types.h>

+ 14 - 14
docs/DragonOS/Lab/Lab1.md

@@ -6,7 +6,7 @@ sidebar: auto
 
 ## 本章导读
 
-本章意在介绍文件系统相关知识,包括虚拟文件系统、ramfs以及如何在用户程序对自己写的文件系统进行测试
+本章意在介绍文件系统相关知识,包括虚拟文件系统、ramfs
 
 ## DragonOS文件系统的架构设计
 
@@ -24,7 +24,7 @@ sidebar: auto
 
 如图所示:
 
-![图片1](/OS_lab_tutorial/docs/.vuepress/public/DragonOS/DragonOS.png '文件系统架构设计')
+![图片1](../../.vuepress/public/DragonOS/DragonOS.png '文件系统架构设计')
 
 其中我们可以看到,中间部分作为接口对多个并行的物理文件系统实例(每一个都叫做文件系统的实现)提供支持。这就是虚拟文件系统。
 
@@ -50,7 +50,7 @@ VFS是DragonOS文件系统的核心,它提供了一套统一的文件系统接
 
 ## VFS的架构设计
 
-![图片2](/OS_lab_tutorial/docs/.vuepress/public/DragonOS/vfs_archi_design.png 'vfs架构设计')
+![图片2](../../.vuepress/public/DragonOS/vfs_archi_design.png 'vfs架构设计')
 
 ### File
 
@@ -206,14 +206,14 @@ pub struct MountFSInode {
 
 ramfs是vfs下具体实现的一种基于RAM做存储的文件系统,主要实现了以下功能:
 
-- **read_at**:
-- **write_at**:
-- **poll**:获取文件状态
-- **resize**:重置用于存放数据的data的大小
-- **create_with_data**:创建自带数据的文件
-- **link**:链接
-- **unlink**:解链接
-- **rmdir:**删除文件夹
-- **move_**:移动文件
-- **find**:查找文件
-- **list**:显示当前文件夹下的内容
+- `read_at`: 
+- `write_at`: 
+- `poll`: 获取文件状态
+- `resize`: 重置用于存放数据的data的大小
+- `create_with_data`: 创建自带数据的文件
+- `link**`: 链接
+- `unlink`: 解链接
+- `rmdir`: 删除文件夹
+- `move`: 移动文件
+- `find`: 查找文件
+- `list`: 显示当前文件夹下的内容