The File System in JOS

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 用于链接以上两个结构体

The File System in JOS_第1张图片



对于硬盘的,每一个Block的大小就是一个PGSIZE大小(4KB)

支持的单个文件名(当前某一路径下的文件名,不是绝对路径)最长是128个字符,包括字符串结束符

支持的绝对路径文件名是1024个字符,包括字符串结束符

The File System in JOS_第2张图片


文件的最大规格是MAXFILESIZE


下面是利用了结构体struct File对"文件"这一概念进行的抽象

The File System in JOS_第3张图片


下图是对于硬盘布局的描述图


第一扇区是boot, 用于储存系统的启动信息

第二个是super, 用于

第三个区域用于记录各种inode,由于是连续区域,方便index 索引.后面就是实际储存数据的区域了.

最后是log区域.



文件的类型也就两种,一种普通的文件,一种是目录

上面见过文件的抽象了 struct File

对于目录,用于描述目录的结构体在 fs/fsformat.h里面

The File System in JOS_第4张图片

我们能看到,对于一个目录来说,继承自结构体struct File,实质上目录也是个文件,只是这个文件提供各种其他普通文件的入口,并计数,一个目录能装的最大文件数目是 MAX_DIR_ENTS 128


The File System in JOS_第5张图片


值得注意的是第一个初始化的文件,是啥?根目录哇...

描述根目录的结构体 struct OpenFile被初始化为 0, 0 , 1 ,0

这里的这个1就是O_WRONLY

可以在inc/lib.h里面能找到各种文件打开权限(如果你看过APUE,就会有种老乡见老乡的感觉了...)


The File System in JOS_第6张图片



我们看看,究竟是怎么创建起一个文件系统的~

去kern/init.c里面.你会发现这里第一个被创建的内核创建的进程是 fs_fs.



下面是链接器的信息 fs_fs进程对应的起始地址在0xf01c9efe


下面是fs/Makefrag 的部分信息,生成程序fs/fs

The File System in JOS_第7张图片


重点来了,第一个进程用来初始化文件系统的进程fs_fs对应serv.c里面的umain.c

The File System in JOS_第8张图片

这里会有serve_init()还有fs_init()的初始化.


最后调用serve()启动文件系统服务


我们看看serve_init()

The File System in JOS_第9张图片

看,这里就是初始化opentab结构体数组.


这里值得注意的是FILEVA,这个地址开始,为每个文件储存对应的struct Fd,每个文件占用1页的大小.

在inc/fd.h里面你能看到这下面两个结构体,struct Fd定义如下:

The File System in JOS_第10张图片


对于 fs_init()

The File System in JOS_第11张图片


能很明显的看到super指针被赋值为指向硬盘第一块block的区域.(第0块是boot block)

bitmap指向第二块区域.

最后程序调用serve()函数开始启动文件系统的服务


The File System in JOS_第12张图片


这个文件系统进程基于进程通信完成对硬盘文件的读写!


大体的文件系统构造就是这样,后续如果有必要会继续update ...

主要是为lab 5做铺垫准备



  "故事的小黄花 从出生那年就飘着"

The File System in JOS_第13张图片





你可能感兴趣的:(硬盘,内核,JOS)