FAT 파일 시스템에서 파일의 메타데이터를 저장하고 있는 구조체는 디렉터리 테이블이다. 하지만 핀토스에서는 이 역할을 아이노드가 대신한다.

incore inode와 disk inode

항상 파일을 열 때마다 이 파일에 해당하는 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. */
};

수정 필요없는 함수

inode_open()

<aside> 💡 디스크 영역 SECTOR에 있는 disk inode를 디스크에서 읽어와서 incore inode로써 메모리에 올린다.

</aside>