PC에서 부트로더에서 인터럽트관련 코드작성중에 질문입니다.
글쓴이: sjg0120 / 작성시간: 목, 2006/12/28 - 12:44오전
OS수업을 마친후 지금 커널코드를 간단하게나마 연습삼아 짜보고있는데요
인터럽트 디스크립터 테이블과 서비스루틴까지 작성하고
이제 제대로 동작하나 확인할려고 인터럽트를 활성화 시켰는데
바로 인터럽트가 걸려버리네요;;; 인터럽트를 비활성화 시켰다가
다시 활성화 시킬때 걸리는 인터럽트도 있나요??
그후 인터럽트 명령어로 인터럽트를 발생시키면 정의해 두었던
인터럽트들은 제대로 동작합니다.
참고로 사용하는 어셈블러는 nasm입니다. 인터럽트를 활성화 시킬때 사용했던
명령어는 sti이구요...
Forums:
하드웨어 인터럽트를 막지 않았다면...
아마도 타이머 인터럽트 (INT 08h)일 겁니다. IRQ 0번이 8254 타이머 인터럽트인데 이게 INT 08에 매핑되어 있습니다. 사용하지 않는 인터럽트 벡터는 모두 IRET을 가리키게 해 두는 것이 안전합니다.
BIOS에서 초기화를
BIOS에서 초기화를 끝내고 부트로더를 로딩할 때에는 IRQ가 아래와 같이 매핑되어 있습니다.
IRQ0~7 = INT 0x08~0x0F
IRQ8~15 = INT 0x70~0x77
타이머 인터럽트는 1초에 18.2씩 계속 발생합니다. 그래서 Enable과 동시에 들어오고요.
(타이머 설정에 따라 1초에 100번에서 1000번까지 나오게도 할 수 있습니다.
설정할려면 timer에 in, out 명령을 내려줘야 하고요. BIOS의 디폴트 설정치가 초당 18.2회죠.)
추가로 하드웨어 인터럽트(IRQ)는 I/O 명령으로 8259A칩의 설정을 바꿔서 막는것도 있습니다.
리눅스 커널소스를 보셨다면 port 0x20, 0x21, 0xa0, 0xa1으로 in, out 명영을 내리는 부분이 있는데
이부분이 하드웨어 인터럽트를 막고 푸는 8259A I/O 부분입니다.
리얼모드와 보호모드 간을 전환할 때는 위 두가지 방법을 병행해서 인터럽트를 막습니다.
Written By the Black Knight of Destruction
댓글 달기