2009-05-20 3 views
2

내 시스템 프로그래밍 클래스에서 우리는 작고 단순한 취미 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로 보내면 문제가되는 것은 무엇입니까?

코드를 보지 않고도 이것이 불가능할 수도 있지만 답변 해 주셔서 감사합니다!

답변

3

트리플 폴트는 일반적으로 스택 오버플로 또는 홀수 스택 포인터를 가리 킵니다. 오류 또는 인터럽트가 발생하면 시스템은 즉시 (오류 처리기를 호출하기 전에) 스택에 더 많은 정크를 푸시하려고 시도합니다. 스택이 호스되면 이것은 다른 폴트를 일으키고 스택에 더 많은 것들을 밀어 넣어 다른 폴트를 일으 킵니다. 이 시점에서 시스템은 사용자를 포기하고 재부팅합니다. 방법에 (약 20 년 전 델에서 작업하는 동안) 외부 하드웨어없이 CPU 리셋을 일으킬 실제로 바보 특허를 가지고 있기 때문에

나는 (키보드 컨트롤러를 통해 수행하는 데 사용)이 알고 :

MOV ESP,1 
    PUSH EAX ; triple fault and reset! 

OUTB 명령은 자체적으로 오류를 발생시킬 수 없습니다. 내 생각 엔 인터럽트를 다시 활성화하고 스택에 문제가있는 동안 인터럽트가 트리거됩니다.

1

PIC를 다시 사용하도록 설정하면 CPU의 인터럽트 플래그가 설정되어 있거나 취소되어 있습니다 (예 : CLI opcode 이후 또는 언젠가 STI opcode 이후). 는 CPU의 인터럽트 플래그가 설정되어 있다고 가정

, 당신의 행위를 재 활성화 대기중인 인터럽트를 PIC를 허용하면 CPU에 도달하는 다음 IDT가 지정한 벡터에 코드 파견을 중단 것 등

그래서 나는 그것이 직접 fault를 야기하는 opcode가 아니기를 기대합니다 : 오히려, PIC를 다시 활성화 한 결과로 발생하는 인터럽트의 결과로 실행되는 코드가 무엇이 잘못되었는지.

+0

그랬 으면 좋겠지 만 자동으로 플래그를 사용하지 않도록 설정하는 코드가 있습니다. 그래서 저는 그것이 문제가 아니라고 확신합니다. –

+0

ISR이 입력되었을 때 비활성화되었지만 ISR에서 다시 활성화되었을 수 있습니까?EOI 발행 직전에 깃발을 보았거나 다른 CLI를 발행 했습니까? – ChrisW

관련 문제