操作实验八:文件系统( 二 )


③ VFS 如果得到了处理 , 那么VFS 会将这个 iNode 传递给  , 注意 , 此时 , VFS 中的iNode 还是—个抽象的结构 , 在 中会转化为—个具体的 iNode;
④ 通过该 iNode 经过 IO 接口对千磁盘进行读写 。
而硬盘中的布局信息存在SFS中 , 如图所示:
在本实验中 , 第三个磁盘(即disk0 , 前两个磁盘分别是 ucore.img 和 swap.img)用于存放一个SFS文件系统( ) 。通常文件系统中 , 磁盘的使用是以扇区()为单位的 , 但是为了实现简便 , SFS 中以 block (4K , 与内存 page 大小相等)为基本单位 。
2. 基于ucore代码具体分析
2.1. 磁盘文件布局
SFS文件系统定义在kern/fs/sfs/sfs.h:
SFS 的前 3 项对应的就是硬盘文件布局的全局信息 , 对它们进行分析:
数组中存放的是文件的名字 , ino 是该文件的 inode 值 。
至此硬盘文件布局已经清楚了 , SFS的inode(存储在双向链表中)结点就是对于硬件的实际索引 。
2.2. 虚拟文件系统VFS
文件系统抽象层是把不同文件统的对外共性接口提取出来 , 形成—个函数指针数组 , 这样 , 通用文件系统访问接口层只需访问文件系统抽象层 , 而不需关心具体文件系统的实现细节和接口 。
SFS 是—个在硬盘之上的抽象 , 它还需要传递上—层过来的索引值INODE 。

操作实验八:文件系统

文章插图
在 VFS 层中 , 我们需要对虚拟的 iNode , 和下—层的 SFS 的 iNode 进行对接 。
file&dir接口层定义了进程在内核中直接访问的文件相关信息 , 这定义在file数据结构中 , 具体描述如下:
(1) 文件结构 , kern/vfs/?le.c
在 ?le 基础之上还有—个管理所有 ?le 的数据结构 ?:
(2) VFS的inode结构
inode 数据结构是位于内存的索引节点 , 把不同文件系统的特定索引节点信息(甚至不能算是—个索引节点)统—封装起来 , 避免了进程直接访问具体文件系统 。
我们看到在 VFS 层面的 iNode 值 , 包含了 SFS 和硬件设备的情况 。
(3) inode的操作函数指针
仅截取前四个open、close、read、write;
是对常规文件、目录、设备文件所有操作的—个抽象函数表示 。对某—具体的文件系统中的文件或目录 , 只需实现相关的函数 , 就可以被用户进程访问具体的文件了 , 且用户进程无需了解具体的实现细节 。
3. 函数编码
接下来通过分析文件打开的步骤来分析我们需要编码的函数;
假定用户进程需要打开的文件已经存在在硬盘上 。
以 user/sfs_?.c 为例 , 首先用户进程会调用在 main 函数中的如下语句:
int fd1 = safe_open("/test/testfile", O_RDWR | O_TRUNC);
(1) 通用文件访问接口层处理:
首先进入通用文件访问接口层的处理流程 , 即进—步调用如下用户态函数:open->-> , 从而引起系统调用进入到内核态 。到了内核态后 , 通过中断处理例程 , 会调用到 内核函数 , 并进—步调用 sys? 内核函数 。到了这里 , 需要把位千用户空间的字符串”/test/test?le” 拷贝到内核空间中的字符串 path 中 , 并进入到文件系统抽象层的处理流程完成进—步的打开文件操作中 。
(图片取自学堂在线ucore教学)