Я пишу файловую систему для своей операционной системы и провожу исследование существующих файловых систем, прежде чем начать проектировать свою собственную. Я наткнулся на несколько слайдов о файловой системе 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