ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [운영체제 만들기] ATA / IDE
    프로젝트/운영체제 만들기 2023. 8. 7. 02:05

    글의 참고

    - https://en.wikipedia.org/wiki/ST506/ST412

    - https://en.wikipedia.org/wiki/Parallel_ATA

    - https://wiki.osdev.org/ATA_PIO_Mode

    - http://egloos.zum.com/sutdaeng/v/2831491

    - http://nimhaplz.egloos.com/5366805

    - http://users.utcluj.ro/~baruch/media/siee/labor/ATA-Interface.pdf

    - https://www.pjrc.com/mp3/gallery/cs580/ata_atapi.html

    - https://lateblt.tripod.com/atapi.htm

    - https://namu.wiki/w/Advanced%20Technology%20Attachment


    글의 전제

    - 내가 글을 쓰다가 궁금한 점은 파란색 볼드체로 표현했다. 나도 모르기 때문에 나중에 알아봐야 할 내용이라는 뜻이다.

    - 밑줄로 작성된 글은 좀 더 긴 설명이 필요해서 친 것이다. 그러므로, 밑 줄 처친 글이 이해가 안간다면 링크를 따라서 관련 내용을 공부하자.

    - `글의 참조`에서 빨간색 볼드체로 체크된 링크는 이 글을 작성하면 가장 많이 참조한 링크다.

    - 대개 UEFI 에서 말하는 platform은 hardwares를 의미한다. 근데 구체적인 특정 하드웨어를 의미하기 보다는 Chipset 및 SoC를 의미하는 경우가 많다.


    글의 내용

     

    - ATA

    : ATA는 `Advanced Technology Attachment` 의 약자이다. IDE는 `Integrated Drive Electronics`의 약자이다. IDE와 ATA는 거의 동의어로 사용된다. 그래서 ATA 컨트롤러라고 하면 IDE 컨트롤러라고 하는 말은 동의어로 생각하면 된다. ATA를 `AT Attachment`라고 불리는 이유는 그 기술이 처음 나올 때, IBM PC/AT에서 처음으로 소개되었기 때문이다. IBM PC/AT에는 16 비트 대역폭을 갖는 ISA 버스가 들어있는데, 거기에 ATA 컨트롤러가 탑재되어 나왔다.

     

    - ATA PIO(Programmed Input/Output , Programmable Input/Output) 모드

    : PIO란 `CPU와 주변 장치들과의 데이터 통신`으로 정의된다. 그런데 여기서 말하는 주변 장치들이란 대개는 I/O 디바이스들을 의미한다. CPU는 이러한 주변 장치들과 통신할 때, 매 명령어 수행시 본인이 직접 처리를 한다. 그래서 PIO는 CPU를 완전 독점하게 만들어 시스템의 효율을 떨어트린다. PIO는 CPU에 의한 데이터 통신, DMA는 CPU를 거처서 가지 않는 데이터 통신이라고 볼 수 있다.

     

    : PIO라는 말이 MMIO와 PMIO로 혼용될 수 있다. 인텔 x86에서 `IN` 과 `OUT` 명령어는 BIOS를 만들다보면 자주 쓰이고, PATA 뿐만 아니라 여러 디바이스에서 자주 쓰이는 명령어이다. 이 PMIO는 컴퓨터 역사 초기에 메모리가 굉장히 작은 사이즈일 때 자주 사용했다. MMIO 방식과 같이 Host PC와 I/O Device가 메모리를 통해 통신을 하게 되면 귀중한 메모리가 통신의 공간으로 사용이 되버린다. PMIO는 이러한 문제를 해결하기 위해 발명되었다. 즉, 주 메모리 외부에 별도의 특별한 어드레스를 공간을 만들어놓고 여기에서 Host PC와 I/O Device가 통신을 하는것이다. 그러나 현대에는 메모리 사이즈가 커지면서 임베디드에서도 거의 MMIO만 사용되고, x86 계열의 CPU를 사용하는 PC를 제외하고 사용하는 곳이 있을까 싶다.

     

     

    - ATA 인터페이스

    : 아래의 사진을 보면 알겠지만, 일반적으로 PC 마더 보드에 ATA 인터페이스(소켓)은 총 4개 존재한다. 2개의 인터페이스는 다시 하나의 IDE 채널로 관리하게 된다. 

    출처 - https://book.huihoo.com/pc-architecture/chapter44.htm

     

    : 아래의 그림은 ATA 인터페이스의 논리적 구조다. 외부에는 4개의 인터페이스가 존재하지만, 내부적으로는 2개의 인터페이스가 하나의 채널에 맵핑된다. 그래서 결국 한 시점에는 하나의 디바이스만 동작하게 되게 된다. 대개는 원래 각 소켓은 색깔로 구분이 가능하다. 검은색 소켓은 PRIMARY 채널을 의미하고, 파란색 소켓은 SECONDARY 채널을 의미한다. 소켓들이 색깔이 모두 동일하다면, `IDE0`이라고 되어있는 소켓이 PRIMARY 채널이고, `IDE1`이라고 되어 있는 소켓은 SECONDARY 채널이다. 

    출처 - https://www.computerhope.com/jargon/p/primchan.htm

     

    : 그리고 IDE는 다른 SCSI, ESDI 와는 다르게 컨트롤러가 각 드라이브 안에 내장되어 있다. 대개는 컨트롤러가 마더 보드안에 들어있고 이 컨트롤러를 컨트롤해서 외부에서 장착되는 디바이스들을 컨트롤하게 된다. 그런데, IDE 드라이브들은 각 장치안에 컨트롤러가 내장되어 있고, 마더 보드안에는 있는 `호스트 버스 어댑터(HBA)`라고 하는 어댑터를 통해서 마더보드안에 다른 칩들과 통신할 수 있게 된다.

     

    출처 - https://book.huihoo.com/pc-architecture/chapter44.htm

     

    : 아래의 그림은 IDE HBA의 구조다. IDE HBA를 다른 말로 IDE 컨트롤러라고 부른다. IDE 컨트롤러는 3개의 블락으로 구성되어 있다. `CPU 인터페이스`은 CPU와의 통신을 담당한다. `IDE 인터페이스`는 IDE 디바이스들과의 통신을 담당한다. `PIO 컨트롤러 블락`은 현재 IDE 컨트롤러의 상태를 관리한다.

     

    출처 - https://www.intel.com/content/www/us/en/docs/programmable/683523/current/ide-ata-controller-and-interface.html

     

     

    - Master/Slave

    : ATA 버스에는 여러 개의 ATA 드라이브가 붙게 된다. ATA 버스에서는 하나의 드라이브만 선택할 수 있는 `SELECT` 핀이 존재한다. 그래서 ATA 버스에서는 2개의 ATA 드라이브가 동시에 동작할 수 없다. 여기서 동작하는 드라이브를 `마스터`, 동작하지 못하는 드라이브를 `슬레이브`라고 불린다. 포트 I/O를 통해 개발자는 어떤 드라이브가 마스터가 될지 슬레이브가 될지를 선택할 수 있다.

     

     

     

    - ATA 드라이브 선택과 주소

    : ATA-2 스펙에 정의된 물리적 핀은 총 40개다.

    출처 - http://www.t13.org/Documents/UploadedDocuments/project/d0948r4c-ATA-2.pdf

    : 위에 핀에서 28핀(`Cable Select`)과 37, 38핀(`Chip Select`)과 33, 35, 36핀(`Device Address Bit`)에 대해서는 좀 알아볼 필요가 있다. 두 번째 컬럼에서 `Source`가 보이는데, 이건 `방향`이라고 보면 된다.

     

    : 먼저 칩을 선택하는 방법을 알아보자. 칩을 선택하는데는 2가지 방법이 있다.

    1" 케이블의 28번 CS 핀을 호스트 어댑터에서 컨트롤
    2" ATA 디바이스에서 CS 점퍼라인을 수동으로 컨트롤

    : 1번은 간단하다. ATA 디바이스가 2개 있다. 각각을 A, B 라고 부르겠다. 호스트 어댑터가 A 디바이스에 연결된 케이블 28번 CS 핀을 0으로 설정하면, A 디바이스가 `디바이스0(마스터)`가 된다. 자동으로 B는 `디바이스1(슬레이브)`가 된다. 만야, 호스트 어댑터가 A 디바이스에 연결된 케이블 28번 CS핀을 오픈하면, A 디바이스 `디바이스1(슬레이브)`가 되고 자동으로 B는 `디바이스0(마스터)`가 된다.

     

    : 2번은 ATA 디바이스쪽에 물리적으로 실제하고 있는 CS 핀에 점퍼를 꽂는 것이다. 아래 CS 쪽에 점퍼를 꽂으면 해당 디바이스가 `디바이스0이 된다. 

    출처 - https://book.huihoo.com/pc-architecture/chapter44.htm

    : 주의할 점이 있다. 이렇게 드라이브 선택하는 방법이 2가지가 이다 보니, 2개 모두를 설정하는 경우가 생길 수 있다. 그러나 결론만 말하면 `점퍼` 방식이 우선순위가 높다. 그런데 점퍼를 일일히 꽂는 일은 쉽지 않기 때문에 슬레이브로 지정된 디바이스들은 28핀을 절단해 버렸다.

     

     

    : IDE 컨트롤러에는 대개 2개의 하드 디스크 드라이브가 장착할 수 있다. 하나의 케이블에 

     

     

     

    - ATA 채널

    : 마더 보드안에 호스트 버스 어댑터는 2개의 ATA 채널을 컨트롤한다. 재미있는 건, 이 2개의 채널을 독립적으로 멀티태스킹 할 수 있다는 것이다. 그래서 많은 사람들이 ATA는 `각 채널마다 자신의 컨트롤러를 갖고 있다` 고들 얘기한다. 한 가지를 예를 들어보자. 만약, 각 2개의 ATA 채널이 있고, 하나를 A 채널, 나머지를 B 채널이라고 하자. 그리고 각 채널마다 하나의 디스크가 있다고 해보자. 우리는 이제 A 채널에서 데이터 읽을 수 있다. 그런데, 그와 동시에 B 채널에 데이터를 쓸 수도 있다. 즉, 각 디스크가 독립적으로 동작한다는 소리다.

     

    : 위의 케이스는 ATA 채널이 서로 다르다는 전제다. 한 채널에 존재하는 마스터와 슬레이브가 동시에 동작할 수는 없다. 즉, 채널마다 마스터만 동작하거나, 슬레이브만 동작해야 한다.

     

    : 각 채널마다 프로토콜을 달리 할 수 있다. 그런데 여기서 주의할 점이 있다. 만약, 동일 채널에 다른 전송 프로토콜을 사용하는 디바이스 2개를 설치했다면, 퍼포먼스가 낮은 쪽 성능으로 고정된. 예를 들어, A 채널에 마스터로 하드 디스크를, 슬레이브로 CD-ROM을 배치하면, A 채널은 CD-ROM 속도로 고정 되어버린다. 그러모르, 동일 프로토콜을 사용하는 디바이스들을 동일 채널로 묶어야 성능에 유리하다. 아래를 보면, PRIMARY 채널에 할당된 마스터와 슬레이브의 전송 모드가 모두 동일하다. PIO는 4 버전을 지원하며, UDMA 모드 또한 4를 지원한다. 이렇면, 2개의 디바이스가 전송 모드가 동일하기 때문에 성능이 낮은 쪽으로 고정되는 문제는 해결된 셈이다.

     

    출처 - https://book.huihoo.com/pc-architecture/chapter44.htm

    ATA connection Device
    Primary, master Hard disk 1 
    Primary, slave Hard disk 2 
    Secondary, master CD ROM burner
    Secondary, slave DVD drive

     

    : 그러나, 위와 같이 할 경우 성능을 가져올 수 있지만 용량을 버리는 셈이 된다. 사이즈가 큰 디스크 2개를 하나의 채널에 할당하고 사이즈가 작은 CD-ROM 및 DVD를 B 채널에 할당하면 성능은 좋아질지 몰라도 용량에서 큰 손해를 보게 된다. 왜냐면, 디스크 자체가 용량이 크기 때문에 양 채널에 각각 배치되는 것이 가장 이상적이다. 이것 때문에 등장한 것이 ATA RAID 이다.

     

     

    - ATA 버스

    : IDE는 기존 IBM PC/AT의 ISA 버스에 맞게 설계되었기 때문에 비용은 저렴할지 몰라도, 성능에서 좋지 않았다. 먼저 전제로 얘기할 것이 있다. 대 부분의 하드웨어 디바이스의 속도는 사실 디바이스 내부 자체 처리 속도도 문제가 되긴 하지만, 또 중요한 것이 해당 디바이스가 붙어있는 버스의 속도도 문제가 된다. IDE를 지원하는 하드웨어 디바이스가 애초에 느린 것도 문제지만, ISA 버스 자체가 느린 것도 문제란 소리다. 그래서 IDE에서 더 업그레이드된 버전인 `EIDE`를 만들 때는 ISA 버스와 같은 저속 버스가 아닌, PCI와 같은 고속 버스에 맞춰 표준을 만들었다. 즉, ATA 디바이스는 2가지 버스 위에서 동작하도록 설계되어 있다.

    1" ISA 버스(16비트)
    2" PCI 버스(32비트)

    : OS 개발시에 각 버스에 맞는 설정들이 반드시 진행되어야 한다.

     

     

     

    - ATA/ATAPI 인터페이스 레지스터

    : 위에서 말했다시피, 마더 보드상에 ATA 인터페이스가 2개 존재한다. 각각을 `Primary`와 `Secondary` 라고 한다. 이 2개의 채널은 IBM PC 호환 기종 x86 아키텍처 CPU에서 다음의 I/O 포트를 갖는다.

    1" PRIMARY : 0x1F0h ~ 0x1F7 , 0x3F6 ~ 0x3F7
    2" SECONDARY : 0x170h ~ 0x177 , 0x376 ~ 0x377 

    : 위 내용이 ATA 스펙에 있을까? 나는 ATA-1과 ,ATA-2를 봤지만 없었다. 이 내용은 도대체 어디에 있는 걸까? 이 내용은 IBM PC 호환 기종들에게 할당된 I/O 어드레스를 살펴봐야 한다. 링크를 따라가 표에 보면, `Parallel ATA ...` 이 할당받은 I/O 어드레스가 보일 것이다. 

     

     

    : 디스크 드라이브 컨트롤러와의 호스트 버스 어댑터는 아래의 I/O 레지스터를 통해 통신을 한다.

    출처 - http://users.utcluj.ro/~baruch/media/siee/labor/ATA-Interface.pdf

    : I/O 레지스터는 2가지 레지스터로 나뉜다.

    1" Command Block Registers
    2" Control Block Registers

    : 먼저 볼 부분은 `Offset` 이다. 이 오프셋은 위의 각각의 블락 레지스터의 `베이스 주소`를 기준으로 나온 값이다. ATA 스펙에서 말하는 베이스 주소는 IBM PC 기반의 호환 기종들을 두고 정의된 용어다. 대개 베이스 주소는 `I/O 포트` 단어와 혼용되어 사용된다. 결국 베이스 주소는 특정 디바이스가 I/O 주소 공간을 할당받고, 그 공간의 가장 첫 번째 주소를 의미한다.

     

    : 그 다음 가장 눈여겨볼 점은 레지스터의 주소는 같은데, 읽을 때와 쓸 때 서로 다른 레지스터가 존재한다는 점이다. Command Block Registers 에서는 1, 2번이 그러하고 Control Block Registers 에서는 6번이 그러하다.

     

    0x1F0|0x170 (Read and Write): Data Register
    0x1F1|0x171 (Read): Error Register
    0x1F1|0x171 (Write): Features Register
    0x1F2|0x172 (Read and Write): Sector Count Register
    0x1F3|0x173 (Read and Write): LBA Low Register
    0x1F4|0x174 (Read and Write): LBA Mid Register
    0x1F5|0x175 (Read and Write): LBA High Register
    0x1F6|0x176 (Read and Write): Drive/Head Register
    0x1F7|0x177 (Read): Status Register
    0x1F7|0x177 (Write): Command Register
    0x3F6|0x376 (Read): Alternate Status Register
    0x3F6|0x376 (Write): Device Control Register

    : 앞 쪽의 0x1F0은 프라이머리 컨트롤러의 주소를 의미하고, 뒷 쪽의 0x170은 세컨더리 컨트롤러를 의미한다.

     

     

     

    : identify device command는 ATA-2 부터 지원했다. 

     

    : Status Register

    " 현재 디스크 드라이브의 상태를 나타낸다. `BSY`는 정말 중요하다. 이 비트가 1이면, 다른 모든 비트들은 의미가 없다. 즉, 유효하지 않다. `BSY` 비트가 0 때만, 다른 비트들의 값이 모두 유효하다. 근데 `BSY` 비트는 이 레지스터에만 유효한 게 아니다. 다른 레지스터에서도 `BSY` 비트가 1이면 대부분의 비트들은 유효하지 않다.

    출처 - http://users.utcluj.ro/~baruch/media/siee/labor/ATA-Interface.pdf

     

    " BSY[7] - 디스크 드라이브가 명령을 아직 처리중이면 1이다. 디스크 드라이브는 명령어 처리를 완료한 후, 데이터를 전송할 준비가 완료가 되면 DRQ를 1로 설정한 뒤, BSY 비트를 클리어(0)한다. 여기서 주의할 점은 BSY 비트는 명령어와 연관이 있는 비트라는 점이다. 명령어 처리가 끝나고 데이터 전송 준비가 되면 BSY 비트는 1이 된다.
    " DRDY(6)
    " DRQ(3) - `Data Request`의 약자로 디스크 드라이브가 데이터 전송 준비가 끝나면, 1로 설정된다. 

     

    : Device Register(0x1F0

    " 어떤 디스크 드라이브(0, 1)를 사용할지와 LBA 주소 지정을 사용할지 CHS 주소 지정을 사용할지를 결정한다. 이 레지스터는 BSY와 DRQ가 0일 때만 쓸 수 있다. RSY 비트가 0일 때만, 이 레지스터의 값이 유효하다.

    1" LBA(6) : 1이면 LBA, 0이면 CHS
    2" DEV(4) : 0이면 `디스크 드라이브 0`, 1이면 `디스크 드라이브 1`
    출처 - http://users.utcluj.ro/~baruch/media/siee/labor/ATA-Interface.pdf

    " 이 레지스터는 생각보다 중요할 수 도 있다. 대개 부팅 디스크 이미지와 파일 시스템 이미지가 나뉘게 된다. 그래서 디스크 드라이브가 2개 존재하게 되는데, `디스크 드라이버 0` 이 `부팅 디스크 이미지`, `디스크 드라이브 1`이 `파일 시스템 이미지`가 된다. 참고로, QEMU에서 IDE 관련 디스크 드라이브를 생성시 주의점이 있다.

     

    : 아래의 명령어를 보면, `index 0`에 `부팅 디스크 이미지`를 매핑하고, `index 1`에 `파일 시스템 이미지`를 매핑한다. 이렇게 함으로써, 마치 프라이머리 IDE가 `index 0`이고, 세컨더리 IDE가 `index 1`로 생각하면 안된다. 2개의 디스크 드라이브 모두 프라이머리 포트로(0x1F[X]) 접근한다. `디바이스 레지스터`의 4번째 비트를 바꿈으로써 프라이머리 IDE 컨트롤러가 관리하는 2개의 디스크 드라이브에 각각 접근할 수 있다.

    -drive file=fs.img,index=1,media=disk,format=raw -drive file=boot.img,index=0,media=disk,format=raw

    : `0x17[X]`, 즉, 슬레이브 IDE 컨트롤러에 접근하기 위해서는 `-drive=` 옵션을 사용하기 보다는 `-driver=` 옵션을 사용해야 한다. 

     

     

    - ATA 버전에 따른 전송 모드 및 기타 특징

    : 아래의 표는 위키피디아에서 퍼온 내용이다. 전송 모드를 보면 초장기에만 PIO가 보이는 것을 알 수 있다. 아래에서 UDMA는 Ultra DMA의 약자를 의미한다. 전송 모드에서 PIO가 없다고해서 사라진 것은 아니다. ATA 스펙에 의하면, PIO 모드는 모든 ATA를 지원하는 디바이스들의 기본 데이터 전송 모드여야 한다고 명시되어 있다. 아래의 표는 주로 사용됬던 전송 모드를 작성한 것 뿐이다. PIO는 ATA를 지원하는 모든 디바이스들이 지원해야 하는 모드다.

    표준 별칭 전송 모드 최대 디스크 사이즈 주요 특징
    IDE (pre-ATA) IDE PIO 0 GiB (2.1 GB) 22-bit logical block addressing (LBA)
    ATA-1 ATA, IDE PIO 0, 1, 2
    Single-word DMA 0, 1, 2
    Multi-word DMA 0
    128 GiB (137 GB) 28-bit logical block addressing (LBA)
    ATA-2 EIDE, Fast ATA, Fast IDE, Ultra ATA PIO 3, 4
    Multi-word DMA 1, 2
      PCMCIA connector. Identify drive command.[44]
    ATA-3 EIDE Single-word DMA modes dropped[45]   S.M.A.R.T., Security, 44 pin connector for 2.5" drives
    ATA/ATAPI-4 ATA-4, Ultra ATA/33 Ultra DMA 0, 1, 2,
    also known as UDMA/33
      AT Attachment Packet Interface (ATAPI) (support for CD-ROM, tape drives etc.), Optional overlapped and queued command set features, Host Protected Area (HPA), CompactFlash Association (CFA) feature set for solid state drives
    ATA/ATAPI-5 ATA-5, Ultra ATA/66 Ultra DMA 3, 4,
    also known as UDMA/66
      80-wire cables; CompactFlash connector
    ATA/ATAPI-6 ATA-6, Ultra ATA/100 UDMA 5,
    also known as UDMA/100
    128 PiB (144 PB) 48-bit LBA, Device Configuration Overlay (DCO),
    Automatic Acoustic Management (AAM)
    CHS method of addressing data obsolete
    ATA/ATAPI-7 ATA-7, Ultra ATA/133 UDMA 6,
    also known as UDMA/133
    SATA/150
      SATA 1.0, Streaming feature set, long logical/physical sector feature set for non-packet devices
    ATA/ATAPI-8 ATA-8  —   Hybrid drive featuring non-volatile cache to speed up critical OS files
    ATA/ATAPI-8 ACS-2  —   Data Set Management, Extended Power Conditions, CFast, additional stats., etc.

    : 아래 그림은 각 전송 모드에 따른 속도를 나타낸 것이다. PIO 같은 경우는 이제 거의 쓰지 않는 추세다. CPU 리소스를 거의 독점하는 모드이기 때문에, 잘 사용하지 않는다. 그러나 커스텀 OS 개발 시에는 여전히 쓸만한 기술이다. 컴퓨터 초기 부팅시에는 프로세스가 하나만 존재한다. 그래서 멀티 프로세스가 활성화 되기전까지는 PIO 모드도 사용할만한 하다.

    출처 - https://en.wikipedia.org/wiki/Parallel_ATA

     

    - ATA 명령어

    : ATA 명령어 실행은 명령어 레지스터인 0x1F7(PRIMARY), 0x177(SECONDARY)에 ATA 스펙에 나와있는 커맨드 값을 작성해서 디스크 드라이브로 전송함으로써 처리가 시작된다. 명령어 처리에 필요한 파라미터들은 다른 Command Blcok Registers 들에 명령어가 요구하는 값에 맞게 작성함으로써 전달한다. 예를 들어, ATA-2 스펙 51번째 페이지에 `7.1.5 IDENTIFY DEVICE` 관련 내용이 있다. 이 커맨드는 모든 ATA 디바이스라면 구현해야 하는 커맨드이고, 커맨드 값으로 `ECh` 값을 가지며, 데이터 프로토콜은 PIO를 통해서만 받을 수 있다고 나와있다. 파라미터는 필요없으며, ERROR OUTPUT은 없다고 나와있다.

     

    : `IDENTIFY DEVICE` 명령어가 처리가 완료되면, 호스트는 데이터 레지스터를 통해서 디스크 드라이브가 보낸 드라이브 정보들을 받을 수 있다. 이 정보의 크기는 256 워드다(512B).

     

     

     

    : 그리고 이 명령어는 Drive/Head 레지스터의 DEV 비트를 무시하기 때문에, 디바이스[0, 1]이 모두 존재할 경우, 각 디바이스들에 대해 명령어를 수행한다.   

     

    : 이 밖에도 ATA 명령어는 종류가 상당히 많다. 그중에 그나마 중요한 명령어들은 `IDENTIFY DEVICE`, `IDENTIFY PACKET DEVICE`, `EXECUTE DEVICE DIAGNOSTIC` 등이 있다. 데이터 관련 명령어도 있지만, 너무 많아서 생략한다.

     

    IDENTIFY DEVICE 명령어(ECh)

    " ATA 스펙에서 가장 유명한 명령어다. 이 명령어를 통해서 특정 디스크 드라이브에 정보를 얻을 수 있다. 

     

     

    이 명령어를 통해 호스트 컴퓨터는 디스크 드라이브에 대한 정보를 받게된다. 512B 바이트나 받게된다. 문제는 ATA 드라이브에서 이 명령이 실패해도 아무 리포트를 해주지 않기 때문에 에러 발생 여부를 알 방법이 없다. ATAPI 에서는 이 명령 실행 중 에러가 발생하면, 에러 레지스터의 `ABRT` 비트를 1로 설정한다.  

    출처 - http://users.utcluj.ro/~baruch/media/siee/labor/ATA-Interface.pdf

    " 위 표에서 보다시피 몇몇 필드들은 아스키 코드 문자열이다. 문제는 이게 리틀 엔디안으로 해석된다는 것이다. 즉, 워드에서 MSB가 첫 번째 문자가 되고, LSB가 두 번째 문자가 된다. 

     

    : EXECUTE DEVICE DIAGNOSTIC

    " ATA-6 스펙에 있는 `8.11 EXECUTE DEVIE DIAGNOSTIC` 명령어도 알아보자. 이 명령어도 ATA 디바이스 드라이버를 구현하는데 있어서, `IDENTIFY DEVICE`와 양대산맥을 이루는 명령어다. 이 명령어는 좋은 점이 각 디스크 드라이브마다 보낼 필요가 없다. 한 번 보내면, 모든 존재하는 디스크들을 검사해준다. 착한 명령어다. 디스크 존재 여부를 검사하는 명령어이기 때문에 ATA 디바이스 드라이버를 초기화하는 가장 맨 처음 시점에 하게된다. 또 이 명령어의 단점은 커맨드 파라미터가 없다는 점이다!

    출처 - http://www.t13.org/Documents/UploadedDocuments/project/d1410r3b-ATA-ATAPI-6.pdf

    " 이 명령어도 ATA 디바이스들은 무조건 구현해야 하며, 커맨드 값은 `90h`이며, 진단 코드만 받을 것이기 때문에 데이터 레지스터가 아닌 I/O 포트를 통해 받는다. 디스크 드라이브가 반환하는 진단 코드는 에러 레지스터를 통해서 확인이 가능하다. 드라이브0은 01h과 81h을 제외하면 모두 에러라고 한다. 01h이면 디바이스0, 1이 모두 합격 혹은 디바이스0 만 합격. 81h은 디바이스0만 존재하고, 디바이스1은 존재하지 않는다는 의미.

    출처 - https://web.archive.org/web/20110915154404/http://www.t13.org/Documents/UploadedDocuments/project/d1410r3b-ATA-ATAPI-6.pdf

    " 드라이브 1 에러 레지스터를 통해서는 드라이브 1의 존재 여부를 알 수 있다. 01h면 존재, 그 외에는 존재하지 않음으로 표시.

     

    " 그리고 이 진단 커맨드를 통해서 알 수 있는 정보가 또 있다. 바로 `시그니처`다. 이 시그니처를 통해서 현재 존재하는 디스크 드라이버가 ATAPI를 지원하는지 여부를 알 수 있다.

    출처 - http://www.t13.org/Documents/UploadedDocuments/project/d1410r3b-ATA-ATAPI-6.pdf

     

    현재 디바이스가 `PACKET COMMAND`를 지원하는지 하지않는지에 대해 알 수 있다. 이 PACKET COMMAND를 지원한다는 말은 결국 ATAPI를 지원한다는 말과 동의어다. 만약, ATAPI를 지원하지 않을 경우, 시그니처 반환값은 아래와 같다. 참고로, 반환값을 Command Block Registers 를 통해서 받는다.

    출처 - http://www.t13.org/Documents/UploadedDocuments/project/d1410r3b-ATA-ATAPI-6.pdf

     

    " 만약 ATAPI 를 지원한다면 반환값은 다음과 같다.

    출처 - http://www.t13.org/Documents/UploadedDocuments/project/d1410r3b-ATA-ATAPI-6.pdf

     

    " 이 시그니처값은 진단 명령어를 통해서만 얻을 수 있는게 아니다. ATA-6 스펙에서는 `파워-온 리셋`, `하드웨어 리셋`, `소프트웨어 리셋` 등을 통해서도 시그니처가 자동으로 위에 레지스터들에 세팅된다고 한다.

     

    : DEVICE RESET(08h)

    " 이 커맨드는 옵션 커맨드다. 즉, 구현을 강제하지는 않는다. 그래서 안전하게 `STATUS 레지스터`를 이용하는 방식이 좋을 거다.

    '프로젝트 > 운영체제 만들기' 카테고리의 다른 글

    코드 점프  (0) 2023.08.07
    BIOS  (0) 2023.08.07
    [운영체제 만들기] Lazy Buddy Allocator  (0) 2023.08.07
    [운영체제 만들기] Buddy Allcator  (0) 2023.08.07
    [메모리] Fixed-size blocks allocation  (0) 2023.08.05
Designed by Tistory.