Skip to content

fs.h

TIP

On-disk file system format. Both the kernel and user programs use this header file. 磁盘上的文件系统格式。 内核和用户程序都使用这个头文件来理解文件系统的结构。

#define ROOTINO 1

TIP

定义根目录的 inode 编号,固定为 1。

#define BSIZE 1024

TIP

定义文件系统中每个块(block)的大小,单位为字节。

TIP

Disk layout: [ boot block | super block | log | inode blocks | free bit map | data blocks ] 磁盘布局: [ 引导块 | 超级块 | 日志区 | inode 块 | 空闲位图 | 数据块 ] mkfs computes the super block and builds an initial file system. The super block describes the disk layout: mkfs 程序会计算超级块并构建初始的文件系统。 超级块描述了整个文件系统的元数据信息:

struct superblock {
  uint magic;

TIP

文件系统幻数,必须等于 FSMAGIC,用于标识这是一个有效的 xv6 文件系统。

  uint size;

TIP

文件系统的总大小,以块(BSIZE)为单位。

  uint nblocks;

TIP

数据块的总数。

  uint ninodes;

TIP

inode 的总数。

  uint nlog;

TIP

日志区域所占用的块数。

  uint logstart;

TIP

日志区域的起始块号。

  uint inodestart;

TIP

inode 区域的起始块号。

  uint bmapstart;

TIP

空闲块位图(bitmap)的起始块号。

};

#define FSMAGIC 0x10203040

#define NDIRECT 12
#define NINDIRECT (BSIZE / sizeof(uint))
#define MAXFILE (NDIRECT + NINDIRECT)

TIP

On-disk inode structure 存储在磁盘上的 inode 结构。

struct dinode {
  short type;

TIP

文件类型:0-未分配, 1-目录(T_DIR), 2-文件(T_FILE), 3-设备(T_DEVICE)。

  short major;

TIP

主设备号,仅当文件类型为设备(T_DEVICE)时有效。

  short minor;

TIP

次设备号,仅当文件类型为设备(T_DEVICE)时有效。

  short nlink;

TIP

指向此 inode 的硬链接数量。当 nlink 降为 0 时,inode 及其数据块将被回收。

  uint size;

TIP

文件的大小,以字节为单位。

  uint addrs[NDIRECT+1];

TIP

数据块地址数组。前 NDIRECT 个是直接数据块的地址,最后一个指向间接数据块的地址。

};

TIP

Inodes per block. 计算每个块可以存储多少个磁盘 inode (dinode)。

#define IPB           (BSIZE / sizeof(struct dinode))

TIP

Block containing inode i 根据 inode 编号 i 和超级块 sb,计算出该 inode 所在的块号。

#define IBLOCK(i, sb)     ((i) / IPB + sb.inodestart)

TIP

Bitmap bits per block 计算每个位图块所包含的位数。每个位代表一个数据块的空闲状态(0表示空闲,1表示已分配)。

#define BPB           (BSIZE*8)

TIP

Block of free map containing bit for block b 根据数据块号 b 和超级块 sb,计算出管理该块空闲状态的位图所在的块号。

#define BBLOCK(b, sb) ((b)/BPB + sb.bmapstart)

TIP

Directory is a file containing a sequence of dirent structures. 目录是一种特殊的文件,其内容是一系列 dirent (目录项) 结构。

#define DIRSIZ 14

TIP

目录项结构

struct dirent {
  ushort inum;
  char name[DIRSIZ];
};