其他分享
首页 > 其他分享> > OS-lab5

OS-lab5

作者:互联网

OS-lab5

磁盘管理

完成文件系统的第一步就是要能够处理磁盘等外设的信息。

文件系统

磁盘管理完成后,就可以在这个基础上完成文件系统的搭建了。

首先是管理文件的文件控制块File。这个结构体定义在include/fs.h中,定义了文件名、文件大小、文件类型、文件数据块索引、文件上级目录,为了保证每个文件控制块大小固定,还设置了f_pad,用填充0的方法,保证了文件控制块大小为256字节。

用户接口

接下来我们需要设计文件系统与用户的交互接口,对于用户来说,对文件的操作无外乎打开、读写、关闭等操作,而并不太关心文件索引块的信息,因此就有了一个新的结构体:文件描述符Fd。但在此之前,先来看另一个结构体Dev
Dev结构体定义了一个外设的信息,如外设的编号、外设名、外设的读写等函数指针。在这个操作系统中,对外设的读写在用户层面来看可以认为就是读写一个文件,而每一种外设都有自己的特定读写函数,我猜测这些信息都存放在了设备控制表中。
接下来来看文件描述符Fd。这个结构体首先定义了fd_dev_id,这个指的是文件所在的设备编号,与Dev应该是对应的,接着是fd_offset,这个变量存放着文件读写头的位置,也就是当前读写文件的指针相对于文件头的偏移,最后是fd_omode,这个指的是文件打开的类型,比如只读、只写、读写。

当用户进程试图打开一个文件时,需要一个文件描述符来存储文件的基本信息和用户进程中关于文件的状态;同时,文件描述符也起到描述用户对于文件操作的作用。当用户进程向文件系统发送打开文件的请求时,文件系统进程会将这些基本信息记录在内存中,然后由操作系统将用户进程请求的地址映射到同一个物理页上,因此一个文件描述符至少需要独占一页的空间。当用户进程获取了文件大小等基本信息后,再次向文件系统发送请求将文件内容映射到指定内存空间中。

在具体实现文件类外设的读写时,实际上并不是直接操作File,而是通过文件系统来完成,为了方便与文件系统交互又设计了一种结构体Filefd,简单来说就是结合了FdFile的结构体。这样即能够获取文件与用户的交互信息Fd,又能够知道文件与磁盘的交互信息File。而更精巧的是,得到Filefd并不困难,可以直接通过结构体的强制转换,从Fd转到Filefd,原因就在于Filefd利用Fd占位,这样就保证了后面的变量f_fileidf_file访问地址正确。

文件服务

服务分为两部分,一边是用户程序将各种请求分类,统一成fsipc和请求类型发送给文件系统,一边是文件系统通过传入的请求类型进入相应的处理函数进行处理。

到这里,用户进程与文件服务系统进程的交互也完成了,现在一个用户进程就能够完成从磁盘读取一个文件、加载到内存中、打开这个文件对文件进行读写操作、并写回磁盘关闭文件的完整操作。文件系统就算是搭建完成了。![OS-lab5文件系统]

标签:文件,file,函数,描述符,lab5,磁盘,OS,block
来源: https://www.cnblogs.com/p-wk/p/13183496.html