현재 취미용 OS, 특히 ATA 드라이버에서 작업 중입니다. 인터럽트가있는 PIO 데이터 인 명령에 몇 가지 문제가 있습니다. 각 블록에 대해 인터럽트 발생과 함께 블록 단위로 드라이브에서 여러 섹터를 읽으려면 READ MULTIPLE 명령을 실행하려고합니다.ATA/IDE 인터럽트를 알리는 올바른 방법은 무엇입니까?
4 블록 (블록 당 1 섹터)의 읽기를 요청하면. 각 인터럽트는 각 데이터 블록 당 하나씩 4 개가 필요합니다. 4 번째 인터럽트를 받으면 모든 데이터를 전송했고 이에 따라 요청 구조를 업데이트했다는 것을 확인할 수 있습니다. 그러나 VirtualBox에서 마지막 데이터 블록이 전송 된 후에도 또 다른 인터럽트 (STATUS = 0x50, READY, OVERLAPPED MODE SERVER REQ)가 수신되었음을 발견했습니다. 간단히 STATUS 레지스터를 읽어서 지울 수는 있지만 스펙에 따라 5 번째 인터럽트를 받아야한다고 생각하지 않습니다.
그렇다면 ATA 장치에서 발생한 인터럽트를 알리는 올바른 방법은 무엇입니까? 이 예에서
가 나는 READ MULTIPLE 명령을 실행 한 다음 내 ISR은 다음을 수행합니다- 가 비활성화 CPU 인터럽트, 니엔
- 하나의 데이터 블록 읽기 (안 분야를!) 설정 데이터를 이리저리 모든 데이터를 읽은 경우 상태가 '추가'를 취소 등록 읽을 EOI의에 모두 마스터와 슬레이브 찍어 니엔를 삭제하고 전송하여
- 종료를 중단,
- 를 등록
PIO 데이터 입력 명령 프로토콜에 대한 ATA 사양에서 상태 레지스터를 읽으려면 에이 필요하다는 것을 나타내지 않습니다. 내가 인터럽트를 받으면 프로토콜을 따르고 PIC에 EOI를 보냄으로써 완료해야한다고 생각했습니다. nIEN의 설정/해제에 관해서는 VirtualBox를 다루면서 내가 이것을하지 않으면 처음 인터럽트를받지 못한다는 것을 발견했습니다. 그래서 ISR에 입장 할 때 nIEN을 설정 한 다음 떠나기 전에 취소합니다. 나는 그것이 효과가 없을 것이라고 생각하지만, 특정 레지스터를 읽고 쓰는 것과 관련이 있어야한다.