저는 운영 체제용 파일 시스템을 작성하고 있으며 자체 설계를 시작하기 전에 기존 파일 시스템에 대해 조사하고 있습니다. 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