lab5——文件系统

思考题

Thinking 5.1

查阅资料,了解 Linux/Unix 的 /proc 文件系统是什么?有什么作用? Windows 操作系统又是如何实现这些功能的?proc 文件系统这样的设计有什么好处和可以改进的地方?

/proc文件系统是一种特殊的,由软件创建的(伪)文件系统,内核使用它向外界导出信息,/proc系统只存在内存当中,而不占用外存空间。/proc下面的每个文件都绑定于一个内核函数,用户读取文件时,该函数动态地生成文件的内容。

与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系 统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变 内核的运行状态。

Windows,分盘,每个驱动器有自己的根目录,形成的是多个树并列的结构。

Linux,只有一个根目录 / ,所有东西都是从这开始

Thinking 5.2

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

因为内核被放在kseg0区域,一般通过cache访问;如果对设备的写入缓存到cache中,就会导致以后想访问内核时却错误访问了写入设备的内容。

Thinking 5.3

一个磁盘块最多存储 1024 个指向其他磁盘块的指针,试计算,我们 的文件系统支持的单个文件的最大大小为多大?

4KB*1024=4MB

Thinking 5.4

查找代码中的相关定义,试回答一个磁盘块中最多能存储多少个文件控制块?一个目录下最多能有多少个文件?

1个磁盘块中最多能存储16个文件控制块,一个目录下最多能有1024*16=16384个文件

Thinking 5.5

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

0x6f3fd000

Thinking 5.6

如果将 DISKMAX 改成 0xC0000000, 超过用户空间,我们的文件系统还能正常工作吗?为什么?

不能,因为缓存磁盘块的时候可能会把内核的内容覆盖掉,导致系统运行异常

Thinking 5.7

阅读 user/file.c ,你会发现很多函数中都会将一个 struct Fd * 型的 指针转换为 struct Filefd * 型的指针,请解释为什么这样的转换可行。

因为在结构体Filefd中储存的第一个元素就是struct Fd*,因而对于相匹配的一对struct Fd和struct Filefd,他们的指针实际上指向了相同的虚拟地址,所以可以通过指针转化访问struct Filefd中的其他元素

Thinking 5.8

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

Fd结构体用于表示文件描述符,fd_dev_id表示文件所在设备的id,fd_offset表示读或者写文件的时候,距离文件开头的偏移量,fd_omode用于描述文件打开的读写模式。它主要用于在打开文件之后记录文件的状态,以便对文件进行管理/读写,不对应物理实体,只是单纯的内存数据。

Filefd结构体是文件描述符 和 文件的组合形式,f_fd记录了文件描述符,f_fileid记录了文件的id,f_file则记录了文件控制块,包含文件的信息以及指向储存文件的磁盘块的指针,对应了磁盘的物理实体,也包含内存数据。

Open结构体在文件系统进程用用于储存文件相关信息,o_file指向了对应的文件控制块,o_fileid表示文件id用于在数组opentab中查找对应的Open,o_mode记录文件打开的状态,o_ff指向对应的Filefd结构体。

Thinking 5.9 阅读serv.c/serve函数的代码,我们注意到函数中包含了一个死循
环for (;

上一篇:Python 打包的EXE文件反编译1|EXE文件反编译为pyc文件


下一篇:.pyc是什么