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