Freigeben über


А что, собственно, происходит, когда бросается исключение?

???, ?? ? ????? ?????? ??????? - ????????? ?????????? ??????????, ???????????? ??????? ??????? ?????? ?????????? ? ???????? ???. ? ??? ??????????, ???? ?????????? ?????????? ? Windows ?????????? ???????? ?????????.

???????? ????? ??????, ????????? ???????? ??????????? ?????????? ?????? ??????????, ???????????? ?? ?????????? ? ??? ????????? ???????, ???????? ?? ???????????? ?????????? ????. ? ?????? ???? ??????? ?? ????? ???? ????????? (??????? ?? ????, ????????? ? ?????????????? ????????, ?????????????? ?????? ?????????? ? ?.?.), ????????? ?????????? ?????????? – ???????? ???? ?? ????????????, ?????????????????? ???????????? ???????? ? IDT (Interrupt Dispatch Table).

 

??? ?????? ??????????? ????????? ?????? ????? ????????? ?????: ????????????? ? ????? ???? (Ring 0), ??????????? ????????? ????? ?? ??????? ???? ? ????????? ?????????? ????????? ?????? ? ????? ? ??????? ?????.

Transition to Ring0

??????? ????????, ?????????? ?????????? ????????? ????????? ???????? ?????????? ? ????? ? ????????? ????????, ??????????? ??? ??????????? ??????????. ????????, ?????????? Page Fault Exception ??????????? ???????? ???????? ? Memory Manager. ???? ??????????? ??????? ????????? ????????, ????????? ????????? ??????????, ?????????? ??????????????? ??????????? ????????? ?????????? ? ????????? ??????? ? ???????????????? ??? (Ring 3). ? ????????? ??????, ? ???? ???????? ????????? ??????????.

????????? ?????????? ????????? ????????? CONTEXT ? ???????????????? ????? ? ???????? ???? ??????????? ????????? ????????? ?? ???????? ?????. ???? ?? ??????????? ??????? ????????? Floating Point ?????????. ?????????? ?? ?????????? ???????????? ? ????????? EXCEPTION_RECORD. ?????, ????????? ????????? ????? ???????? ? ???????????????? ??? ??????? ?????????? ?????????? ????????????????? ?????? ? ????????? ??????? ? Ring 3.

Windows ???????????? ??????????? ?????????, TEB (Thread Environment Block), ??? ???????? ????????? ?????? ??????. ??? ????????? ???????? ?? Ring 3 ????? ??????? FS (??? GS ??? x64). ? ????? ?????? ???? ????????? ???????? ????????? ?? ?????? ????????? ?????? “__try” ? ??????????????? ?? ?????? “__except” ? “__finally”. ?????????? ?????????? ???, ??????????? ??????? ? ???? ?????? ??? ????? ? ???? “__try” ? ????????? ??? ?????? ?? ?????. (??????????: ??????????? ?????? ??? x86. 64-? ?????? ???
“????????????” ???? ????????? ??????????????? ???????????? ?????????
????.)

Transition to Ring0

??????? ??????????, ????????? ?????????? ????????????????? ?????? ?? ??????? ?????????? ??????????? ?? ??????, ???????? ??????? ?? ??? ?????????? ?????? ??????????. ????? ??????????, ????????????? ?????????? ??????????, ????????? ?????????? ????????? «?????????» ????? (Stack Unwinding) ? ???????? ?????????? ?????????? ???????????. ???? ???????? ???????? ???????? ?????????? ?? ???????????? ??????? ? ???, ??? ???????? SEH (Structured Exception Handling) (???????? ????? ??? ?????), ??? ??? ? ?? ???? ??????????????? ?? ???? ????????. «??????????» ????? ??????????? ??????? ????????? (????????? ????? ? ??????, ????????? ?????????) ? ????????? ????? ????????? CONTEXT. ?? ????????? ????????? ??????????, ????????? ?? ????????? CONTEXT ??????????? ? ?????????, ???????? ????????? ??????????.

? ??? ?????? ????????????? ????????. :-)

Cross-posted from blog.not-a-kernel-guy.com.