当前位置:首页 > 公众号精选 > Linux阅码场
[导读]文件系统本文继续来看的文件系统部分,将文件系统的设计分为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 
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
关闭
关闭