OS_Lab5

OS_Lab5

思考题

5.1

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

  • Proc文件系统是一个伪文件系统,做为Linux/Unix系统一个特殊接口来访问内核,常常挂载在/proc下,里面的大多数文件时只读的,但是我们仍然可以设置其中一些变量来改变内核设置。
  • Windows提供系统调用接口来实现这些功能。
  • Proc文件系统对系统调用进行了更多的抽象,同文件系统类似的操作降低用户的学习成本。缺点在于其长期驻留内存,占据内存空间。

5.2

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

  • 缓存内存中映射的外部设备内容时,可能外部设备更新后对内存进行了更新,但已经被缓存的部分没有被更新。这种错误对于磁盘概率较小,串口设备则很容易出现。

5.3

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

  • 1024 * 4KB = 4MB

5.4

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

  • fs.h中有如下定义
#define BY2FILE     256

struct File {
	u_char f_name[MAXNAMELEN];	// filename
	u_int f_size;			// file size in bytes
	u_int f_type;			// file type
	u_int f_direct[NDIRECT];
	u_int f_indirect;

	// lab5-extra
	u_int f_printcount;
	u_int f_modifycount;

	struct File *f_dir;		// the pointer to the dir where this file is in, valid only in memory.
	u_char f_pad[BY2FILE - MAXNAMELEN - 4 - 4 - NDIRECT * 4 - 4 - 4 - 4 - 4];
};

一个磁盘块为4KB,一个文件控制块256B,一块最多存 4KB / 256B = 16块。

  • 同文件,一个目录最大4MB, 因此一个目录最多 4MB / 256B = 16K个文件。

5.5

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

  • 我们用kseg1区域映射磁盘,因此最多处理1GB。

5.6

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

  • 不能。有些内存用户态没有读取或改写的权限。

5.7

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

  • 结构体 Filefd 的第一个成员就是结构体 Fd 的变量。根据C语言对结构体的内存分配,这么转换是可行的。

5.8

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

struct Fd {                     //文件描述符;打开文件时用于找到对应文件;单纯的内存数据;
        u_int fd_dev_id;        //设备id
        u_int fd_offset;        //页面中保存的文件数据的起始地址相对于该页面的偏移
        u_int fd_omode;         //允许用户进程对文件的操作类型
};

struct Filefd {                 //文件描述符;描述打开(读取信息)后的文件;单纯的内存数据;
        struct Fd f_fd;         //记录打开时用到的文件信息
        u_int f_fileid;         //文件系统为打开的文件进行的编号
        struct File f_file;     //对应文件的文件控制块
};

struct Open {                   //文件系统用来保存已打开的文件信息;仅供文件系统进程使用;单纯的内存数据;
    struct File *o_file;        //指向该文件的文件控制块的指针
    u_int o_fileid;             //文件的编号
    int o_mode;                 //允许用户进程对文件的操作类型
    struct Filefd *o_ff;        //该文件的文件描述符在文件系统进程中的虚拟地址
};

实验难点

  • 个人认为本次实验最难的除了读懂别人的代码、各个变量的作用、了解文件系统结构以外,最难的就是写驱动,因为我们需要小心翼翼地按照规定流程去读写设备,
    1. 写入要读/写的设备编号
    2. 写入要读/写的地址偏移量
    3. *(写入操作把待写数据写入缓存)
    4. 写入信息,开始读/写设备
    5. 判断读/写情况
    6. *(读取操作把缓存数据读出)

感想

耗时

本次实验用时有所缩短,究其原因应该是逻辑相比之前有所简单。BUG出的也比较少,耗时最久的BUG原因在于环境配置而不是代码书写。

想法

  • OS帮助我们抽象了许多东西让外设更加易用;
  • 标准的制定很重要。

猜你喜欢

转载自www.cnblogs.com/Suxy-99/p/12969213.html