os-lab5
本文最后更新于 2024年9月6日 下午
思考题
5.1
引发的问题
当通过 kseg0 对设备进行写操作时,如果写入操作被缓存,那么实际的数据并没有直接写入设备寄存器,而是暂存在缓存中,如果发生断电等情况,缓存中的数据可能会丢失,这可能会导致数据写入失败。
设备物理内存处的数据不只由 CPU 决定,还和对应的外设的行为有关。而缓存只能记录CPU 的读写结果,无法在外设对数据进行改时及时调整。
设备操作的差异
对于串口设备来说,读写频繁,信号多,在相同的时间内发生错误的概论远高于IDE磁盘。
对于磁盘而言,磁盘一次读写的数据量较大。
5.2
根据定义
1 | |
这代表1个文件控制块大小为256B,而一个磁盘块大小为4096B,一个磁盘块最多可以存的文件控制块:$4096/256=16$
一个目录包含1024个指向磁盘块的指针,即最多有1024 * 16 = 16384个文件。
1 | |
- 一个文件控制块有直接指针 + 间接指针共1024个 ,每个指针指向一个磁盘块,存储着该文件的一部分文件数据。文件系统支持的单个文件最大,则表示1024个指针全部有效,一共指向了1024个磁盘块存着文件数据,又一个磁盘块4KB,则单个文件最大为4KB*1024=4MB
5.3
1 | |
我们实验使用的内核支持的最大磁盘大小为1GB
5.4
1 | |
5.5
fork 前后的父子进程共享文件描述符和定位指针。
验证程序
1 | |
5.6
1 | |
5.7
ENV_CREATE(user_env)和ENV_CREATE(fs_serv)由初始化进程init()执行以创建用户和文件系统服务环境。init()启动时创建这些环境,其中fs和user环境执行它们的初始化工作。fs环境初始化后,serv_init()和fs_init()函数运行,进入serv()循环,监听ipc_receive()的请求并将环境标记为ENV_NOT_RUNNABLE,直到接收到user环境的ipc_send(fsreq)请求再变为可运行。user环境向fs环境发送ipc_send(fsreq)请求来请求文件访问服务,请求后自身进入ENV_NOT_RUNNABLE状态等待响应。响应文件访问请求后,ipc_send(dst_va)将请求结果发送回user环境,此时fs环境再次进入ENV_NOT_RUNNABLE状态等待下次请求处理。
难点分析
部分代码文件的主要功能(协调理解文件系统的核心框架):
tools目录中的文件是构建时的辅助工具的代码:fsformat工具 —— 创建磁盘镜像fs目录中存放的是文件系统处理相关的代码:通过 IPC 通信与用户进程user/lib/fsipc.c内的通信函数进行交互fs.c:实现文件系统的基本功能函数ide.c:通过系统调用与磁盘镜像交互serv.c:进程的主干函数
user/lib目录下存放了用户程序的库函数:- 系统用户程序库的一部分,抽象操作系统文件系统的文件,以及这些文件和信号源控制的文件。
fsipc.c:实现与文件系统服务进程的交互file.c:实现文件系统的用户接口fd.c:实现文件描述符
IDE磁盘驱动(外设控制):
在 MIPS 体系结构下,我们使用 MMIO(内存映射 IO)机制访问设备寄存器。MMIO 使用不同的物理内存地址为设备寄存器编址,将一部分对物理内存的访问 “重定向” 到设备地址空间中。CPU 对这部分物理内存的访问等同于对相应设备的访问。
外设是通过读写寄存器来进行数据通信,设备寄存器通常包括控制寄存器、状态寄存器和数据寄存器,这些寄存器被映射到指定的物理地址空间。
文件系统:
- 磁盘布局:
MOS 以磁盘最开始的一个磁盘块当作引导扇区和分区表使用。接下来的一个磁盘块作为超级块(Super Block),用来描述文件系统的基本信息。
1 | |
- 文件系统结构:
磁盘抽象成由磁盘块组成,每个磁盘块由8个连续的扇区组成,扇区是物理上的结构,而磁盘块是逻辑上存在的。
1 | |
1 | |
上述定义了文件控制块,是整个文件系统需要理解的最关键的结构体,其中指明了文件的索引方式,文件控制块的大小,文件控制块的名称
文件系统的用户接口:
用户程序在发出文件系统操作请求时,将请求的内容放在对应的结构体中进行消息的传递,fs_serv 进程收到其他进行的 IPC 请求后,IPC 传递的消息包含了请求的类型和其他必要的参数,根据请求的类型执行相应的文件操作(文件的增、删、改、查等),将结果重新通过IPC反馈给用户程序。用户程序在发出文件系统操作请求时,将请求的内容放在对应的结构体中进行消息的传递,fs_serv 进程收到其他进行的 IPC 请求后,IPC 传递的消息包含了请求的类型和其他必要的参数,根据请求的类型执行相应的文件操作(文件的增、删、改、查等),将结果重新通过IPC馈给用户程序。
实验体会
lab5课下总体实验难度较大,涉及较多的结构体。同时综合了lab4的进程ipc问题。
我们首先需要弄明白每个结构体的作用,弄清楚文件系统抽象出来的结构体对应到哪一部分,结构体中的每个属性的作用。
其次,我们需要再次结合lab4的内容,搞清楚文件系统服务的函数调用过程,文件系统服务是一个单独的文件服务进程进行管理的,其他进程需要通过ipc与之通信,才能在进程中对文件进行操作。
