操作系统lab5

操作系统lab5
shikiLAB5实验报告
思考题
Thinking1
- 如果使用kseg0进行设备读写,在写时将写入cache,而设备只能读内存中的数据,此时内存中的数据可能还未更新,设备将无法读到正确的数据。
- 对于串口设备由于其读写频率较高,发生上述错误的概率可嫩较高。
Thinking2
由定义可知,文件结构体大小为\(256B\),一个磁盘块大小为\(4KB\),易得一个磁盘块中有\(16\)个文件结构体。
目录中的各个文件结构体对应各个文件,因此目录中能得到的所有文件结构体数量即为一个目录下文件数量的最大值,一个磁盘块有\(16\)个文件结构体,目录中有\(1024\)个文件结构体,因此最多\(4K\)个文件。
单个文件中的指向的磁盘块存储文件内容,单个文件有\(1024\)个磁盘块,每个磁盘块\(4KB\),因此单个文件最大为\(4GB\)。
Thinking3
DISKMAX
为文件系统进程地址空间中用于映射磁盘内容的域的大小,其定义如下:
1 |
可知其最大支持\(1GB\)的磁盘内容。
Thinking4
fs/serv.h
中有如下宏定义:
1 |
user/include/fs.h
中有如下宏定义:
1 |
Thinking5
代码如下:
1 | int num = open("Makefile",O_RDWR); |
运行后结果如下:
1 | !@this is father,num:0,addr:0 |
由此可知,其文件描述符和定位指针会共享。
Thinking6
1 | struct Fd { |
Thinking7
- 实线箭头表示异步消息,执行结束后继续执行自身操作,虚线箭头为同步消息,执行结束后陷入阻塞状态,知道收到相应消息后才可以继续被调度执行。
- fs文件系统进程进入serve函数后执行
ipc_recv
函数,然后在接收到user进程的信号之前陷入阻塞状态,等待信号。user进程执行ipc_send
函数向文件系统发送信号,fs进入就绪态,被调度执行后将返回的信息发送给user进程,然后再次执行ipc_recv
函数陷入阻塞状态。
难点分析
本次实验难点主要在于对于磁盘块,文件控制块结构的理解,使用各级指针查找文件控制块的位置。具体如下
1 | int nblk = dirf->f_size / BLOCK_SIZE; |
此处只有理解了磁盘块和文件控制块的逻辑结构关系才可以实现上述代码。
实验体会
本次实验中,我理解了用户,操作系统,设备之间的协调配合,以文件系统为例,文件系统进程为运行在用户态的进程,其通过系统调用进入内核态,在内核态中调用内核函数读写内存中的特定区域对设备进行控制,由设备完成具体的设备服务。这个过程充分体现了对于硬件逐层的抽象。
原创说明
参考了往年学长的博客:https://yanna-zy.github.io/2023/05/19/BUAA-OS-5/