핀토스 마지막 주차 프로젝트 파일시스템을 하며, inode 구조체에 대한 이해도가 부족하여 개인적으로 구현에 어려움을 겪었습니다.
핀토스에서 사용되는 inode 구조체에 대한 이해를 위해 해당 게시글을 작성하였습니다.
inode는 index node의 줄임말입니다.
inode는 파일이나 디렉토리에 대한 메타데이터를 갖는 고유 식별자입니다.
파일과 디렉토리 모두 inode를 하나씩 가리키는 inode포인터를 갖고 있습니다.
프로젝트4에 와서 inode를 건드리게 되었는데요. 왜 그런걸까요?
기존 파일시스템은 연속 할당 방식으로 형성되어 있습니다.
연속할당방식은 하나의 파일이 디스크 상에 연속적으로 저장되는 방식을 뜻하는데
이는 우리가 알다시피 외부 단편화에 취약한 구조입니다.
외부단편화를 해결하기 위해 우리는 프로젝트 4에서 FAT 파일시스템을 구현합니다.
File Allocation Table에 파일 위치 정보를 저장하고 이를 메모리에 올림으로써 인덱스 할당을 구현합니다.
인덱스 할당에서는 인덱스 블록이라고 하는 하나의 디스크 블록에
파일 내 각 블록의 위치를 저장해두는 방식으로 구현했습니다.
이를 구현하기 위해 inode 구조체와 inode_disk 구조체를 이해해야합니다.
먼저 Inode 구조체는 파일이나 디렉토리를 열 때 발생하는 inode_open()함수 실행 시 생성되며,
inode는 메타데이터 정보를 담고 있는 512Byte의 inode_disk를 갖고 있고,
inode_disk는 실제 파일에 대한 메타데이터를 포함하고 있습니다.
inode 구조체는 6가지 멤버를 갖습니다.
1. elem : list_init 이후, inode list에 삽입하기 위해 필요한 요소
2. sector : inode_disk가 저장되어있는 disk의 sector를 의미
3. open_cnt : 열렸던 횟수를 기록하여, inode를 닫거나 삭제할 때 참조
4. removed : 삭제해도 되는지 여부
5. deny_write_cnt : 0 이라면 write가 가능한 것을 의미
6. data : 디스크에 저장된 메타데이터 정보를 물리메모리에 올려놓는 것
매번 disk에 참조할 수 없기 때문에 물리 메모리에 올려놓고 사용하며, 더이상 필요가 없어지면 inode_close()시에 다시 disk에 write back
inode_disk 구조체의 멤버를 보면
1. start : 파일의 inode라면 파일의 실제 내용, 디렉토리의 inode라면 directory entry들이 저장되어 있는 disk의 sector 번호
2. length : 저장된 공간의 길이
3. 사용하지 않는 나머지 공간 : 이는 sector size인 512byte를 맞춰주기 위해 넣어준 데이터로 disk write/read를 위해 할당된 공간