2013-04-13 3 views
1

보호 오류를 생성하는 일부 코드를 테스트 할 때 오류가 발생했습니다. 내 예외 처리기를 설치하여 EIP 및 스택이 기본 CPU의 표준 동작을 변경하지 않을 것으로 예상하도록했습니다. 그러나 QEMU에서 ESP와 EIP는 모두 오류 생성 시간에 변경됩니다.QEMU 예외 처리

OS는 32 비트이므로 오류 케이스는 CS 세그먼트에서 점프와 관련됩니다. QEMU 코드를 파고 들자면, raise_exception_error가 helper_ret_protected 내에서 호출 된 후 EIP와 ESP가 설정되어있는 것처럼 보입니다. 그래서, 나는 왜 내가 손님에게서 다른 행동을하고 있는지 이해할 손실이있다.

QEMU가 예외를 생성하는 방법을 이해하지 못했지만 ret_protected 메서드를 호출 한 후에 다른 단계가 발생합니까?

답변

0

CPU가 권한 수준 경계를 넘을 때 스택을 전환합니다. TSS에는 따라서 각 레벨에 대해 SSESP 개의 항목이 포함되어 있습니다. 오류를 유발하는 코드가 사용자 모드 코드에있는 경우 스택이 변경됩니다. SS:ESP 값은 TSS의 ss0ebp0 필드에서 읽습니다.

저는 "EIP이 변경되지 않을 것으로 예상합니다"라는 의미에 대해 확신하지 못합니다. 코드가 다음 큰 CS를 할당하고

+0

... 당신은 정답을 찾는 데 도움이 될 문제에 대한 자세한 내용을 제공 할 수 있다면

는 CS 외부에서 토지 징벌을 수행합니다. 코드가 CS 제한을 초과하여 일반 보호 오류가 발생합니다. 네이티브 CPU에서 GPF가 트리거되면 EIP는 CS 내의 오류있는 명령어를 가리 킵니다. 따라서 예외 처리기에서 오류 처리 명령 (QEMU)을 얻을 수 있습니다. EIP는 CS 외부에 있으며 오류 처리 명령을 가리 키지 않습니다. 그게 더 명확 해? – anandb

+0

@anandb 훨씬 명확합니다. 감사! 어쨌든 평면 세그먼트를 사용하지 않기로 결정한 이유가 있습니까? 베어 메탈에서 테스트 했습니까? 디버깅 (특히 스택 검사)은 어떻습니까? 문제의'ret' 명령은 * PMode * 로의 전환과 관련이 있습니까? – Powerslave

+0

BTW, 잘 기억한다면, 예외 스택에있는'EIP'는'CS'에서 제어를 시작한'ret'를 가리키는 것이 아니라 실제 오류 주소 인'CS'에서 나온 것입니다. 너를 오해하고, 그 행동이 나에게 맞는 것 같다. – Powerslave