FAT 파일 시스템에서 파일의 메타데이터를 저장하고 있는 구조체는 디렉터리 테이블이다. 하지만 핀토스에서는 이 역할을 아이노드가 대신한다.
항상 파일을 열 때마다 이 파일에 해당하는 Inode가 디스크에서 메인 메모리에 복사된다. 이 때 디스크에 있는 아이노드를 디스크 아이노드라고 하고 메인 메모리에 있는 아이노드를 인코어 아이노드라고 한다.
incore inode는 disk inode가 가지고 있는 정보에 더불어서 이 아이노드가 가리키는 파일이 열린 횟수 reference count, 원본 disk inode가 저장된 디스크의 섹터 번호, 해당 아이노드가 수정되었는지 여부를 나타내주는 dirty flag 등을 추가적으로 더 가지고 있다.
struct inode_disk
디스크에 저장되는 아이노드이다.
struct inode_disk {
disk_sector_t start; /* First data sector. */
off_t length; /* File size in bytes. */
unsigned magic; /* Magic number. */
uint32_t unused[499]; /* 사용되지 않은 */
bool isdir; // 해당 파일이 디렉터리인지 여부 확인
};
struct inode
파일이 열릴 때마다 디스크에서 메모리에 복사되는 incore inode이다.
디스크 아이노드 내의 필드에 몇 가지 필드가 더 추가된 것을 알 수 있다.
메모리에서 아이노드들은 서로 링크드 리스트로 연결되어 있다.
/* In-memory inode. */
struct inode {
struct list_elem elem; /* Element in inode list. */
disk_sector_t sector; /* Sector number of disk location. */
int open_cnt; /* Number of openers. */
bool removed; /* True if deleted, false otherwise. */
int deny_write_cnt; /* 0: writes ok, >0: deny writes. */
struct inode_disk data; /* Inode content. */
};
<aside> 💡 디스크 영역 SECTOR에 있는 disk inode를 디스크에서 읽어와서 incore inode로써 메모리에 올린다.
</aside>