好 那我们接下来
再稍微具体一点
看一下uCore文件系统一个架构
那么这一块呢
比刚才要更深入一些
从两个角度 一个是从控制流的角度
一个从数据结构的角度来看uCore
文件系统一个架构
首先我们看一下这个控制流
就是说 用户访问文件的时候呢
它从应用程序开始发出请求
到最后从硬盘中读
或者写相应的数据
这个过程从上而下
看看这个访问是怎么一步步来完成的
那第一个 是通用文件系统的访问接口
那么这个是包含两部分
一部分是给我们应用程序
提供了一些API
这些API呢是放在一个
简单一个C库里面
那这C库呢会访问相应的系统调用
从而可以获得uCore操作系统
关于文件这一块的一个服务
那对应的这个函数可以看出来
我们调用 比如说在这里面
提供了write 就是写文件这么一个操作
那么write呢 会最终调这个
关于write的sys_call
使得我们内核通过sys_write
来完成接下来的这个服务请求
这是第一个层面
就是站在用户的角度看待
这个层面的一个调用过程
那第二个呢一旦说在操作系统里面
我们的sys_call这个level
得到了一个请求 说
要完成一个文件的写操作
那接下来的控制就会
交给我们什么呢 VFS
文件系统的抽象层
就是虚拟文件系统这一块
虚拟文件系统呢它包含了很多部分
包括了文件的接口 目录的接口
inode的接口以及文件系统的接口
整体一个抽象
那么这个呢 屏蔽了底层
具体文件系统和设备的一些差异性
可以看出来刚才这个sys_write
会进一步向下调用
会访问什么呢 sysfile_write
file_write以及vop_write
需要注意的是 从file_write到vop_write
其实形成一个转换
这个转换是从文件 面向用户这个文件
转成了面向具体硬盘里面的操作的一个inode
这是一个转换
当VFS把用户发出的针对文件的写操作
转变对一个inode写操作之后呢
这个inode本身
还是一个站在虚拟文件系统上面
一个抽象的inode
它会进一步转变成什么呢
一个具体文件系统
在这里面我们是以一个
simple file system来举的例子
一个具体的文件系统呢
它的一个inode情况
通过inode来完成后续的
针对磁盘的一个读写
那可以看到 刚才的vop_write呢
会进一步变成fs的write
就是simple file system 的write
这个write会再通过wbuf (write_buffer)
这么一个操作
来向我们设备发出请求
比方说做一个写操作
那么它的数据内容
是从我们应用程序
刚才那个高层的
write的buffer里传到这里面来
然后把这个buffer内容
会写到我们的device中去
Simple file system
它发出一个写请求之后呢
最后会通过一个外设的访问接口
来完成对外设的一个访问
这个外设呢 和我们刚才说那个
具体的硬盘呢还是不一样的
它是在硬盘之上建立成抽象
而这个抽象我们称之为I/O设备接口
这个接口也是由
我们VFS来进行管理的
可以看到当Simple file system
发出wbuf这个操作之后呢
会把这个操作转变成一个
针对device的一个操作
这个device操作呢有很多类
我们刚才已经看到有面向串口的
有面向屏幕的 也有面向硬盘的
还有甚至空设备 有不同类型的设备
我们最终选择是disk
我们前面已经设定好了
SFS它的数据是位于
我们disk 0这个磁盘上的
所以 当发出这个dop_io的时候
最终会调disk 0的I/O
使得它可以向disk 0发出写请求
这层I/O设备接口呢
是一个抽象的接口
它里面可以包含不同类型的设备
最终disk 0会访问什么呢
会访问一个驱动
这个驱动是硬盘驱动
通过硬盘驱动来完成实际的
往这个硬盘数据的一个读写
可以看出来 刚才这个disk 0的I/O
会转变成一个IDE的write
因为我们前面知道
最开始是一个write操作
那么这个I/O既可以支持读
也可以支持写
我们会变成一个IDE的write之后呢
完成把应有程序提供的数据
最终写到我们硬盘扇区里面去
就是这个ide_write_secs
IDE硬盘它的扇区
这是一个整个的执行过程
那么前面呢我们看到一个
从上到下的控制流的一个访问
针对write的一个操作
接下来我们可以看看
在内核中数据结构整体一个布局
那么也是从高层逐步往下来展开
给大家做一个讲解
我们知道 我们的应用
其实是以进程的方式
在操作系统管理之下运行的
所以在我们进程控制块里扩展了一部分
跟文件相关的一些数据结构
比如说我们的proc_struct
它包含了一个files_struct
而这个files_struct实际上是一个数组
在这数组里面 很重要一点
它打开了哪些文件
它有一个opened file array
根据打开文件 可以进一步找到
这个文件所对应inode
可以看出来 这一块区域
是和我们进程紧密相连的
应该说 是属于我们
进程控制块的一部分
但光有这部分还不够
我们还需要进一步去
和我们系统级inode进行联系
所以可以看着这个struct file呢
会有一个信息会到一个inode里面去
而这个inode信息是属于VFS
可以看出来在 VFS管理之下
它有很多这些 对应的数据结构
我们这里面关注哪个呢 in_info
这个in其实是inode一个简称
这个VFS这一层的inode
它会进一步表述具体的inode怎么回事
你可以看出来 这是一个union结构
比较有意思 这个union结构呢
其实说它包含了不同类型的inode
我们在这里面 具体而言
是一个SFS的一个inode
就是simple file system的一个inode
这个结构也是在内存中的
这个在内存中inode结构呢
包含了更进一步的
跟硬盘相关的SFS的信息
也很重要数据就是sfs_disk_inode
那么这个inode信息
其实就是在硬盘中存储的内容
所以说 这一块内容
其实和我们硬盘中的一块区域中
专门来存储inode的数据块呢
它里面的内容是一致的
那么这个sfs_disk_inode
它的成员变量中有很多丰富的信息
比如说这里面type 表明这个inode
它的类型是文件 目录
还是其它什么东西
第二个呢它这个direct和indirect
表明了它所存储的数据
所在数据块的位置
有了这个信息之后
我们就可以很容易找到这个inode
所对应文件的内容
或者目录内容在什么地方
关于simple file system这个结构里面
有很多的内容
是和我们硬盘中的
数据结构是直接对应的
当然我们在具体访问的时候
需要把部分的内容
也会取到内存中来做进一步的操作
从上到下可以看出来这整个的过程
从进程开始 到uCore kernel里面
system level的数据结构
VFS再进一步引申到我们具体的SFS
那么SFS又分两块
一块是内存中一些管理信息
还有一部分是从硬盘中
读取的一些管理信息和数据信息
形成了整个的 跟文件系统相关的
数据结构一个关系图