inode、目录、路径
时间:2021-09-29 15:22:35
手机看文章
扫描二维码
随时随地手机看文章
[导读]文件系统本文继续来看的文件系统部分,将文件系统的设计分为7层:磁盘缓存区日志目录路径文件系统调用,磁盘、缓存区、日志三个部分在前文已经说了,本文接着讲述,目录,路径三个层次。这部分的理论知识可以参考文章:捋一捋文件系统。本文直接来看xv6的文件系统这部分是如何实现的。文件系统布局再来系统的看看xv6文件系统的布局图:这个图与文档给出的布局图有些不一样,主要是日志区的位置变化了。文档给出的布局图日志区位于文件系统的末尾,但是根据源码来看日志区应该是位于超级块后面的。前文直接用的文档中的图,应该是有误的,实在抱歉。我看了几个版本的源码和文档,源码是日志区都是安排在超级块后面,而文档的布局图描述的是...
文件系统
本文继续来看 的文件系统部分, 将文件系统的设计分为 7 层: ,磁盘、缓存区、日志三个部分在前文已经说了,本文接着讲述 ,目录,路径三个层次。这部分的理论知识可以参考文章:捋一捋文件系统。本文直接来看 xv6 的文件系统这部分是如何实现的。文件系统布局
再来系统的看看 xv6 文件系统的布局图:这个图与 文档给出的布局图有些不一样,主要是日志区的位置变化了。 文档给出的布局图日志区位于文件系统的末尾,但是根据源码来看日志区应该是位于超级块后面的。前文直接用的 文档中的图,应该是有误的,实在抱歉。我看了几个版本的 源码和文档,源码是日志区都是安排在超级块后面,而文档的布局图描述的是将日志区放在末尾。不过这不是重点,不影响咱们理解,不管位于哪儿,在超级块中做相应修改就行。引导块、超级块
第 0 块是引导块,里面存放的启动程序也就是 ,详见前文:实例讲解多处理器下的计算机启动第 1 块是超级块,存有文件系统的元信息,相关结构体定义如下:struct superblock {
uint size; // Size of file system image (blocks) 文件系统大小,也就是一共多少块
uint nblocks; // Number of data blocks 数据块数量
uint ninodes; // Number of inodes. //i结点数量
uint nlog; // Number of log blocks //日志块数量
uint logstart; // Block number of first log block //第一个日志块块号
uint inodestart; // Block number of first inode block //第一个i结点所在块号
uint bmapstart; // Block number of first free map block //第一个位图块块号
};
可以看出超级块实则就是文件系统布局的信息集合。在 中我们可以知道:#define NINODES 200
#define MAXOPBLOCKS 10
#define LOGSIZE (MAXOPBLOCKS*3)
#define FSSIZE 1000
#define IPB (BSIZE / sizeof(struct dinode))
int nbitmap = FSSIZE/(BSIZE*8) 1;
int ninodeblocks = NINODES / IPB 1;
int nlog = LOGSIZE;
int nmeta = 2 nlog ninodeblocks nbitmap;
int nblocks = FSSIZE - nmeta;
int logstart = 2;
int inodestart = 2 nlog;
int bmapstart = 2 nlog ninodeblocks;
从上述代码可以看出,文件系统的各个部分从哪开始,到哪结束都是可以明确计算出来的,所以其实不管将日志区安排在哪,我们都可以从超级块中获取相应的位置大小信息。数据区
紧接着超级块的区域应该是 ,但是 的内容有些多有些复杂,我们放在后面讲,先来看看数据区中数据块的组织与管理。数据块的分配和释放由位图来管理,但位图管理的区域不止数据区,而是整个文件系统。有关位图的宏定义如下:// Bitmap bits per block 每个块能有多少个bit
#define BPB (BSIZE*8)
// Block of free map containing bit for block b 块b在哪个位图块上
#define BBLOCK(b, sb) (b/BPB sb.bmapstart)
分配回收
static uint balloc(uint dev)
{
int b, bi, m;
struct buf *bp;
bp = 0;
for(b = 0; b < sb.size; b = BPB){
bp = bread(dev, BBLOCK(b, sb)); //读取位图信息
for(bi = 0; bi < BPB