ucore lab8(文件系统)
一、实验目的
1.1了解基本的文件系统系统调用的实现方法;
1.2了解一个基于索引节点组织方式的Simple FS文件系统的设计与实现;
1.3了解文件系统抽象层-VFS的设计与实现;
二、实验内容
实验七完成了在内核中的同步互斥实验。本次实验涉及的是文件系统,通过分析了解ucore文件系统的总体架构设计,完善读写文件操作,从新实现基于文件系统的执行程序机制(即改写do_execve),从而可以完成执行存储在磁盘上的文件和实现文件读写等功能。
三、实验步骤及流程
3.0 练习0:填写已有实验
3.0.1实验要求
本实验依赖实验1/2/3/4/5/6/7。请把你做的实1/2/3/4/5/6/7的代码填入本实验中代码中有“LAB1”/“LAB2”/“LAB3”/“LAB4”/“LAB5”/“LAB6” /“LAB7”的注释相应部分。并确保编译通过。注意:为了能够正确执行lab8的测试应用程序,可能需对已完成的实验1/2/3/4/5/6/7的代码进行进一步改进。
3.0.2实验操作
经过对比观察发现,对于lab1–lab7补充的代码在本次实验中不需要进一步改进。
3.1 练习1:完成读文件操作的实现(需要编码)
3.1.1实验要求
首先了解打开文件的处理流程,然后参考本实验后续的文件读写操作的过程分析,编写在sfs_inode.c中sfs_io_nolock读文件中数据的实现代码。
请在实验报告中给出设计实现”UNIX的PIPE机制“的概要设方案,鼓励给出详细设计方案。
3.1.2关键数据结构及知识点
(1)ucore的文件系统架构主要由四部分组成:
①通用文件系统访问接口层:该层提供了一个从用户空间到文件系统的标准访问接口。这一层访问接口让应用程序能够通过一个简单的接口获得ucore内核的文件系统服务。
②文件系统抽象层:向上提供一个一致的接口给内核其他部分(文件系统相关的系统调用实现模块和其他内核功能模块)访问。向下提供一个同样的抽象函数指针列表和数据结构屏蔽不同文件系统的实现细节。
③Simple FS文件系统层:一个基于索引方式的简单文件系统实例。向上通过各种具体函数实现以对应文件系统抽象层提出的抽象函数。向下访问外设接口
④外设接口层:向上提供device访问接口屏蔽不同硬件细节。向下实现访问各种具体设备驱动的接口,比如disk设备接口/串口设备接口/键盘设备接口等。
(2)打开文件的处理流程
①首先是应用程序发出请求,请求硬盘中写数据或读数据,应用程序通过FS syscall接口执行系统调用,获得ucore操作系统关于文件的一些服务;
②之后,一旦操作系统内系统调用得到了请求,就会到达VFS层面(虚拟文件系统),包含很多部分比如文件接口、目录接口等,是一个抽象层面,它屏蔽底层具体的文件系统;
③VFS如果得到了处理,那么VFS会将这个iNode传递给SimpleFS,注意,此时,VFS中的iNode还是一个抽象的结构,在SimpleFS中会转化为一个具体的iNode;
④通过该iNode经过IO接口对于磁盘进行读写。
(3)ucore文件系统总体结构如下图:

(4)ucore中的文件系统架构包含四类主要的数据结构:
①超级块(SuperBlock),它主要从文件系统的全局角度描述特定文件系统的全局信息。它的作用范围是整个OS空间。
②索引节点(inode):它主要从文件系统的单个文件的角度它描述了文件的各种属性和数据所在位置。它的作用范围是整个OS空间。
③目录项(dentry):它主要从文件系统的文件路径的角度描述了文件路径中的一个特定的目录项(注:一系列目录项形成目录/文件路径)。它的作用范围是整个OS空间。对于SFS而言,inode(具体为struct sfs_disk_inode)对应于物理磁盘上的具体对象,dentry(具体为struct sfs_disk_entry)是一个内存实体,其中的ino成员指向对应的inode number,另外一个成员是file name(文件名).
④文件(file),它主要从进程的角度描述了一个进程在访问文件时需要了解的文件标识,文件读写的位置,文件引用情况等信息。它的作用范围是某一具体进程。
(5)超级块super_block
struct sfs_super {
uint32_t magic; //标识符
uint32_t blocks; //总块数
uint32_t unused_blocks; //空闲块数
char info[SFS_MAX_INFO_LEN + 1]; //关于SFS的信息
};
(6)文件file
struct file {
enum {
FD_NONE, FD_INIT, FD_OPENED, FD_CLOSED,
} status;//访问文件的执行状态
bool readable;//文件是否可读
bool writable;//文件是否可写
int fd;//文件在filemap中的索引值
off_t pos;//访问文件的当前位置
struct inode *node;//该文件对应的内存inode指针
int open_count; //打开此文件的次数
};
(7)索引节点inode
struct inode {
union {
//包含不同文件系统特定inode信息的union域

最低0.47元/天 解锁文章
4650

被折叠的 条评论
为什么被折叠?



