우리가 코드로 구현해본 현재까지의 fat filesystem 세계관은 아래와 같다.
inode 구조체는 파일이나 디렉토리를 열 때 inode_open()
함수를 실행 하면 생성된다.
열리지 않았을 때는 inode_disk인 상태로 Disk에 저장되어 있다.
inode는 메타데이터 정보를 512byte의 inode_disk를 하나씩 가지고 있다.
/* In-memory inode. */
struct inode {
struct list_elem elem; /* inode 생성시 open_inodes라는 list에 추가 위한 요소 */
disk_sector_t sector; /* inode_disk가 저장된 디스크의 섹터 번호 */
int open_cnt; /* inode 열려있으면 닫으면 안되기에, 관리해주기 위한 변수로 카운팅 */
bool removed; /* 삭제하면 true, 아니면 false */
int deny_write_cnt; /* 0: writes ok, >0: deny writes. */
struct inode_disk data; /* 매번 disk에서 참조할 수 없기에 물리 메모리에 올려놓고 사용, inode_close()시에 다시 disk에 write back */
};
inode_disk는 매번 disk에서 참조할 수 없기에 물리 메모리에 올려놓고 사용, inode_close()
시에 다시 disk에 write back한다.
struct inode_disk {
disk_sector_t start; /* 파일의 inode인 경우 파일의 실제 내용, 디렉토리의 inode면 directory entry들이 저장된 disk의 sector 번호 */
off_t length; /* 저장된 공간의 길이 */
unsigned magic; /* Magic number. */
uint32_t unused[125]; /* ector size인 512byte를 맞춰주기 위해 넣어둔 데이터 */
};
struct file {
struct inode *inode; /* 파일 데이터에 대한 정보(메타 데이터)를 포함 */
off_t pos; /* 파일을 읽거나 쓸 때 위치 */
bool deny_write; /* 읽기 전용 파일을 나타내기 위해 사용하는 변수 */
};
struct dir {
struct inode *inode; /* 하위 dir_entry들을 저장하고 있는 sector를 찾아가기 위해 사용 */
off_t pos; /* 어디까지 읽었는지 확인 */
};
struct dir_entry {
disk_sector_t inode_sector; /* dir_entry의 정보를 담고있는 sector를 가리킴 */
char name[NAME_MAX + 1]; /* 파일이나 디렉토리의 이름 */
bool in_use; /* 이 위치에 dir_entry가 저장되어있는지에 대한 정보 */
};
추가적으로 디버깅하며 알게된 것은 filesys/extended 관련 테스트 케이스는 root_dir sector 가 33 에서 시작한다.
< tests/filesys/extended/grow-create >
Formatting file system...
[do_format] root_dir sector : 33
[dir_create] sector : 33
done.
Boot complete.
Putting 'grow-create' into the file system...
Putting 'tar' into the file system...
Executing 'grow-create':
(grow-create) begin
(grow-create) create "blargle"
(grow-create) open "blargle" for verification
(grow-create) verified contents of "blargle"
(grow-create) close "blargle"
(grow-create) end
grow-create: exit(0)
눈 내리는 문지캠 ☃️
잘보고 갑니다