第七章. 文件系统 (lab5)
提纲 背景知识 文件系统的实现 客户进程访问文件系统 Spawn函数
背景知识 基于磁盘的文件系统结构主要构成部分 扇区(Sector)和块(Block) 超级块(Super block) 块位图(Block bitmap) 文件元数据(file meta-data)
背景知识(续) 组成文件系统的基础部分在磁盘上的布局
文件系统的实现 “File”数据结构
文件系统的实现(续) 其他重要数据结构 超级块(struct Super) 设备(struct Dev) 文件句柄(struct Fd)
文件系统的实现(续) 磁盘的访问 块缓存 块位图 文件操作
文件系统的实现(续) 客户端打开文件的操作
客户进程访问文件系统 int fd_alloc(struct Fd **fd_store) 在进程的文件描述符表中,从0到MAXFD-1(MAXFD为32,即一个进程可以打开的最大文件个数)寻找一个可用的文件描述符。 int fd_lookup(int fdnum, struct Fd **fd_store) 查找文件描述符索引节点是否已经有相关页映射。 int open(const char *path, int mode) 首先用fd_alloc()找到一个未用的文件描述符,然后向服务器发送一个IPC请求打开文件,并将文件系统中文件页表映射到客户端的地址空间中。 static int file_close(struct Fd *fd) 将文件服务器中的文件描述符清空,取消文件中映射的数据,然后关闭文件。
Spawn函数 int spawn(const char *prog, const char **argv) Spawn函数与Unix的exec功能类似,从磁盘文件系统装入并运行一个可执行文件,其中prog为文件系统中可执行文件的路径,argv为可执行文件的参数。 该函数首先打开文件并读取ELF文件头到内存,创建一个新的进程并使用函数init_stack在地址USTACKTOP - PGSIZE为其分配一个堆栈,将读取的ELF文件中程序的代码段、数据段和bss段加载到进程的地址空间,初始化子进程的寄存器状态,然后由系统进行调度。
Spawn函数(续) 父进程内存格式
本章结束