2012-05-05 4 views
3

IRET는 EFLAGS, ESP, EIP 등을 포함하여 스택에서 레지스터를 복원 할 수 있지만 레지스터를 모두 스스로 복원 할 수도 있습니다. 예를 들어 "movl"은 % esp 레지스터를 복원하는 데 사용될 수 있고 "jmp"는 스택에 저장된 EIP를 가리키는 주소를 점프 할 수 있습니다.인터럽트에서 복귀 할 때 IRET을 사용해야합니까?

리눅스 커널은 가중치 명령 인 IRET에 의한 모든 인터럽트로부터 복귀합니다.

일부 커널 작업 (컨텍스트 스위치와 같은)은 자주 발생합니다.

IRET을 낭비하지 않습니까?

+0

"체중 조절"이란 무엇입니까? –

+0

명령은 많은 작업을 수행하며 많은 비용이 듭니다. –

답변

9

POPF+RETF의 단순한 블렌드 이외에 모든 무거운 물건 외에도 IRET을 할 수 있고 종종해야합니다. 비 마스크 가능 인터럽트 (NMIs)과 관련된 특수 기능을 가지고 있습니다.

동시 NMI가 하나씩 CPU에 전달됩니다. IRET은 이제 다른 NMI가 전달 될 수있는 NMI 회로에 신호를 보냅니다. 다른 어떤 명령도이 신호를 처리 할 수 ​​없습니다. NMI가 다른 NMI ISR의 실행을 선점 할 수있는 경우 스택 오버플로가 발생할 수 있으며 이는 드물게 좋은 일입니다. 우리가이 멋진 웹 사이트에 대해 이야기하지 않는 한. :)

따라서 전체적으로 IRET은 낭비가 아닙니다.

+0

인터럽트에서 돌아올 때 IRET 만 사용할 수 있다는 의미입니까? –

+0

경우에 따라 유일한 선택입니다. NMI가 그 중 하나입니다. 인터럽트/예외 작업을 사용하면 다른 작업이됩니다. 이중 결함 핸들러는 태스크 여야합니다. 게다가 IRET은 제어권을 덜 특권 코드로 이전하는 데 매우 유용합니다 (예를 들어 사용자 모드 콜백을 실행하기 위해). 그것이 있다면, 그것을 사용하지 않는 이유는 무엇입니까? –

+0

: "PIC에서 인터럽트를 보내면 PIC는 I/O 포트를 통해 확인 응답을받을 때까지 동일한 소스에서 다른 인터럽트를 보내지 않습니다." 현재 인터럽트 처리기가 완료되었거나, IRET 또는 다른 것을 알리는 사람은 누구입니까? –

0

아마도 수동으로 수행하려면 더 많은 CPU 클럭이 필요하기 때문일 수 있습니다. wikipedija에서

0

:

인터럽트가 인터럽트 서비스 루틴 (ISR)라고 발생할 때 호출되는 실제 코드입니다. 예외가 발생하면 프로그램이 인터럽트를 호출하거나 하드웨어가 인터럽트를 발생 시키면 프로세서는 여러 가지 방법 중 하나를 사용하여 컨트롤을 ISR로 전송하고 ISR은 컨트롤 을 안전하게 반환 할 수 있도록합니다. 실행 후 중단 된 모든 것이 완료됩니다. 최소 FLAGS 및 CS : IP가 저장되고 ISR의 CS : IP가로드됩니다. 그러나 일부 메커니즘은 ISR이 (및 끝날 때 다른 작업 스위치)을 시작하기 전에 전체 작업 스위치를 발생시킵니다.

그래서 IRET은 낭비가 아니며 최소한 ISR에서 반환하는 것이 가장 빠릅니다. 또한 ISR에서 사용되는 다른 모든 CPU 레지스터는 시작시에 보존되어야하며 IRET 기소 전에 보존되어야합니다!

관련 문제