이것이 나의 이해이다:
- 사용자 모드에서 트랩/시스템 호출이 발생하면 레지스터는 커널 스택에 저장되고 커널 모드로 전환되며 트랩을 처리하고 사용자 모드로 돌아갑니다.
- 사용자 모드에서 타이머 인터럽트가 꺼지면 레지스터를 다시 저장하고 커널 모드로 전환하고 스케줄러에 따라 다른 프로세스를 예약한 후 이제 사용자 모드로 돌아가 두 번째 프로세스를 실행합니다.
그러나 프로세스 1이 이미 커널 모드에 있고 타이머 인터럽트가 꺼지면 어떻게 될까요? 그러면 어떻게 되나요?
답변1
일반적으로 말하면(리눅스 커널이 이것을 어떻게 구현하는지 정확히 모르겠습니다) 인터럽트가 트리거되면 실행 중인 코드가 중지되고 모든 레지스터가 저장되며 CPU는 인터럽트를 처리하는 인터럽트 서비스 루틴을 실행합니다. 그런 다음 레지스터가 복원되고 코드 실행이 계속됩니다.
이러한 상황을 방지하는 유일한 방법은 인터럽트를 비활성화하는 것입니다. 인터럽트는 일반적으로 원자성 작업을 처리하기 위해 마이크로 컨트롤러에서 수행됩니다. 일반적으로 인터럽트 서비스 루틴이 수행하는 첫 번째 작업은 인터럽트를 비활성화하는 것입니다(그래서 자체적으로는 중단될 수 없음). 작업을 완료한 후 마지막으로 수행하는 작업은 인터럽트를 다시 활성화하는 것입니다.
다시 말하지만 저는 Linux 커널에서 인터럽트 서비스 루틴의 정확한 구현에 익숙하지 않지만 동일한 방식으로 작동할 것으로 기대합니다.
x86 아키텍처에서 사용자 모드에서 커널 모드로의 모드 전환은 여기서는 발생하지 않을 것 같습니다. 이는 ISR이 커널 모드에서 실행되어 CPU가 커널 모드로 전환해야 한다고 가정하면 피할 수 있습니다. 이미 커널 모드에 있다면 레지스터를 저장하고 ISR로 점프하세요. 그런 다음 중단 이전에 실행 중이던 코드가 무엇이든, 코드가 실행 중이던 모드에서 다시 시작합니다.