파일 시스템: inode가 나타내는 파일 블록을 찾는 방법은 무엇입니까?

파일 시스템: inode가 나타내는 파일 블록을 찾는 방법은 무엇입니까?

저는 운영 체제용 파일 시스템을 작성 중이며 자체 설계를 시작하기 전에 기존 파일 시스템에 대해 조사하고 있습니다. 저는 System Five 파일 시스템에 관한 슬라이드를 몇 개 보았고 파일 블록을 찾는 방법에 대해 꽤 혼란스러워했습니다.

예를 들어, inode 12가 나타내는 파일의 블록 5를 찾으려면 어떻게 해야 합니까?

inode로 표시되는 파일 블록을 찾는 방법을 (높은 수준에서) 설명할 수 있는 사람이 있습니까?

답변1

Ultrix 3.0 v7에서 가져온 구조이므로 restor변형이 발생할 수 있습니다.

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

s5fs는 다소 구식이지만 ...:

디스크 레이아웃은 다음과 같을 수 있습니다.

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

그만큼슈퍼블록파일 시스템에 대한 데이터를 보유합니다. 그만큼아이노드 목록파일(디렉토리 포함)에 대한 데이터를 보유하는 inode 배열입니다.포인터에 있는 데이터에데이터 블록.

그만큼아이노드 목록고정된 크기입니다.

구조슈퍼블록디스크에서:

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

구조아이노드디스크에서:

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일반 파일, 디렉터리, 명명된 파이프 등인지, 그리고 어떤 권한을 보유하고 있는지 알려줍니다.

에 대해 구체적으로 질문하고 계십니다 di_addr. 여기에는 13개의 3바이트 주소, 총 39바이트가 포함됩니다. 마지막 바이트는 일부 시스템에서 디렉토리의 파일 생성 마스크로 사용됩니다.

lib.c소스 의 루트에 있는 파일 ( restor상단 참조)에는 long을 3바이트 디스크 주소로 변환하는 기능이 포함되어 있습니다.

처음 10개는 직접 포인터이고, 11~13개는 간접 포인터입니다.

블록 번호 5를 요청하면 이는 직접 포인터가 됩니다. 해당 값을 읽고 해당 블록에서 데이터를 읽습니다.

또 다른 참조:http://erdos.csie.ncnu.edu.tw/~ccyang/Os2/Slides/chapter9.ppt

관련 정보