Ich schreibe ein Dateisystem für mein Betriebssystem und untersuche vorhandene Dateisysteme, bevor ich mit der Entwicklung meines eigenen beginne. Ich bin auf einige Folien zum System Five File System gestoßen und bin ziemlich verwirrt, wie Dateiblöcke gefunden werden.
Wenn ich beispielsweise Block 5 der durch Inode 12 dargestellten Datei finden möchte ... wie würde ich das tun?
Kann jemand (auf hohem Niveau) erklären, wie man einen Block einer Datei findet, der durch einen Inode dargestellt wird?
Antwort1
Aus Ultrix 3.0 v7 übernommene Strukturen, restor
daher können Abweichungen auftreten:
ftp://ftp.uvsq.fr/pub/tuhs/PDP-11/Distributions/dec/Ultrix-3.0/v7restor/include/sys/
Das s5fs ist ziemlich archaisch, aber ...:
Das Datenträgerlayout könnte etwa wie folgt aussehen:
[B][S][Inode List][ Data Blocks ]
| |
| +-- Super Block
+----- Boot Area
DerSuper Blockenthält Daten für das Dateisystem.Inode-Listeist ein Array von Inodes, die Daten für Dateien (einschließlich Verzeichnisse) enthalten undZeigerauf die Daten imDatenblöcke.
DerInode-Listehat eine feste Größe.
Struktur derSuper Blockauf der Festplatte:
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) */
};
Aufbau einerInodeauf der Festplatte:
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
würde Ihnen sagen, ob es sich um eine normale Datei, ein Verzeichnis, eine benannte Pipe usw. handelt und welche Berechtigungen es besitzt.
Sie fragen speziell nach dem di_addr
. Dieses enthält 13 3-Byte-Adressen, insgesamt 39 Bytes. Das letzte Byte wird von einigen Systemen als Dateierstellungsmaske für Verzeichnisse verwendet.
Die lib.c
Datei im Stammverzeichnis der restor
Quelle (siehe oben) enthält Funktionen zum Konvertieren von Long-Datenträgeradressen in und aus 3-Byte-Festplattenadressen.
Die ersten 10 sind direkte Zeiger, 11-13 sind indirekte Zeiger.
Da Sie Block Nummer 5 anfordern, wäre dies ein direkter Zeiger. Lesen Sie seinen Wert und lesen Sie die Daten aus diesem Block.
Ein weiterer Schiedsrichter:http://erdos.csie.ncnu.edu.tw/~ccyang/Os2/Slides/chapter9.ppt