Файловая система: как найти блок файла, представленный inode?

Файловая система: как найти блок файла, представленный inode?

Я пишу файловую систему для своей операционной системы и провожу исследование существующих файловых систем, прежде чем начать проектировать свою собственную. Я наткнулся на несколько слайдов о файловой системе System Five и совершенно не понимаю, как находятся блоки файлов.

Например, если бы я хотел найти блок 5 файла, представленного inode 12... как бы я это сделал?

Может ли кто-нибудь объяснить (на высоком уровне), как найти блок файла, представленный инодом?

решение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

TheСупер Блокхранит данные для файловой системы.Список инодовпредставляет собой массив инодов, содержащих данные для файлов (включая каталоги) иуказателик данным, находящимся вБлоки данных.

TheСписок инодовимеет фиксированный размер.

СтруктураСупер Блокна диске:

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(см. вверху) содержит функции для преобразования длинных чисел в 3-байтовые дисковые адреса и обратно.

Первые 10 — прямые указатели, 11–13 — косвенные указатели.

Поскольку вы запрашиваете блок номер 5, это будет прямой указатель. Прочитайте его значение и прочитайте данные из этого блока.

Другой реф.:http://erdos.csie.ncnu.edu.tw/~ccyang/Os2/Slides/chapter9.ppt

Связанный контент