Fault при перезагрузке GDT в защищенном режиме

Тема в разделе "WASM.OS.DEVEL", создана пользователем KonstantinBart, 6 дек 2007.

  1. KonstantinBart

    KonstantinBart New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2007
    Сообщения:
    20
    Да, действительно...накопипастился я с сегментом кода....:)
    Я вот понял, что для сегмента кода надо просто джамп выполнить...по крайней мере в Линухе в kexec.h так и делается...простой джамп и переназначение всех сегментов данных и стека!

    Код (Text):
    1. ......................
    2.         jmp init_cs
    3. init_cs:        
    4.  
    5.         mov eax, 8   ;for data
    6.         mov ds, eax
    7.  
    8.         mov ax, 16  ;for stack
    9.         mov ss, eax
    10. ......................
     
  2. KonstantinBart

    KonstantinBart New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2007
    Сообщения:
    20
    Как раз и возникает triple fault....тестировал без всякой отладки на виртуальной машине...
     
  3. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    Так оно. Однако, к примеру, в CS тоже кэшируется дескриптор из GDT, но, тем не менее,
    при вызове исключения, даже если селектор в дескрипторе IDT тот же самый, что и у текущего сегмента кода - все равно происходит обращение к GDT, проверял. Может быть и с
    LDT то же самое, тут смотреть надо.
     
  4. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    А я на реальной ;)
     
  5. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    И еще по поводу LDT. В принципе пох - будет проц обращаться к GDT при вызове исключения с селектором в LDT или нет. Можно сделать точно так же как и к с GDTR - записать в LDTR заведомо невалидное значение - к примеру нулевой селектор.
     
  6. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    тут такайа ситуацийа, что при вызове исключения проц должен взять из гдт (другие варианты пока не рассматриваем) базу (ну и лимит наверно для проверки) из дескриптора, номер которого содержецо в селекторе, указанном в идт дескрипторе, а для этого надо обратится к гдт, а обращение происходит не без участия гдтр. при чем сомневаюсь, что при этом происходит сравнени cs и селектора из идт, да и не логична такая проверка, ведь в cs важна его теневая часть.
    другое дело когда селектор в идт указывает на дескриптор из лдт.. тогда вся инфа извлекаецо из лдт, а в манах интела написанно четко, что "the ldtr register holds the 16-bit segment selector, base address...., segment limit, and descriptor attributes for the ldt", т.е. не обязательно обращацо к гдт, чтоб получить лдт
    :)))
     
  7. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    сори, юмор не понял
     
  8. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    нормальное имхо решение
     
  9. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    будет #GP
     
  10. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    не то же самое
    сравни форматы GDTR и LDTR
     
  11. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    я тоже так всегда думал
    проверил - нет #GP
     
  12. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    правельно.. 0 селектор поидее невалидный, поэтому просто ldtr становецо невалидный.. другое дело есле селектор валидный... тогда уж надо чтоб он указывал на дескриптор лдт...
    естественно надо lldt делоть перед тем как портить gdtr
     
  13. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    да, извиняюсь
     
  14. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    плохая антиотладка. легко обнаружить. то же самое что и перезаписть IDT.
    lgdt/lidt/sgdt/sidt легко обнаружить как в дизасме так и в отладчике.
     
  15. KonstantinBart

    KonstantinBart New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2007
    Сообщения:
    20
    Ну я и на реальной машине тоже тестировал...идет перезагрузка машины...
     
  16. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    Ага, обнаружить легко. А вот бороться с этим уже не так просто. К примеру - исследуемый код создает GDT, в которой определены несколько сегментов данных и потом активно работает с данными из этих сегментов.