Да, действительно...накопипастился я с сегментом кода.... Я вот понял, что для сегмента кода надо просто джамп выполнить...по крайней мере в Линухе в kexec.h так и делается...простой джамп и переназначение всех сегментов данных и стека! Code (Text): ...................... jmp init_cs init_cs: mov eax, 8 ;for data mov ds, eax mov ax, 16 ;for stack mov ss, eax ......................
Так оно. Однако, к примеру, в CS тоже кэшируется дескриптор из GDT, но, тем не менее, при вызове исключения, даже если селектор в дескрипторе IDT тот же самый, что и у текущего сегмента кода - все равно происходит обращение к GDT, проверял. Может быть и с LDT то же самое, тут смотреть надо.
И еще по поводу LDT. В принципе пох - будет проц обращаться к GDT при вызове исключения с селектором в LDT или нет. Можно сделать точно так же как и к с GDTR - записать в LDTR заведомо невалидное значение - к примеру нулевой селектор.
тут такайа ситуацийа, что при вызове исключения проц должен взять из гдт (другие варианты пока не рассматриваем) базу (ну и лимит наверно для проверки) из дескриптора, номер которого содержецо в селекторе, указанном в идт дескрипторе, а для этого надо обратится к гдт, а обращение происходит не без участия гдтр. при чем сомневаюсь, что при этом происходит сравнени cs и селектора из идт, да и не логична такая проверка, ведь в cs важна его теневая часть. другое дело когда селектор в идт указывает на дескриптор из лдт.. тогда вся инфа извлекаецо из лдт, а в манах интела написанно четко, что "the ldtr register holds the 16-bit segment selector, base address...., segment limit, and descriptor attributes for the ldt", т.е. не обязательно обращацо к гдт, чтоб получить лдт ))
правельно.. 0 селектор поидее невалидный, поэтому просто ldtr становецо невалидный.. другое дело есле селектор валидный... тогда уж надо чтоб он указывал на дескриптор лдт... естественно надо lldt делоть перед тем как портить gdtr
плохая антиотладка. легко обнаружить. то же самое что и перезаписть IDT. lgdt/lidt/sgdt/sidt легко обнаружить как в дизасме так и в отладчике.
Ага, обнаружить легко. А вот бороться с этим уже не так просто. К примеру - исследуемый код создает GDT, в которой определены несколько сегментов данных и потом активно работает с данными из этих сегментов.