Dateisystem: Wie findet man einen durch einen Inode dargestellten Dateiblock?

Dateisystem: Wie findet man einen durch einen Inode dargestellten Dateiblock?

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, restordaher 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_modewü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.cDatei im Stammverzeichnis der restorQuelle (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

verwandte Informationen