文件系统:如何找到由 inode 表示的文件块?

文件系统:如何找到由 inode 表示的文件块?

我正在为我的操作系统编写一个文件系统,并在开始设计自己的文件系统之前对现有文件系统进行研究。我看到了一些关于系统五文件系统的幻灯片,并且对如何找到文件块感到非常困惑。

例如,如果我想找到由 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

相关内容