Appearance
fs.h
TIP
On-disk file system format. Both the kernel and user programs use this header file. 磁盘上的文件系统格式。 内核和用户程序都使用这个头文件来理解文件系统的结构。
#define ROOTINO 1TIP
定义根目录的 inode 编号,固定为 1。
#define BSIZE 1024TIP
定义文件系统中每个块(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];
};