那最后一部分呢
我们来给大家介绍一下
这个文件系统的执行流程
这里面举了两个例子
第一个例子是关于文件系统怎么启动
第二个呢 是看一下
当用户程序发出open操作的时候
我们整个这个执行过程是怎么回事
首先看一下这个文件系统初始化过程
从总控函数kern_init开始
专门增加一个fs_init
这是lab8增加内容
在这里面呢fs_init呢
进一步展开会分成三部分
第一个是虚拟文件系统的初始化
第二个是关于设备初始化
第三个是SFS
就是simple file system的初始化过程
我们再把这个vfs_init呢看一下
它干什么事情 第一建一个链表
就是专门针对device的list
使得它可以在后续过程中
管理这些device的fs
第二个呢是设置一个信号量
这是由于很多对共享资源的操作呢
需要信号量来进行保护
那么对于dev_init呢 就是device_init呢
它包含了三部分工作
第一个初始化device
disk stdin和stdout
这分别代表了三类不同的设备
再接下来是关于这个
simple file system的一个初始化过程
这最主要完成一个mount
就是加载这个文件系统
那么这三部分进一步细化可以看出来
第一部分 是关于这个
dev_list的一个初始化
它主要是初始化一个双向链表
这个双向链表是在我们整个
uCore操作系统里面经常使用的
然后也同样存在一个信号量
来保证对这个list操作一个互斥的保护
第二部分关于device的init
它会分别去调用disk0的device_init
stdin和stdout的device_init
那么这后两部分呢
我们在前面也给大家做了介绍
它怎么完成它的初始化过程
这个disk0的初始化过程
希望大家能够自己去看一下
对于simple file system而言
它的这个mount过程包含两部分
第一部分是vfs_mount
以及具体的一个SFS一个do_mount
那么在这个do_mount里面呢
它会完成把自身SFS
和VFS建立一个连接
然后呢把它的根目录
能够让我们的uCore
操作系统能感知得到
使得接下来的 针对这个文件系统的
一个读写操作能够正常执行
那这就是我们文件系统
一个大致初始化过程
这是整个一个初始化一个流程图
接下来我们再看一下
对于一个文件 我们要打开它
便于后续的读 或者写操作
大致执行什么事情
这是应用程序通常的写法
Open一个file
那么这是一个字符串
代表文件的名字
它可能带一些目录
它位于某一个目录下一个文件
这是一个字符串
那么如果这个open操作
正常地执行结束的话
它会返回一个fd
那么这个fd代表了文件
在这个进程控制块中的
一个文件链表中一个位置
从而可以根据这个位置
能访问更具体的file信息
那么当我们应用程序
执行open操作之后呢
它会进一步调系统调用 sys_open
然后呢发出sys_call 这个系统调用
sys_open这么一个信息
然后让我们操作系统做进一步处理
这是第一部分工作
我们操作系统
在接受到这个操作之后呢
它会通过进一步sys_open呢来往下处理
那么可以看出来
它会把文件名的字符串一步步往下传
然后到这儿 那么它会分配一个
Fd_array中的一个项给它
那么这个index
就是我们最终要访问那个fd
但是 需要注意是
这里面fd所对应那个file
它里面inode信息还没有
所以我们进一步要把文件名
所实际对应的inode信息给建立起来
这就需要我们进一步去处理
做vfs_open操作
但是我们知道 vfs_open呢
它只是一个壳
它需要去找到具体文件系统
做进一步打开操作
有两方面 第一方面是要有一个
查找文件名和inode对应信息
一旦找到之后 会把inode信息
给加载到内存中来
成为我们操作系统能够进一步去访问的
一个很重要一个关键数据结构
那么lookup干什么
vfs_lookup会进一步调什么呢
大家想一想
我们说这个lookup就要查找一个文件名
包含了目录也包含文件名本身
这么一个字符串
把所对应的inode是什么
我们需要进一步去看一下
前面的vfs_lookup最终会调到SFS
就simple file system的lookup
这里面它会根据path
就我们刚才说的文件名信息
来一步步的 递归地查找
一个文件它所对应的inode是多少
因为它首先要查找到
这个文件所在的目录
假设我们这里面只有一级目录
那会把这个目录所对应的inode找着
然后查找这个inode里面
所对应的目录项
看目录项里面的文件名
是否和path里面的最终文件名是一致的
如果是一致的
也意味着找着了这个文件
它会把inode对应文件名给取出来
然后进一步去load inode
从而可以把inode的信息
从硬盘加载到我们内存中来
你看这里面 sfs_load_inode
会进一步调sfs_rbuf 就是read buffer
而这一个会进一步device的I/O
最终会访问到IDE的read sector
这个操作是我们硬盘驱动的一个函数
从而把所需要的信息
一层一层再返回到我们应用态
那这就是整个open操作的执行过程
好 那我们把lab8的文件系统呢
给大家做了一个讲解
可以看着这里面涉及的层次很多
数据结构很多 调用关系很复杂
但是相对而言 它整个调用关系
是一个串行的一个调用关系
而包含数据结构的依赖关系呢
也是相对来说比较直观
从上层到底层
底层又返回来引用上层
那这个过程呢 虽然数据量比较大
但是大家通过阅读代码 调试
和具体执行 我相信能够很好地掌握
关于文件系统这一块的内容
一旦完成了文件系统这一块内容呢
我们可以让我们的uCore OS
可以很好访问文件系统中
存在那些文件
去执行 或者读写操作
完成了lab8之后呢
我想大家应该有一定的收获
可以对操作系统有更深入的理解
同时我们也提供了进一步labx
这个labx是希望大家在常规练习之后
去做一些更有挑战一些练习
我们称之为challenge练习
我们在uCoreLab中也给大家列出了
一系列的challenge练习
如果大家对操作系统有兴趣
那我们欢迎大家去迎接新的挑战
好 谢谢大家