我正在为我的操作系统编写一个文件系统,并在开始设计自己的文件系统之前对现有文件系统进行研究。我看到了一些关于系统五文件系统的幻灯片,并且对如何找到文件块感到非常困惑。
例如,如果我想找到由 inode 12 表示的文件的块 5...我该怎么做?
有人可以(在高层次上)解释如何查找由 inode 表示的文件块吗?
答案1
从 Ultrix 3.0 v7 获取的结构restor
可能会出现以下变化:
ftp://ftp.uvsq.fr/pub/tuhs/PDP-11/Distributions/dec/Ultrix-3.0/v7restor/include/sys/
s5fs 相当陈旧,但是......:
磁盘布局可能类似于:
[B][S][Inode List][ Data Blocks ]
| |
| +-- Super Block
+----- Boot Area
这超级街区保存文件系统的数据。这索引节点列表是保存文件(包括目录)数据的 inode 数组,指针到驻留在的数据数据块。
这索引节点列表是固定大小的。
结构超级街区在磁盘上:
struct filsys {
unsigned short s_isize; /* size in blocks of i-list */
daddr_t s_fsize; /* size in blocks of entire volume */
short s_nfree; /* number of addresses in s_free */
daddr_t s_free[NICFREE]; /* free block list */
short s_ninode; /* number of i-nodes in s_inode */
ino_t s_inode[NICINOD];/* free i-node list */
char s_flock; /* lock during free list manipulation */
char s_ilock; /* lock during i-list manipulation */
char s_fmod; /* super block modified flag */
char s_ronly; /* mounted read-only flag */
time_t s_time; /* last super block update */
daddr_t s_tfree; /* total free blocks*/
ino_t s_tinode; /* total free inodes */
short s_m; /* interleave factor */
short s_n;
char s_fname[6]; /* file system name */
char s_fpack[6]; /* file system pack name */
long s_unique; /* saved unique number (sys unique) */
};
结构索引节点在磁盘上:
struct dinode
{
unsigned short di_mode; /* mode and type of file */
short di_nlink; /* number of links to file */
short di_uid; /* owner's user id */
short di_gid; /* access control file (was gid) */
off_t di_size; /* number of bytes in file */
char di_addr[40]; /* disk block addresses */
time_t di_atime; /* time last accessed */
time_t di_mtime; /* time last modified */
time_t di_ctime; /* time created */
};
di_mode
会告诉你它是否是常规文件、目录、命名管道等以及它拥有什么权限。
您具体询问的是di_addr
.它保存了 13 个三字节地址,总共 39 个字节。最后一个字节被某些系统用作目录的文件创建掩码。
lib.c
源根目录下的文件(restor
参见顶部)包含用于将 long 与 3 字节磁盘地址相互转换的函数。
前10个是直接指针,11-13个是间接指针。
当您请求块号 5 时,这将是一个直接指针。读取它的值并从该块读取数据。
另一个参考:http://erdos.csie.ncnu.edu.tw/~ccyang/Os2/Slides/chapter9.ppt