Sistema de archivos: ¿Cómo encontrar un bloque de archivo representado por inodo?

Sistema de archivos: ¿Cómo encontrar un bloque de archivo representado por inodo?

Estoy escribiendo un sistema de archivos para mi sistema operativo y estoy investigando los sistemas de archivos existentes antes de comenzar a diseñar el mío propio. Encontré algunas diapositivas sobre el sistema de archivos System Five y estoy bastante confundido sobre cómo se encuentran los bloques de archivos.

Por ejemplo, si quisiera encontrar el bloque 5 del archivo representado por el inodo 12... ¿cómo haría esto?

¿Alguien puede explicar (a alto nivel) cómo encontrar un bloque de un archivo representado por un inodo?

Respuesta1

Las estructuras obtenidas de Ultrix 3.0 v7 restorpueden sufrir variaciones:

ftp://ftp.uvsq.fr/pub/tuhs/PDP-11/Distributions/dec/Ultrix-3.0/v7restor/include/sys/

El s5fs es bastante arcaico pero...:

El diseño del disco podría ser algo como:

[B][S][Inode List][ Data Blocks ]
 |  |
 |  +-- Super Block
 +----- Boot Area

ElSúper bloquecontiene datos para el sistema de archivos. ElLista de inodoses una matriz de inodos que contienen datos para archivos (incluidos directorios) ypunterosa los datos que residen en elBloques de datos.

ElLista de inodoses de tamaño fijo.

Estructura de laSúper bloqueen disco:

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) */
};

Estructura de unInodoen disco:

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_modele diría si es un archivo, directorio, canalización con nombre, etc. normal y qué permisos tiene.

Estás preguntando específicamente sobre di_addr. Contiene 13 direcciones de tres bytes, con un total de 39 bytes. Algunos sistemas utilizan el último byte como máscara de creación de archivos para directorios.

El lib.carchivo en la raíz de la restorfuente (ver arriba) contiene funciones para convertir longs hacia y desde direcciones de disco de 3 bytes.

Los primeros 10 son indicadores directos, 11-13 son indicadores indirectos.

Como solicita el bloque número 5, ese sería un puntero directo. Lea su valor y lea los datos de ese bloque.

Otro árbitro:http://erdos.csie.ncnu.edu.tw/~ccyang/Os2/Slides/chapter9.ppt

información relacionada