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

Discussion in 'WASM.OS.DEVEL' started by KonstantinBart, Dec 6, 2007.

  1. KonstantinBart

    KonstantinBart New Member

    Blog Posts:
    0
    Joined:
    Dec 3, 2007
    Messages:
    20
    Да, действительно...накопипастился я с сегментом кода....:)
    Я вот понял, что для сегмента кода надо просто джамп выполнить...по крайней мере в Линухе в kexec.h так и делается...простой джамп и переназначение всех сегментов данных и стека!

    Code (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

    Blog Posts:
    0
    Joined:
    Dec 3, 2007
    Messages:
    20
    Как раз и возникает triple fault....тестировал без всякой отладки на виртуальной машине...
     
  3. Medstrax

    Medstrax Забанен

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

    Medstrax Забанен

    Blog Posts:
    0
    Joined:
    Jul 18, 2006
    Messages:
    673
    А я на реальной ;)
     
  5. Medstrax

    Medstrax Забанен

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

    Freeman New Member

    Blog Posts:
    0
    Joined:
    Feb 10, 2005
    Messages:
    1,385
    Location:
    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 Забанен

    Blog Posts:
    0
    Joined:
    Jul 18, 2006
    Messages:
    673
    сори, юмор не понял
     
  8. Freeman

    Freeman New Member

    Blog Posts:
    0
    Joined:
    Feb 10, 2005
    Messages:
    1,385
    Location:
    Ukraine
    нормальное имхо решение
     
  9. rei3er

    rei3er maxim

    Blog Posts:
    0
    Joined:
    Jan 15, 2007
    Messages:
    917
    Location:
    minsk
    будет #GP
     
  10. rei3er

    rei3er maxim

    Blog Posts:
    0
    Joined:
    Jan 15, 2007
    Messages:
    917
    Location:
    minsk
    не то же самое
    сравни форматы GDTR и LDTR
     
  11. Medstrax

    Medstrax Забанен

    Blog Posts:
    0
    Joined:
    Jul 18, 2006
    Messages:
    673
    я тоже так всегда думал
    проверил - нет #GP
     
  12. Freeman

    Freeman New Member

    Blog Posts:
    0
    Joined:
    Feb 10, 2005
    Messages:
    1,385
    Location:
    Ukraine
    правельно.. 0 селектор поидее невалидный, поэтому просто ldtr становецо невалидный.. другое дело есле селектор валидный... тогда уж надо чтоб он указывал на дескриптор лдт...
    естественно надо lldt делоть перед тем как портить gdtr
     
  13. rei3er

    rei3er maxim

    Blog Posts:
    0
    Joined:
    Jan 15, 2007
    Messages:
    917
    Location:
    minsk
    да, извиняюсь
     
  14. n0name

    n0name New Member

    Blog Posts:
    0
    Joined:
    Jun 5, 2004
    Messages:
    4,336
    Location:
    Russia
    плохая антиотладка. легко обнаружить. то же самое что и перезаписть IDT.
    lgdt/lidt/sgdt/sidt легко обнаружить как в дизасме так и в отладчике.
     
  15. KonstantinBart

    KonstantinBart New Member

    Blog Posts:
    0
    Joined:
    Dec 3, 2007
    Messages:
    20
    Ну я и на реальной машине тоже тестировал...идет перезагрузка машины...
     
  16. Medstrax

    Medstrax Забанен

    Blog Posts:
    0
    Joined:
    Jul 18, 2006
    Messages:
    673
    Ага, обнаружить легко. А вот бороться с этим уже не так просто. К примеру - исследуемый код создает GDT, в которой определены несколько сегментов данных и потом активно работает с данными из этих сегментов.