2016-11-09 3 views
1

인텔 매뉴얼 3A 6 장 인터럽트 및 예외 처리를 읽었습니다.소프트웨어 생성 인터럽트와 소프트웨어 생성 예외의 차이점은 무엇입니까?

인터럽트와 예외는 각각 3 소스를 가지고있다.

소프트웨어 생성됨 인터럽트를 들어, 메시지 :

INT 않음 명령 허가를 피연산자로 인터럽트 벡터 수를 공급하여 소프트웨어 내에서 생성되는 인터럽트. 예를 들어, INT (35)는 명령이 명령의 파라미터로 사용될 수 0 255에서 인터럽트 (35)는 인터럽트 벡터에 대한 상관 인터럽트 핸들러 암시 호 강제. 프로세서의 소정 NMI 벡터가 사용되는 경우는 통상의 방식으로 생성 인터럽트 NMI 로되는 바와 같이, 그러나, 의 반응은, 상기 프로세서는 동일하지 않을 것이다. 벡터 번호 2 (NMI 벡터)가이 명령어에 사용되면 NMI 인터럽트 핸들러는 이 호출되지만 프로세서의 NMI 처리 하드웨어는 활성화되지 않습니다. EFLAGS 레지스터에있는 INT 않음 명령어와 소프트웨어에서 발생하는 인터럽트 은 IF 플래그에 의해 마스킹 될 수 없다.

INTO, INT (3), 및 BOUND 명령 허가 예외 소프트웨어에서 생성 될 : 소프트웨어 생성 된 예외

, 그것은 말했다. 이 명령어는 명령어 스트림의 포인트에서 예외 조건이 수행되는지 확인합니다. 예제의 경우 INT 3은 중단 점 예외를 생성합니다. INT n 명령어는 소프트웨어에서 예외를 에뮬레이션하는 데 사용할 수 있습니다. 하지만 거기에 제한이 있습니다. INT n이 구조적으로 정의 된 중 하나의 벡터를 제공하는 경우 프로세서는 올바른 벡터에 대한 인터럽트를 생성하지만 (예외 처리기에 액세스하기 위해) 은 스택에서 오류 코드를 푸시하지 않습니다. 연관된 하드웨어가 정상적으로 생성 된 예외 에러 코드를 생성해도 마찬가지이다. 예외 처리기는 여전히 예외를 처리하는 동안 스택에서 오류 코드 을 팝하려고 시도합니다. 오류 코드가 푸시되지 않았기 때문에 처리기가 튀어 나와 대신 EIP를 삭제합니다 (누락 된 오류 코드의 자리에 있음). 그러면 잘못된 위치로 반송됩니다.

그래서, 차이점은 무엇입니까? 두 가지 모두는 int n 명령을 활용합니다. 어셈블리 코드에서 예외 또는 인터럽트를 생성하는지 여부를 어떻게 알 수 있습니까?

+0

보호 모드 운영 체제를 쓰는 사람에게만 중요한 애매한 세부 사항입니다. 언급했듯이, 그는 n <32 인 INTn이 예외를 생성하거나 인터럽트 처리기가 오작동하는 것을보다 잘 방지해야합니다. 게이트가 링 전환 (일컬어 DPL

답변

2

x86 아키텍처에서 예외는 명목상 인터럽트 처리기로 인터럽트로 처리됩니다.
그래서 인터럽트와 예외는 겹치는 용어이고 후자는 전자의 일종입니다.

0 ~ 31까지의 인터럽트 번호는 예를 들어 인터럽트 번호 0이 #DE (나누기 오류)이고 인터럽트 번호 13이 #GP (일반 보호)입니다.

CPU가 예외를 발생시켜야하는 조건 (예 : 존재하지 않는 페이지에 대한 액세스)을 감지하면 일련의 작업을 수행합니다.

처음에는 필요에 따라 오류 코드를 푸시하지만 일부 예외 (예 : #PF 및 #GP)와 일부 (#DE와 유사)는 수행하지 않습니다.
Intel manual 2의 6.15 절에는 모든 예외와 그 최종 오류 코드가 나열되어 있습니다.

두 번째로 멀리 호출과 같은 적절한 인터럽트 핸들러를 "호출"하지만 EFLAGS이 스택에 푸시됩니다.

int n에만 두 번째 단계는,이 인터럽트를 호출하지만 처음에 하드웨어 오류 조건이 없기 때문에 오류 코드를 밀어하지 않습니다 (그리고 int n 때문에 오류 코드의 개념 전에 있었다).
을 사용하면 예외를 에뮬레이트 할 수 있으므로 소프트웨어는 결국 적절한 오류 코드를 푸시해야합니다.

코드에 int n이 표시되면 이 아니며이 아니며 예외입니다. 인터럽트는 결국 제어 흐름을 특정 OS 예외 핸들러로 조종하는 데 사용됩니다.


퀴즈 :이 CC로 인코딩되기 때문에 int 3가 (정상 int nCD imm8 인) 하나의 바이트 인 특별하다. 이것은 디버거가 코드 세그먼트의 어느 위치 에나 둘 수 있기 때문에 디버깅에 유용합니다.
intoOF = 1 인 경우에만 #OF 예외를 생성합니다.

+0

많은 감사. 내 이해가 지금이므로 예외 * 오류 코드가있을 수 있습니다. 인터럽트 *는 * 않습니다. 예외는'Fault','Trap','Abort'로 분류 할 수 있습니다. 그리고 벡터 0 ~ 31을 모두 검사했는데이 3 가지 유형 중 하나에 속하지만 벡터 3은 NMI, 인터럽트입니다. 예외는 프로세서 내부에서 발생하는 반면 프로세서 외부에서는 인터럽트입니다. – smwikipedia

+0

BTW,'imm8 '은 무엇을 의미합니까? 그리고 왜 싱글 바이트 코딩이되어서'int 3'가 코드 세그먼트의 어느 곳에 나 위치 할 수 있습니까? – smwikipedia

+1

@smwikipedia * imm8는 * 8-bit immediate *를 의미하므로, 예를 들어'CD 21'은'int 21h','CD 67'은'int 67h'입니다. 미안, 그걸 분명히하지 않았어. 'int 3'에 대해서는 Intel을 인용하여 대답 할 수 있습니다. "*이 1 바이트 형식은 어떤 명령어의 첫 번째 바이트를 중단 점으로 대체 할 수 있기 때문에 유용합니다. ** 다른 1 바이트 명령어 **를 포함하지 않고 다른 코드를 덮어 쓰기 * ". 어느 쪽이 나 답장에서 나쁘게 표현 될지도 모릅니다. –