2011-09-20 9 views
4

현재 취미용 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은 다음을 수행합니다

  1. 가 비활성화 CPU 인터럽트, 니엔
  2. 하나의 데이터 블록 읽기 (안 분야를!) 설정 데이터를 이리저리 모든 데이터를 읽은 경우 상태가 '추가'를 취소 등록 읽을 EOI의에 모두 마스터와 슬레이브 찍어 니엔를 삭제하고 전송하여
  3. 종료를 중단,
  4. 를 등록

PIO 데이터 입력 명령 프로토콜에 대한 ATA 사양에서 상태 레지스터를 읽으려면 이 필요하다는 것을 나타내지 않습니다. 내가 인터럽트를 받으면 프로토콜을 따르고 PIC에 EOI를 보냄으로써 완료해야한다고 생각했습니다. nIEN의 설정/해제에 관해서는 VirtualBox를 다루면서 내가 이것을하지 않으면 처음 인터럽트를받지 못한다는 것을 발견했습니다. 그래서 ISR에 입장 할 때 nIEN을 설정 한 다음 떠나기 전에 취소합니다. 나는 그것이 효과가 없을 것이라고 생각하지만, 특정 레지스터를 읽고 쓰는 것과 관련이 있어야한다.

답변

6

이 문제는 항상 저에게 발생합니다. 저는 고심하고있는 질문을 올리며, 잠시 후 답을 찾으려고합니다.

이 상태에서, 호스트 장치의 상태 레지스터를 판독한다 : I가 참조 봤는데

ATA-6 규격의 PIO 데이터 인 부분 (9.5)이 하나 개의 라인을 가지고있다.

ATA의 경우 상태 레지스터에는 부작용이 있습니다. 보류중인 인터럽트를 지 웁니다. 나는 이것을 알고 있었지만 전에이 부분을 올바르게 읽지 못했습니다. 왜 당신이 레지스터를 읽어야하는지 언급하지 않고 단지 위와 똑같이 말합니다.

중요한 부분은 인터럽트 처리기와 어떻게 작동하는지입니다. PIO 데이터 인 명령을 실행 한 후 INTRQ가 어서 트되면 인터럽트를 지우기 위해 상태 레지스터를 한 번 읽은 다음 인터럽트를 계속 처리하고 정상적으로 복귀합니다 (PIC에 EOI를 보냅니다). 혼란 스러웠던 점 내가 읽은 문서 중 아무 것도 이것이 인터럽트 (INTRQ 수신, 상태 읽기, 인터럽트 처리)와 어떻게 작동하는지 정확히 언급하지 않았다는 것입니다. 대부분의 온라인 안내서는 폴링 된 IO 만 처리합니다.

이것은 저수준 프로그래밍의 어려움 중 하나이며 ISR의 상태 레지스터를 읽는 것과 같은 주요 세부 사항은 종종 눈에 띄지 않습니다.이것은 프로토콜 설명에서 한 줄로 남았습니다. 나를 까다롭게 부르지 만, 나는이 점에 더 중점을 둘 것으로 기대했을 것이다.