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 restor
pueden 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_mode
le 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.c
archivo en la raíz de la restor
fuente (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