크래프톤 정글 일지

[PintOS] 디스크와 채널 구조체

나한나한나한나 2024. 5. 21. 18:37

struct disk

disk 구조체는 ATA 디스크 장치를 나타냅니다.

c코드 복사
struct disk {
    char name[8];               /* Name, e.g. "hd0:1". */
    struct channel *channel;    /* Channel disk is on. */
    int dev_no;                 /* Device 0 or 1 for master or slave. */

    bool is_ata;                /* 1=This device is an ATA disk. */
    disk_sector_t capacity;     /* Capacity in sectors (if is_ata). */

    long long read_cnt;         /* Number of sectors read. */
    long long write_cnt;        /* Number of sectors written. */
};
  1. char name[8];:
    • 디스크의 이름을 저장합니다. 예를 들어, "hd0:1"과 같은 형식입니다. 채널 번호와 디바이스 번호(마스터 또는 슬레이브)를 나타냅니다.
  2. struct channel *channel;:
    • 디스크가 연결된 채널을 가리키는 포인터입니다.
  3. int dev_no;:
    • 디바이스 번호를 나타냅니다. 0이면 마스터, 1이면 슬레이브를 의미합니다.
  4. bool is_ata;:
    • 이 디바이스가 ATA 디스크인지 여부를 나타내는 플래그입니다. true이면 ATA 디스크입니다.
  5. disk_sector_t capacity;:
    • 디스크의 용량을 섹터 단위로 나타냅니다. is_atatrue일 때만 유효합니다.
  6. long long read_cnt;:
    • 읽은 섹터의 수를 나타내는 카운터입니다.
  7. long long write_cnt;:
    • 쓴 섹터의 수를 나타내는 카운터입니다.

struct channel

channel 구조체는 ATA 채널(컨트롤러)을 나타냅니다. 각 채널은 최대 두 개의 디스크를 제어할 수 있습니다.

c코드 복사
struct channel {
    char name[8];               /* Name, e.g. "hd0". */
    uint16_t reg_base;          /* Base I/O port. */
    uint8_t irq;                /* Interrupt in use. */

    struct lock lock;           /* Must acquire to access the controller. */
    bool expecting_interrupt;   /* True if an interrupt is expected, false if
                                   any interrupt would be spurious. */
    struct semaphore completion_wait;   /* Up'd by interrupt handler. */

    struct disk devices[2];     /* The devices on this channel. */
};
  1. char name[8];:
    • 채널의 이름을 저장합니다. 예를 들어, "hd0"과 같은 형식입니다.
  2. uint16_t reg_base;:
    • 채널의 기본 I/O 포트를 나타냅니다. 하드웨어 레지스터가 있는 주소입니다.
  3. uint8_t irq;:
    • 채널이 사용하는 인터럽트 번호입니다.
  4. struct lock lock;:
    • 컨트롤러에 접근할 때 사용되는 락입니다. 다중 스레드 환경에서 동시 접근을 제어합니다.
  5. bool expecting_interrupt;:
    • 인터럽트가 예상되는지 여부를 나타내는 플래그입니다. 인터럽트 핸들러가 사용합니다.
  6. struct semaphore completion_wait;:
    • 인터럽트 핸들러에 의해 사용되는 세마포어입니다. 인터럽트 핸들러가 완료되었음을 나타냅니다.
  7. struct disk devices[2];:
    • 이 채널에 연결된 두 개의 디스크를 나타냅니다. 각 채널은 최대 두 개의 디스크(마스터와 슬레이브)를 제어할 수 있습니다.

요약

  • disk 구조체는 개별 디스크의 정보를 나타내며, 디스크의 이름, 채널 포인터, 디바이스 번호, ATA 여부, 용량, 읽기/쓰기 카운터를 포함합니다.
  • channel 구조체는 ATA 채널(컨트롤러)의 정보를 나타내며, 채널의 이름, I/O 포트, 인터럽트 번호, 락, 인터럽트 기대 여부, 세마포어, 그리고 채널에 연결된 두 개의 디스크를 포함합니다.

이 구조체들은 디스크 하드웨어와의 상호작용을 관리하고, 디스크의 상태와 동작을 추적하는 데 사용됩니다.