RFE(Return with Exception)는 커널 모드에서 사용자 모드로 전환하는 데 도움이 되는 특권 명령이라는 것을 읽었습니다.
특권 명령어이기 때문에 실행 중에 소프트웨어 인터럽트(트랩)가 생성됩니다.
실행 중에 커널이 중단되지 않도록 다른 모든 인터럽트나 인터럽트 활성화 플래그가 실행 중에 비활성화되는지 알고 싶습니다. 소프트웨어 인터럽트 중에 인터럽트가 비활성화됩니까?
답변1
면책조항: 저는 Motorola 68000의 OS 레벨 코드로만 작업했습니다. 이 답변은 유사한 2링 시스템의 관점에서 작성되었지만 개념은 현대 다중 링 시스템으로 잘 변환되어야 합니다.
사용자 모드와 시스템 모드라는 두 가지 권한 수준이 있는 시스템에서 응용 프로그램은 사용자 모드에서 실행되고 커널은 시스템 모드에서 실행됩니다. 사용자 모드 응용 프로그램이 권한 있는 명령을 실행하려고 하면 커널이 상황을 처리하는 방법을 결정할 수 있도록 트랩이 발생합니다.
반면에 커널은 원하는 명령을 실행할 수 있는 권한을 이미 갖고 있으므로 트랩이 실행되지 않습니다.
특히 MC680x0에서는 모든 트랩 처리기가 기본적으로 권한 모드에서 실행됩니다. 따라서 모든 트랩 핸들러는 영향을 주지 않고 또 다른 트랩 생성에 대한 걱정 없이 "예외에서 복귀"를 사용할 수 있습니다. 사용자 모드 코드에서는 예외가 반환될 수 없으므로 이러한 명령어를 사용해서는 안 됩니다.
간단히 말해서, 이 문제는 "예외 반환"을 사용하여 사용자 모드로 전환하면 트랩이 생성되지 않는다는 잘못된 전제에서 비롯됩니다.
답변2
프로세서 모드 간 전환이 작동하는 방식은 프로세서 아키텍처에 따라 다릅니다. 그러나 원하는 경우 커널 모드에서 사용자 모드로 전환하라는 명령이 있을 것으로 예상하지만 RFE의 본질은 돌아가서 모드를 변경하는 것보다 점프하고 모드를 변경하는 데 더 가깝습니다. 이것을 "소프트웨어 인터럽트"로 생각하는 것도 인터럽트 핸들러를 실행하지 않기 때문에 오해의 소지가 있습니다.
인터럽트를 비활성화할지 묻는 것은 명령이기 때문에 실제로 의미가 없습니다. 커널이 이미 실행을 중지하기로 결정했기 때문에 이 시점의 인터럽트로 인해 커널이 "중단"되지는 않습니다. 사용자 모드는 인터럽트가 비활성화된 상태로 실행되어서는 안 되기 때문에 커널은 항상 사용자 모드로 돌아가기 전에 인터럽트를 활성화합니다. 이는 서비스 거부가 됩니다. 프로세서가 RFE 명령을 실행하기 위해 여러 사이클을 사용하는 경우 프로세서는 해당 사이클 중 일부 동안 인터럽트를 확인하지 못할 수 있지만 이는 소프트웨어가 관찰할 수 없는 프로세서 아키텍처의 세부 사항입니다(세밀한 타이밍 측정을 통한 경우 제외).