2009-05-31 1 views

답변

0

첫 번째 인터럽트 이후 인터럽트가 비활성화되지 않은 경우 두 번째 인터럽트 서비스 루틴이 다시 호출됩니다. 이 명백하게 바람직하지 않은 동작을 피하려면 인터럽트를 비활성화해야합니다.

그래서 인터럽트 서비스 루틴이 그 일을하고 있고 또 다른 인터럽트가 발생하면 다른 작업을 수행하는 것과 같습니다. 해당 인터럽트 루틴이 호출됩니다.

인텔 아키텍처에서 "cli"명령어는 인터럽트를 비활성화하고 "sti"는 다시 활성화합니다.

2

시스템에 따라 다릅니다. 일반적으로 새 인터럽트가 첫 번째 인터럽트보다 우선 순위가 높으면 첫 번째 인터럽트에 대한 처리기를 일시 중단합니다. 처리기가 끝나면 원래 인터럽트 처리기가 다시 시작됩니다. 마지막으로 인터럽트가 더 이상 없다고 가정하면 원래 처리기가 완료되고 정상적인 서비스가 다시 시작됩니다. 때로는 재개 된 프로세스가 인터럽트 된 프로세스가됩니다. 때로는 가장 적합한 프로세스가 아니며 다른 프로세스가 재개됩니다.

마찬가지로 첫 번째 처리기가 완료되기 전에 원래 인터럽트의 두 번째 또는 후속 인스턴스가 발생하거나보다 낮은 우선 순위의 인터럽트가 발생하면 첫 번째 처리기가 완료 될 때까지 유지됩니다. 정상적인 처리가 재개되기 전에, 커널은 처리 되었어야 만했던 차단되지 않은 인터럽트를 검사합니다.

인터럽트 처리기는 다른 인터럽트를 차단할 수 있습니다.

4

다음은 x86 아키텍처에 적용되지만, 다른 아키텍처가 아니라 같은 패턴을 따른다 수 있습니다

하드웨어 인터럽트 처리, 또는 할 수 있는지 여부를 제어 IF (인터럽트 플래그)라는 프로세서 플래그가 있습니다

보류해라. IF = 0 일 때 플래그가 다시 활성화 될 때까지 인터럽트가 연기됩니다 (차단할 수없는 '응급 전용'인터럽트로 의도 된 마스크 불가능 인터럽트 인 NMI 제외).

IF은 인터럽트 서비스 루틴이 호출되기 전에 프로세서에서 자동으로 지워집니다. 이것은 인터럽트 호출이 제어 불능으로 재진입하는 것을 막기 위해 필요합니다. 루틴에 들어가기 전에 IF이 비활성화되지 않았다면 서비스 코드가 단일 명령어라도 실행하기 전에 더 많은 인터럽트가 발생할 수 있기 때문에 인터럽트 서비스 코드 자체는이를 수행 할 수 없다는 점에 유의하십시오. 그런 다음 인터럽트의 "파이어 호스 (firehose)"는 즉시 (모든 것 중) 스택 오버플로를 초래합니다.

직접적인 질문에 대한 답변 : 일반적으로 초기 하드웨어가 중단되는 동안 두 번째 하드웨어 인터럽트가 발생하면 첫 번째 하드웨어 인터럽트가 완료 될 때까지 해당 인터럽트가 보류됩니다.

평소처럼 전체 기사는 약간 더 복잡합니다. Intel의 웹 사이트에있는 Intel Architecture Software Developer’s Manual은 10-4 페이지에서부터 더 자세하게 설명합니다.