Filesystem: Como encontrar o bloco de arquivo representado por inode? [fechadas]

1

Estou escrevendo um sistema de arquivos para o meu sistema operacional e estou pesquisando sobre sistemas de arquivos existentes antes de começar a projetar o meu. Me deparei com alguns slides sobre o System Five File System 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 eu faria isso?

Alguém pode explicar (em um nível alto) como encontrar um bloco de um arquivo representado por um inode?

    
por MrPickles 23.05.2016 / 03:30

1 resposta

2

Estruturas buscadas do Ultrix 3.0 v7 de restor para que variações possam ocorrer:

ftp: //ftp.uvsq. fr / pub / tuhs / PDP-11 / Distribuições / 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

O Super Block contém dados para o sistema de arquivos. A Lista de Inodes é uma matriz de inodes contendo dados para arquivos (incluindo diretórios) e ponteiros para os dados que residem nos Blocos de Dados .

A Lista de Inodes é de tamanho fixo.

Estrutura do Super Block no 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 um Inode no 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, um diretório, um pipe nomeado etc. e quais permissões ele contém.

Você está perguntando especificamente sobre o di_addr . Isso 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 arquivo lib.c na raiz da fonte restor , (consulte o início), contém funções para converter longs de e para endereços de disco de 3 bytes.

Os primeiros 10 são ponteiros diretos, 11-13 são ponteiros indiretos.

Conforme você solicita o bloco número 5, isso seria um ponteiro direto. Leia o seu valor e leia os dados desse bloco.

Outra ref: link

    
por 23.05.2016 / 07:10