내 시스템 프로그래밍 클래스에서 우리는 작고 단순한 취미 OS로 작업하고 있습니다. 개인적으로 나는 ATA 하드 디스크 드라이버로 작업 해왔다. 한 줄의 코드가 시스템을 즉시 재부팅하는 오류를 일으킨다는 것을 발견했습니다. 문제의 코드는 IDE 인터럽트에 대한 인터럽트 서비스 루틴의 끝에 있습니다. IDE 채널을 사용하고 있기 때문에 마스터 PIC (마스터를 통해 계단식 연결됨)를 통해 전송됩니다. 원래 내 코드는 인터럽트 끝 바이트를 슬레이브에만 보냈지 만, 교수는 그 코드를 마스터 PIC에도 보내야한다고 말했습니다.어셈블리 OUTB 기능이 어떻게 트리플 폴트를 일으킬 수 있습니까?
그래서 여기에 내 문제가 있습니다. EOI 바이트를 마스터 PIC로 전송하는 줄의 주석을 제거하면 시스템에 3 개의 오류가 발생하고 재부팅됩니다. 마찬가지로, 내가 코멘트를 남겨두면 시스템은 계속 실행됩니다. 시스템의 나머지 부분을 보지 않고
_outb(PIC_MASTER_CMD_PORT, PIC_EOI); // this causes (or at least sets off) a triple fault reboot
_outb(PIC_SLAVE_CMD_PORT, PIC_EOI);
, 그것은 누군가가 아마도 여기 일이있을 수 있는지 설명 할 수 있습니까?
참고 : 어두운 곳에서 촬영 한 것처럼 _outb() 호출을 IDE 컨트롤러에 대한 인터럽트가 가능하도록 만든 _outb() 호출로 바 꾸었습니다. 그러나 생성 된 어셈블리는 거의 같은. 이것은 잘못한 것이 아닙니다.
* _outb()는 x86 OUTB 명령어의 래퍼입니다.
EOI를 마스터 PIC로 보내면 문제가되는 것은 무엇입니까?
코드를 보지 않고도 이것이 불가능할 수도 있지만 답변 해 주셔서 감사합니다!
그랬 으면 좋겠지 만 자동으로 플래그를 사용하지 않도록 설정하는 코드가 있습니다. 그래서 저는 그것이 문제가 아니라고 확신합니다. –
ISR이 입력되었을 때 비활성화되었지만 ISR에서 다시 활성화되었을 수 있습니까?EOI 발행 직전에 깃발을 보았거나 다른 CLI를 발행 했습니까? – ChrisW