Estou escrevendo um sistema de arquivos para meu sistema operacional e pesquisando sistemas de arquivos existentes antes de começar a projetar o meu próprio. Me deparei com alguns slides sobre o sistema de arquivos System Five e estou bastante confuso sobre como os blocos de arquivos são encontrados.
Por exemplo, se eu quisesse encontrar o bloco 5 do arquivo representado pelo inode 12... como faria isso?
Alguém pode explicar (em alto nível) como encontrar um bloco de arquivo representado por um inode?
Responder1
Estruturas obtidas do Ultrix 3.0 v7 restor
podem ocorrer variações:
ftp://ftp.uvsq.fr/pub/tuhs/PDP-11/Distributions/dec/Ultrix-3.0/v7restor/include/sys/
O s5fs é bastante arcaico, mas ...:
O layout do disco pode ser algo como:
[B][S][Inode List][ Data Blocks ]
| |
| +-- Super Block
+----- Boot Area
OSuperblococontém dados para o sistema de arquivos. OLista de inodesé uma matriz de inodes que contém dados para arquivos (incluindo diretórios) eponteirosaos dados residentes noBlocos de dados.
OLista de inodesé de tamanho fixo.
Estrutura doSuperblocono 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) */
};
Estrutura de umInodeno 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
diria se é um arquivo normal, diretório, pipe nomeado, etc. e quais permissões ele possui.
Você está perguntando especificamente sobre o di_addr
. Contém 13 endereços de três bytes, totalizando 39 bytes. O último byte é usado por alguns sistemas como máscara de criação de arquivos para diretórios.
O lib.c
arquivo na raiz da restor
fonte (veja acima), contém funções para converter comprimentos de e para endereços de disco de 3 bytes.
Os primeiros 10 são ponteiros diretos, 11-13 são ponteiros indiretos.
Ao solicitar o bloco número 5, isso seria um ponteiro direto. Leia seu valor e leia os dados desse bloco.
Outra referência:http://erdos.csie.ncnu.edu.tw/~ccyang/Os2/Slides/chapter9.ppt