【OS】BUAA-OS-Lab5-实验报告

OS Lab5实验报告

思考题

Thinking 5.1

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

  • 写入延迟:对设备的写入可能不会立即生效,而是停留在 Cache 中,直到 Cache 被刷新(如通过 synccache flush 指令)。如果设备需要实时响应(如控制寄存器),会导致设备行为与预期不符。

  • 读取脏数据:如果设备状态被外部修改(如硬件中断更新状态寄存器),CPU 可能从 Cache 中读取旧数据,而非设备的最新状态。

  • 写回Cache:写入操作可能长时间停留在 Cache 中,导致设备无法及时收到数据。

Thinking 5.2

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

  • 一个磁盘块4KB,一个文件控制块256B,所以一个磁盘块最多存储16个文件控制块。
  • 一个目录下最多1024个磁盘块,所以最多16384个文件。
  • 单个文件最大占满整个4MB磁盘空间

Thinking 5.3

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

Thinking 5.4

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

  • #define BLOCK_SIZE PAGE_SIZE ,指出块大小即页大小
  • #define DISKMAX 0x40000000,磁盘在虚拟内存中缓冲块的大小
  • #define FILE2BLK (BLOCK_SIZE / sizeof(struct File)),一个块有多少文件控制块

Thinking 5.5

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

1
2
3
4
5
6
7
8
9
int id;
struct Fd* fdd;
if ((id = fork()) == 0) {
fd_lookup(r, &fdd);
debugf("offset1 == %d\n", fdd->fd_offset);
} else {
fd_lookup(r, &fdd);
debugf("offset2 == %d\n", fdd->fd_offset);
}

观察输出的offset是否相同即可验证。

Thinking 5.6

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct File {
char f_name[MAXNAMELEN]; //文件名称
uint32_t f_size; //文件大小
uint32_t f_type; //文件类型
uint32_t f_direct[NDIRECT]; // 文件直接指针
uint32_t f_indirect; // 文件大小大于40KB时,使用间接指针
struct File* f_dir; // 文件所在的目录
char f_pad[FILE_STRUCT_SIZE - MAXNAMELEN - (3 + NDIRECT) * 4 - sizeof(void*)]; //进行填充
} __attribute__((aligned(4), packed));
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; // 文件id
struct File f_file; // fd对应的文件控制块
};

Thinking 5.7

图 5.9 中有多种不同形式的箭头,请解释这些不同箭头的差别,并思考我们 的操作系统是如何实现对应类型的进程间通信的。、
答:实线箭头是同步消息,需要接收者接收并回应后才会继续进行当前进程,虚线箭头是异步消息,简单地发送消息,不需要回复,发送完后当前进程保持执行。

难点分析

经过前面包括内存管理等知识的学习,本单元文件系统的组织方式和结构单元理解起来相对轻松了很多,但是从进程角度去观察文件系统需要考虑的东西就变得多了起来,包括各个进程的交互,我认为这是本次实验的难点。同时本次实验中涉及的各个层次的操作以及内核态和用户态的转化也是个难点。

实验体会

经过这么多的os实验,我对一个操作系统的各个组成部分以及硬件和软件如何配合工作,产生这样一个精密的操作系统有了一部分认识,但是这些认识仍然浅显,对于操作系统的学习需要进一步进行探索和深入,这便是修行在个人了。

原创性说明

本报告为本人原创


【OS】BUAA-OS-Lab5-实验报告
http://example.com/2025/05/30/【OS】BUAA-OS-Lab5-实验报告/
作者
mRNA
发布于
2025年5月30日
许可协议