BUAA-OS-lab5-文件系统
发表于:2023-06-10 | 分类: BUAA操作系统
字数统计: 1.8k | 阅读时长: 6分钟 | 阅读量:

BUAA-OS lab5实验报告,关于mos系统的外设的管理,文件系统的实现。

lab5_log

实验要求

  • 了解文件系统,磁盘的结构与读写,设备驱动的方法
  • 实现简单的文件系统服务
  • 了解微内核的设计思想

Thinking

Thinking 5.1

Thinking 5.1 如果通过 kseg0 读写设备,那么对于设备的写入会缓存到 Cache 中。这是一种错误的行为,在实际编写代码的时候这么做会引发不可预知的问题。
请思考:这么做这会引发什么问题?对于不同种类的设备(如我们提到的串口设备和 IDE 磁盘)的操作会有差异吗?可以从缓存的性质和缓存更新的策略来考虑。

  • 结构中对于维护cache一致性的方法不同,会引发一定的问题
    • 若是写通策略,CPU更新cache内容时,同时对内存进行更新,则不会有问题。
    • 若是写回策略,CPU更新cache内容时,不会立刻写到内存中,只会在下一次更新cache时更新内存。
      • 这对于外设来说,无法及时得到CPU写入的数据,就会有问题。

Thinking 5.2

Thinking 5.2 查找代码中的相关定义,试回答一个磁盘块中最多能存储多少个文件控制块?一个目录下最多能有多少个文件?我们的文件系统支持的单个文件最大为多大?

  • File结构体被f_pad对齐为了256B,一个磁盘块为4KB,所以最多容纳16个File。
  • 一个文件控制块(即File结构体,包括间接)中可以存下的指针为1K,所以可以指向1K块磁盘块,所以可以容纳16K个文件。
  • 可以存的文件大小是1K*4K=4MB

Thinking 5.3

Thinking 5.3 请思考,在满足磁盘块缓存的设计的前提下,我们实验使用的内核支持的最大磁盘大小是多少?

  • 因为块缓存是1GB的空间,所以文件系统的磁盘大小也是1GB。

Thinking 5.4

Thinking 5.4 在本实验中,fs/serv.h、user/include/fs.h 等文件中出现了许多宏定义,
试列举你认为较为重要的宏定义,同时进行解释,并描述其主要应用之处。

  • 这里面的宏定义大多数都是指代的不同结构的大小,以及起始结束地址。

Thinking 5.5

Thinking 5.5 在 Lab4“系统调用与 fork”的实验中我们实现了极为重要的 fork 函数。那么 fork 前后的父子进程是否会共享文件描述符和定位指针呢?请在完成上述练习的基础上编写一个程序进行验证。

  • 文件描述符与定位指针在[FDTABLE, FILEBASE)中,在fork执行时,这一部分会被复制到子进程的页表中,所以他们会共享。

Thinking 5.6

Thinking 5.6 请解释 File, Fd, Filefd 结构体及其各个域的作用。比如各个结构体会在哪些过程中被使用,是否对应磁盘上的物理实体还是单纯的内存数据等。说明形式自定,要求简洁明了,可大致勾勒出文件系统数据结构与物理实体的对应关系与设计框架。

  • Fd结构体时被用户所使用的,所以只是内存中的数据,用于标定文件信息。
  • Filefd结构体时Fd结构体加上File,File结构体对应着磁盘中的它所在目录的内存,而它自身有的指针指向了它的内容。

Thinking 5.7

Thinking 5.7 图5.7中有多种不同形式的箭头,请解释这些不同箭头的差别,并思考我们的操作系统是如何实现对应类型的进程间通信的。

  • uml时序图用不同的形状表示不同的元素,箭头一般表示消息元素,即,不同对象之间发送的消息,表示的含义,或是调用,或是等待。
  • 发送方先调用ipc_send向接收方发消息,等到接收方调用ipc_recv接收到消息之后,发送方使用ipc_recv等待返回消息。

Exercise

Exercise 5.1-5.3

  • 完成写dev外设与读的系统调用
  • IDE的磁盘驱动,通过MIMO实现
    • 使用上面实现的系统调用,通过对不同地址的操作来实现。

Exercise 5.4-5.8

  • 接下来开始构造文件系统,我们虚拟抽象出磁盘块Block的概念,一个Block由多个扇区组成。
    • 第0个块叫做boot,就是驱动程序。第1块是Super,里面存着文件系统的基本信息。第2块存着管理空闲磁盘资源的bitmap(一bit一block)。
  • 而文件系统镜像的构建在tools/fsformat.c中,与mos处在同一个层级。
    • 可以在fs/Makefile中构建初始的file
    • 用法是Usage: fsformat <img-file> [files or directories]...
    • 我们通过user/lib/fs.h定义了File结构体(文件控制块)
  • Block缓存的机制,因为文件系统通过一个进程来实现,所以用1G的空间来做映射。
  • 接下来fs/serv.h这个文件中提供了对于文件系统的操作接口API。
  • fs.c文件里完成了对于文件系统块缓存操作的一些函数。
    • 比如diskaddr,map,dir_lookup,file_create;

Exercise 5.9-5.10

  • 构建完文件系统,接下来是关于文件系统的一些用户接口,主要定义在fd.h中。与file.c中
  • fd是我们引入的一个新抽象,文件描述符,read write等操作都需要通过fd在描述符表中索引到文件信息。
    • 而在mos中,通过将Fd结构体,强制转换成FileFd结构体,得到被掩盖的File。

Exercise 5.11-5.13

  • guidebook中有一幅uml图标定了用户进程是怎么获取到文件系统的服务的。
    • serv.c运行即是文件系统的服务进程,在fs/fs.c中有一个fs_init函数,完成了初始化。
    • 可以看到它与用户进程之间通过ipc通信来完成服务。这种ipc通信也被封装起来了,在user/lib/fsipc.c中,用户进程通过它们来实现与文件系统进程的通信,文件系统这个用户进程通过使用我们前面所讲的一些用户接口来完成请求。

总结

  • 整个lab5实验部分做下来还是不难的,但最主要的是要理解前前后后的设计思路。
  • 从对于外设的读写开始,到用ide磁盘抽象出磁盘块构建文件系统,然后用fs.c完成对于磁盘块缓存的构建。
  • 然后抽象出文件系统描述符,完成对于文件进程serv操作文件系统的一些接口的创建。
  • 最后完成其他用户进程与文件系统进程之间的通信。
  • 这一整个过程十分的完整且精巧,体现了微内核结构下操作系统的层次结构。
上一篇:
BUAA-OS-lab6-管道与shell
下一篇:
BUAA-OS-lab4-系统调用与ipc与fork