이 질문은 인터럽트 처리 주제입니다.첫 번째 인터럽트 작업이 완료되기 전에 다른 인터럽트가 발생하면 어떻게됩니까?
인터럽트가 처리되고 있다고 가정합니다. 첫 번째 인터럽트 작업이 완료되기 전에 다른 인터럽트가 발생하면 어떻게됩니까?
이 질문은 인터럽트 처리 주제입니다.첫 번째 인터럽트 작업이 완료되기 전에 다른 인터럽트가 발생하면 어떻게됩니까?
인터럽트가 처리되고 있다고 가정합니다. 첫 번째 인터럽트 작업이 완료되기 전에 다른 인터럽트가 발생하면 어떻게됩니까?
첫 번째 인터럽트 이후 인터럽트가 비활성화되지 않은 경우 두 번째 인터럽트 서비스 루틴이 다시 호출됩니다. 이 명백하게 바람직하지 않은 동작을 피하려면 인터럽트를 비활성화해야합니다.
그래서 인터럽트 서비스 루틴이 그 일을하고 있고 또 다른 인터럽트가 발생하면 다른 작업을 수행하는 것과 같습니다. 해당 인터럽트 루틴이 호출됩니다.
인텔 아키텍처에서 "cli"명령어는 인터럽트를 비활성화하고 "sti"는 다시 활성화합니다.
시스템에 따라 다릅니다. 일반적으로 새 인터럽트가 첫 번째 인터럽트보다 우선 순위가 높으면 첫 번째 인터럽트에 대한 처리기를 일시 중단합니다. 처리기가 끝나면 원래 인터럽트 처리기가 다시 시작됩니다. 마지막으로 인터럽트가 더 이상 없다고 가정하면 원래 처리기가 완료되고 정상적인 서비스가 다시 시작됩니다. 때로는 재개 된 프로세스가 인터럽트 된 프로세스가됩니다. 때로는 가장 적합한 프로세스가 아니며 다른 프로세스가 재개됩니다.
마찬가지로 첫 번째 처리기가 완료되기 전에 원래 인터럽트의 두 번째 또는 후속 인스턴스가 발생하거나보다 낮은 우선 순위의 인터럽트가 발생하면 첫 번째 처리기가 완료 될 때까지 유지됩니다. 정상적인 처리가 재개되기 전에, 커널은 처리 되었어야 만했던 차단되지 않은 인터럽트를 검사합니다.
인터럽트 처리기는 다른 인터럽트를 차단할 수 있습니다.
다음은 x86 아키텍처에 적용되지만, 다른 아키텍처가 아니라 같은 패턴을 따른다 수 있습니다
하드웨어 인터럽트 처리, 또는 할 수 있는지 여부를 제어IF
(인터럽트 플래그)라는 프로세서 플래그가 있습니다
보류해라. IF = 0 일 때 플래그가 다시 활성화 될 때까지 인터럽트가 연기됩니다 (차단할 수없는 '응급 전용'인터럽트로 의도 된 마스크 불가능 인터럽트 인 NMI 제외).
IF
은 인터럽트 서비스 루틴이 호출되기 전에 프로세서에서 자동으로 지워집니다. 이것은 인터럽트 호출이 제어 불능으로 재진입하는 것을 막기 위해 필요합니다. 루틴에 들어가기 전에 IF
이 비활성화되지 않았다면 서비스 코드가 단일 명령어라도 실행하기 전에 더 많은 인터럽트가 발생할 수 있기 때문에 인터럽트 서비스 코드 자체는이를 수행 할 수 없다는 점에 유의하십시오. 그런 다음 인터럽트의 "파이어 호스 (firehose)"는 즉시 (모든 것 중) 스택 오버플로를 초래합니다.
직접적인 질문에 대한 답변 : 일반적으로 초기 하드웨어가 중단되는 동안 두 번째 하드웨어 인터럽트가 발생하면 첫 번째 하드웨어 인터럽트가 완료 될 때까지 해당 인터럽트가 보류됩니다.
평소처럼 전체 기사는 약간 더 복잡합니다. Intel의 웹 사이트에있는 Intel Architecture Software Developer’s Manual은 10-4 페이지에서부터 더 자세하게 설명합니다.