The File System in JOS
单独开一贴扯一扯JOS里的文件系统
也是方便以后更新或引用.
集中火力看几个和文件系统有关系的头文件.
inc/fs.h
fs/fsformat.h
fs/fs.h
fs/serv.c
先回答一下神马是文件系统...
File system
The xv6 file system provides data files, which are uninterpreted byte arrays, and directories, which contain named references to data files and other directories. Xv6 implements directories as a special kind of file. The directories form a tree, starting at a special directory called the root. A path like /a/b/c refers to the file or directory
named c inside the directory named b inside the directory named a in the root directory /. Paths that don’t begin with / are evaluated relative to the calling process’s current directory, which can be changed with the chdir system call
在fs/serv.c里面一开始就有很详细的注释介绍.
JOS的文件系统由三大结构构成
1. 用于描述硬盘上文件的struct File
2.用于描述每一个打开的文件的struct Fd (file descriptor)
3. struct OpenFile 用于链接以上两个结构体
对于硬盘的,每一个Block的大小就是一个PGSIZE大小(4KB)
支持的单个文件名(当前某一路径下的文件名,不是绝对路径)最长是128个字符,包括字符串结束符
支持的绝对路径文件名是1024个字符,包括字符串结束符
文件的最大规格是MAXFILESIZE
下面是利用了结构体struct File对"文件"这一概念进行的抽象
下图是对于硬盘布局的描述图
第一扇区是boot, 用于储存系统的启动信息
第二个是super, 用于
第三个区域用于记录各种inode,由于是连续区域,方便index 索引.后面就是实际储存数据的区域了.
最后是log区域.
文件的类型也就两种,一种普通的文件,一种是目录
上面见过文件的抽象了 struct File
对于目录,用于描述目录的结构体在 fs/fsformat.h里面
我们能看到,对于一个目录来说,继承自结构体struct File,实质上目录也是个文件,只是这个文件提供各种其他普通文件的入口,并计数,一个目录能装的最大文件数目是 MAX_DIR_ENTS 128
值得注意的是第一个初始化的文件,是啥?根目录哇...
描述根目录的结构体 struct OpenFile被初始化为 0, 0 , 1 ,0
这里的这个1就是O_WRONLY
可以在inc/lib.h里面能找到各种文件打开权限(如果你看过APUE,就会有种老乡见老乡的感觉了...)
我们看看,究竟是怎么创建起一个文件系统的~
去kern/init.c里面.你会发现这里第一个被创建的内核创建的进程是 fs_fs.
下面是链接器的信息 fs_fs进程对应的起始地址在0xf01c9efe
下面是fs/Makefrag 的部分信息,生成程序fs/fs
重点来了,第一个进程用来初始化文件系统的进程fs_fs对应serv.c里面的umain.c
这里会有serve_init()还有fs_init()的初始化.
最后调用serve()启动文件系统服务
我们看看serve_init()
看,这里就是初始化opentab结构体数组.
这里值得注意的是FILEVA,这个地址开始,为每个文件储存对应的struct Fd,每个文件占用1页的大小.
在inc/fd.h里面你能看到这下面两个结构体,struct Fd定义如下:
对于 fs_init()
能很明显的看到super指针被赋值为指向硬盘第一块block的区域.(第0块是boot block)
bitmap指向第二块区域.
最后程序调用serve()函数开始启动文件系统的服务
这个文件系统进程基于进程通信完成对硬盘文件的读写!
大体的文件系统构造就是这样,后续如果有必要会继续update ...
主要是为lab 5做铺垫准备
"故事的小黄花 从出生那年就飘着"