파일 시스템: 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_addr13개의 3바이트 주소, 즉 총 39바이트를 보유한다는 것입니다. 마지막 바이트는 일부 시스템에서 디렉토리의 파일 생성 마스크로 사용됩니다.

lib.c소스 루트 디렉터리의 파일( restor위 참조)에는 long을 3바이트 디스크 주소로 변환하거나 그 반대로 변환하는 기능이 포함되어 있습니다.

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

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

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

관련 정보