2011-10-29 2 views
3

디버거의 중단 점에 사용되는 인터럽트 명령어 인 "int 3"이 있습니다.왜 X86에서 단일 스테핑 지시가 필요합니까?

하지만 단일 스테핑에 사용되는 "int 1"도 있습니다. 그러나 이것이 왜 필요한가? 나는 EFLAGS 레지스터의 트랩 플래그 (TF) 설정이 단일 스테핑을 가능하게하고 각 명령에 대해 OS에 함정에 빠질 것이라고 읽었습니다. 그렇다면 별도의 인터럽트 유형이 필요한 이유는 무엇입니까?

감사합니다.

답변

8

int 3은 특수한 1 바이트 인터럽트입니다. 디버거를 호출하면 디버거가 중단됩니다. 그렇지 않으면 응용 프로그램이 일반적으로 중단됩니다.

디버거가 트랩 플래그를 설정하면 프로세서가 모든 명령어마다 자동으로 int 1 인터럽트를 실행합니다. 이를 통해 int 3 명령어를 삽입하지 않고도 디버거가 명령어별로 단일 단계를 수행 할 수 있습니다. 이 인터럽트를 명시 적으로 호출 할 필요는 없습니다.

5

INT 및 INT 3 명령어는 명령어가 호출 될 때 호출되는 인터럽트 벡터와 혼동 스럽습니다. 단일 단계 명령이 없습니다.

INT 3 (또는 "중단 점 명령")이 있으면 디버거를 호출합니다 (또는 INT 3이 발생하면 디버거가 호출되도록 디버거가 INT 3 벡터를 후킹합니다).

디버거가 TF (추적 플래그)를 설정하면 모든 명령어가 # 1 인터럽트를 발생시킵니다. 이렇게하면 해당 인터럽트 벡터에있는 주소가 호출됩니다. 바라건대, 이것은 디버거의 단일 단계 루틴이 될 것입니다. 결국 디버거는 TF를 지우고 단일 단계 인터럽트를 중지시킵니다.

+2

실제로 int 3은 별도의 명령으로 분류해야합니다. 이것은 2 바이트 INT 명령 (0xCD) 대신에 단일 바이트 (0xCC)이기 때문입니다. – Timoteo

+0

네 말이 맞아. 나는 잊어 버렸었다. –

2

다른 사람들은 이미 인터럽트 벡터 1과 int 3 명령어의 차이점을 설명했습니다.

디버그 인터럽트를 처리하는 데 방해되는 여러 인터럽트 벡터가있는 이유가 궁금하다면 원래의 8086/8088 회로가 상대적으로 단순하고 상대적으로 간단한 소프트웨어를 실행하려고했기 때문이라고 생각합니다. 그것은 아주 적은 특수한 인터럽트 벡터를 가지고 있었고 int 벡터 1은 단일 단계 트랩에만 사용되고 브레이크 포인트 트랩과 구별하는 것은 인터럽트 벡터 번호에 의해 간단했습니다. 벡터 1과 3입니다. 그 설계는 뒤 따르는 x86 CPU로 이월되었습니다. 새 CPU는 새로운 예외를 처리하기 위해 특수 인터럽트 벡터 세트를 실질적으로 약 20 개까지 "신속하게"확장하고 원래의 단일 단계 트랩 위에 다른 유용한 인터럽트 벡터 1 트리거를 추가하여 디버깅 기능을 확장했습니다 (예 : 명령어 페치 , 메모리/포트 I/O, 작업 스위치 등). 관련이 있고 더 많은 벡터를 소비하지 않기 때문에 대부분의 벡터가 같은 인터럽트 벡터에 저장되는 것이 합리적입니다.

1

int 3은 특정 지점 (중단 점)에 도달 할 때까지 코드가 자유롭게 실행될 수 있도록 중단 점을 설정하는 데 사용됩니다. 이렇게하면 디버깅 프로세스가 빨라지므로 잘 알려진 코드를 트래핑 할 필요가 없습니다.

int 1은 모든 명령 이후에 무조건적으로 정지하는 데 사용됩니다. 조건부 분기 명령이 실행되고 상태 플래그의 조건을 알 수없는 경우에 유용 할 수 있습니다. 그렇지 않으면 브랜치 주소와 브랜치 다음의 명령어 주소에 브레이크 포인트를 설정해야합니다.

int 1은 보드 하드웨어 및 전원 공급 장치가 모두 새 것으로 테스트되지 않은 상태에서도 보드에서 사용할 수 있습니다.

+0

다른 답변에없는이 새로운 추가 기능이 마지막 단락 인 것처럼 보입니다. 마지막 매개 변수는 다른 답변에 대한 제안 된 편집으로 잘 작동합니다. (예, 새로운 사용자가 실제로 유용하거나 흥미로운 것을 추가 할 때 허용됩니다.) –

관련 문제