Вопрос об организации GDT

Тема в разделе "WASM.ASSEMBLER", создана пользователем ubil, 26 ноя 2005.

  1. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    У меня простой вопрос: могут ли в GDT быть два дескриптора, описывающие одну и ту же физическую облать памяти? Например, один будет описывать данную облать памяти как сегмент кода, а другой - как сегмент данных, или, что мне на самом деле нужно, - один будет описывать как ринг0 код, а другой - как ринг3...
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Могут.
     
  3. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    Понятно. Спасибо за простой ответ:)

    А вот еще вопрос в том же духе: можно ли обращаться к данным по физическому адресу, минуя страничный механизм? Например такой вот код типа

    mov eax,ds:[ebp]

    когда включена страничная адрессация приведет к тому, что процессор станет выискивать физический адрес в таблице страниц, или же он получит этот адрес из GDT посредством ds? Интересно как тогда во вотором случае обращаться к адресу >4Gb...
     
  4. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia


    Из GDT он может получить только базу, проверить лимит и т.п. Если нарушений нет - он прибавит базу к смещению и получит "линейный" адрес (это происходит не с самим GDT а с теневыми регистрами куда загружен дескриптор). Адрес этот никак не может быть >4Gb, он даже равен ему не будет. Потому как сложение будет по модулю 4Gb (если адресация 32х битная), но до сложения ещё проверится лимит. Если страничная адресация включена, то конечно далее будет включен механизм трансформирования адреса линейного в физический где на каждом из этапов трансформирования будут делаться проверки и обрабатываться особые случаи если что не так.

    Есть в опкоде префикс переопределения сегмента или нет его, в любом случае сначала будет формироваться линейный адрес и делатся это будет на основании данных отражённых в GDT.

    так что напришешь ты

    mov eax,[ebp]

    или

    mov eax,ds:[ebp]

    В обоих случаях будет обращение к дескриптору, отражённому в GDT, и будет сначала формироваться линейный адрес, только в первом случае дескриптор будет искаться по индексу в ss, а во втором - по индексу в ds.

    Разумеется всё выше сказанное справедливо если речь идёт о защищённом режиме.
     
  5. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    2The Svin:

    И это теперь понятно.

    *****только в первом случае дескриптор будет искаться по индексу в ss, а во втором - по индексу в ds.*****

    Только вот почему именно по индексу в ss, а не по индексу в ds, но по умолчанию? Получается, я каким-нибудь случайным обращением mov [ebp],eax в своей проге могу "попортить" стек, и например, изменить код возврата? Типа данные и стек в User Mode проге описываются одним дескриптором что ли? Ты наверное опечатался...
     
  6. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    Без префикса определения сегмента ebp, esp обращаются через ss

    eax,edx,ecx,ebx,edi,esi - через ds





    :)

    Ты вообще говоришь о чём? О программировании в Windows?

    1. Я не опечатался. ebp,esp по умолчанию - ss

    2. Если говорить не о защищённом режиме вообще а конкретно о защищённом режиме в Windows, то там вообще для Win32 приложений, хоть пользовательских, хоть режима ядра - flat

    модель. Т.е. общая база. Защита осуществляется на уровне страниц (поэтому то и только два режима - со страницами больше не сделаешь, например в OS/2 - три кольца а не два, там используется защита через дескрипторы).

    У приложений режима ядра дескриптор стека отличается действительно от приложений 3го кольца. Но база одна и та же. А отличается по одной простой причине (вовсе не потому что MicroSoft так задумал) Дело в том что по архитектуре IA32 у кода выполняемого в режиме супервизора и стек должен быть с правами супервизора. Так что они просто вынуждены были это сделать. Для этого они и создали ещё один дескриптор для стека, поставили в нём ту же базу, но установили другие права. Вобще для Катлера (работавшего во основном с DEC) все приемущества защищённого режима Intel по сравнению с другими архитектурами больше мешали чем помогали, привык он понимаешь по другому всё делать и проще. По этому и такое странное отношение в ядре к TSS и прочее и прочее.
     
  7. ubil

    ubil New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2004
    Сообщения:
    203
    Адрес:
    ODESSA:)
    ****Без префикса определения сегмента ebp, esp обращаются через ss

    eax,edx,ecx,ebx,edi,esi - через ds****

    А я думал раньше что всегда ds по умолчанию:) В общем спасибо за инфу.

    ****Ты вообще говоришь о чём? О программировании в Windows?****

    Ну типа да, но это не важно теперь:)