disk.c 함수 사용법 - Week12-13-GOAT/pintos-vm GitHub Wiki
disk.c
는 Pintos에서 ATA 디스크(일반적으로 IDE 디스크)를 제어하기 위한 인터페이스를 제공합니다. 다음은 주요 함수들의 용도와 사용 방법에 대한 상세 설명입니다.
-
disk
는 실제 하드 디스크 하나를 추상화한 구조체입니다. -
channel
은 디스크가 연결되는 컨트롤러 채널 (최대 2개)입니다. -
disk_sector_t
는 디스크의 주소 단위를 의미하며, 보통 512바이트입니다 (DISK_SECTOR_SIZE
).
-
용도: 디스크 시스템을 초기화합니다.
-
동작:
-
2개의 채널(
hd0
,hd1
)과 각 채널당 최대 2개의 디스크(hd0:0
,hd0:1
, ...)를 설정합니다. -
각 디스크가 실제로 존재하는지 확인하고, ATA 장치면
identify_ata_device()
로 모델명을 출력합니다.
-
-
사용 시점: Pintos 초기 부팅 시 자동 호출됨 (
init.c
의main()
내부에서)
-
용도: 디스크 객체를 반환합니다.
-
예시:
struct disk *fs_disk = disk_get(0, 1); // 파일시스템 디스크
-
용도: 디스크 총 섹터 수 (용량)를 리턴합니다.
-
예시:
printf("Disk size: %llu\n", disk_size(d));
-
용도: 디스크에서 한 섹터를 읽어 메모리 버퍼에 저장합니다.
-
보장: 내부적으로 락을 잡아서 thread-safe하게 동작합니다.
-
예시:
char buf[DISK_SECTOR_SIZE]; disk_read(d, 10, buf); // 10번 섹터 읽기
-
용도: 메모리에서 디스크 섹터로 데이터를 씁니다.
-
주의: 반드시
DISK_SECTOR_SIZE
크기의 데이터를 넘겨야 합니다.
-
용도: 디스크 읽기/쓰기 횟수를 출력합니다.
-
사용 예시:
disk_print_stats(); // Pintos 종료 직전 통계 출력용
-
디스크 컨트롤러에게 “다음 명령은 이 섹터에 대해 작동해라”라고 지정합니다.
-
디스크에 실제 명령 (읽기/쓰기 등)을 내립니다.
-
읽기/쓰기 데이터를 포트로 전달합니다.
disk_read(filesys_disk, sector_idx, buffer + offset);
-
실제 파일 데이터를 읽는
inode_read_at()
에서 디스크에서 데이터를 읽기 위해 이 함수가 사용됩니다.
int 0x43
, int 0x44
인터럽트를 통해:
-
RAX
← 읽은 횟수 / 쓴 횟수 (디버깅용)
함수 | 설명 |
---|---|
disk_init() | 디스크 컨트롤러 및 디스크 초기화 |
disk_get(chan, dev) | 디스크 구조체 포인터 반환 |
disk_size() | 디스크 용량(섹터 수) 반환 |
disk_read() | 섹터 단위 읽기 |
disk_write() | 섹터 단위 쓰기 |
disk_print_stats() | 읽기/쓰기 횟수 출력 |