disk.c 함수 사용법 - Week12-13-GOAT/pintos-vm GitHub Wiki

disk.c는 Pintos에서 ATA 디스크(일반적으로 IDE 디스크)를 제어하기 위한 인터페이스를 제공합니다. 다음은 주요 함수들의 용도사용 방법에 대한 상세 설명입니다.


📦 전체 구조

  • disk는 실제 하드 디스크 하나를 추상화한 구조체입니다.

  • channel은 디스크가 연결되는 컨트롤러 채널 (최대 2개)입니다.

  • disk_sector_t는 디스크의 주소 단위를 의미하며, 보통 512바이트입니다 (DISK_SECTOR_SIZE).


🛠 주요 함수 요약

1. void disk_init(void)

  • 용도: 디스크 시스템을 초기화합니다.

  • 동작:

    • 2개의 채널(hd0, hd1)과 각 채널당 최대 2개의 디스크(hd0:0, hd0:1, ...)를 설정합니다.

    • 각 디스크가 실제로 존재하는지 확인하고, ATA 장치면 identify_ata_device()로 모델명을 출력합니다.

  • 사용 시점: Pintos 초기 부팅 시 자동 호출됨 (init.cmain() 내부에서)


2. struct disk *disk_get(int chan_no, int dev_no)

  • 용도: 디스크 객체를 반환합니다.

  • 예시:

    struct disk *fs_disk = disk_get(0, 1); // 파일시스템 디스크
    

3. disk_sector_t disk_size(struct disk *d)

  • 용도: 디스크 총 섹터 수 (용량)를 리턴합니다.

  • 예시:

    printf("Disk size: %llu\n", disk_size(d));
    

4. void disk_read(struct disk *d, disk_sector_t sec_no, void *buffer)

  • 용도: 디스크에서 한 섹터를 읽어 메모리 버퍼에 저장합니다.

  • 보장: 내부적으로 락을 잡아서 thread-safe하게 동작합니다.

  • 예시:

    char buf[DISK_SECTOR_SIZE];
    disk_read(d, 10, buf); // 10번 섹터 읽기
    

5. void disk_write(struct disk *d, disk_sector_t sec_no, const void *buffer)

  • 용도: 메모리에서 디스크 섹터로 데이터를 씁니다.

  • 주의: 반드시 DISK_SECTOR_SIZE 크기의 데이터를 넘겨야 합니다.


6. void disk_print_stats(void)

  • 용도: 디스크 읽기/쓰기 횟수를 출력합니다.

  • 사용 예시:

    disk_print_stats(); // Pintos 종료 직전 통계 출력용
    

7. 내부적으로 중요한 함수

select_sector(d, sec_no)

  • 디스크 컨트롤러에게 “다음 명령은 이 섹터에 대해 작동해라”라고 지정합니다.

issue_pio_command(c, CMD_READ_SECTOR_RETRY)

  • 디스크에 실제 명령 (읽기/쓰기 등)을 내립니다.

input_sector(c, buf) / output_sector(c, buf)

  • 읽기/쓰기 데이터를 포트로 전달합니다.


💡 디스크 사용 예: inode_read_at()과 연동

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() 읽기/쓰기 횟수 출력

⚠️ **GitHub.com Fallback** ⚠️