
2025.05.24
struct file (파일 핸들)filesys/file.hstruct file
{
struct inode *inode; /* 실제 데이터·메타데이터를 담은 inode 구조체로의 포인터 */
off_t pos; /* 다음에 읽기/쓰기를 수행할 파일 오프셋(바이트 단위) */
bool deny_write; /* true면 다른 프로세스가 이 파일에 쓰지 못하도록 막음 */
};
inode 포인터inode 구조체(및 그 하위 디스크 포맷)를 가리킴.struct file을 갖되 같은 inode를 가리켜 공유.pos (파일 오프셋)file_read() / file_write() 호출 시 현재 커서 위치를 나타냄.deny_writetrue/false)를 나타냄.struct inode (디스크-메타데이터)filesys/inode.h (및 filesys/inode-disk.h)struct inode
{
struct list_elem elem; /* 메모리상에 열린 모든 inode 리스트 연결자 */
block_sector_t sector; /* 디스크 상의 “디스크 inode”가 저장된 섹터 번호 */
int open_cnt; /* 열린 핸들 수 */
bool removed; /* unlink()로 삭제 요청된 상태인지 */
int deny_write_cnt; /* 쓰기 금지 요청 횟수 */
struct inode_disk data; /* 디스크에 저장될 실제 메타데이터 */
};
sectorinode가 디스크의 어느 블록(섹터)에 대응하는지를 기록.open_cntstruct file 또는 struct inode 핸들이 이 파일을 열고 있는지 셈.removedremove()(unlink) 되었으나 아직 열린 핸들이 남아 있어 디스크에서는 삭제 대기 중인 상태를 나타냄.deny_write_cntdeny_write 요청이 겹치는 정도를 세어, 0이 되어야 다시 쓰기가 허용.struct inode_disk datastruct inode_disk
{
block_sector_t start; /* 파일 데이터가 시작되는 블록 번호 */
off_t length; /* 파일 크기(바이트 단위) */
unsigned magic; /* 무결성 검사용 매직 넘버 */
일반적인 구조체
------------------------------------------------------------
block_sector_t indirect; /* 간접 블록을 가리키는 블록 번호 */
block_sector_t double_indirect; /* 이중 간접 블록 번호 */
pintos는 block_sector_t 없고 아래 패딩만 존재.
------------------------------------------------------------
uint32_t unused[125]; /* Not used. */
};┌────────────┐ ┌────────────┐ ┌────────────────────┐
│ user prog │ open │ struct file│ │ struct inode │
│ │ ──────▶ │ (pos,deny…)│ ───▶ │ (in‐memory state) │
└────────────┘ └────────────┘ └────────────────────┘
▲
│
▼
┌─────────────────────┐
│ struct inode_disk │
│ (on‐disk metadata)│
└─────────────────────┘
file_*() 호출thread_current()->fd_table[fd]로 struct file *을 가져와file->inode에 접근해 실제 데이터 읽기/쓰기inode_disk의 length와 블록 포인터를 활용inode는 열리는 횟수만큼 open_cnt가 증가하고, close 시 감소.removed == true라면)struct filepos), 쓰기 금지(deny_write) 등의 런타임 상태를 보관.struct inodestruct inode_disk이 구조를 바탕으로, 각 프로세스는 open 때 inode를 공유·추적하고, read/write 시 inode_disk의 블록 정보를 참조하며, close 시 리소스를 해제합니다. 이후 FD 구현을 통해 open/read/write/close 시스템 콜을 연결.