Sistema de arquivos: como encontrar o bloco de arquivo representado pelo inode?

Sistema de arquivos: como encontrar o bloco de arquivo representado pelo inode?

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 restorpodem 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_modediria 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.carquivo na raiz da restorfonte (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

informação relacionada