Работа с таблицей GDT

Тема в разделе "WASM.NT.KERNEL", создана пользователем Sheff, 3 май 2007.

  1. Sheff

    Sheff New Member

    Публикаций:
    0
    Регистрация:
    1 мар 2007
    Сообщения:
    6
    Народ подкиньте идейку как прочитать табличку GDT. Регистр GDTR вроде прочитал. Вот мои мысли по этому поводу:

    чтобы прочитать любую область памяти необходимо, чтобы она была описана в GDT, т.е. память в которой находится GDT должна быть описана в самой GDT. И если не знаешь селектора к дескриптору этой области памяти, то выходит и не имеешь доступа к GDT. А ходелось бы (хотябы ридонли).
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Дело, как я понимаю, происходит под Win? Сегменты в Win плоские, поэтому можно воспользоваться дескрипторами, которые выдает сама Win. Правда GDT отображается в область, недоступную из usermode, поэтому надо либо писать драйвер, либо воспользоваться командами 'lar' & 'lsl', хотя они не дают информации о базе сегмента.
     
  3. Sheff

    Sheff New Member

    Публикаций:
    0
    Регистрация:
    1 мар 2007
    Сообщения:
    6
    Да имеется ввиду именно драйвер 0 кольца защиты под WinXP. Проблема в том, как прочитать некоторую область физической памяти без обращения к GDT
     
  4. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    MmMapIoSpace
    или MmGetVirtualForPhysical - но работает не всегда так, как хотелось бы :\
     
  5. Sheff

    Sheff New Member

    Публикаций:
    0
    Регистрация:
    1 мар 2007
    Сообщения:
    6
    А если не использовать виндовые средства, както самому командами ассемблера - это реально?
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    физическая память тут вообще не причем, тут надо уже либо с каталогами страниц танцевать с бубном, либо юзать MmMapIoSpace, как было сказано=\
    еще можно воспользоваться NtSystemDebugControl, только она не все физические страницы выдает и вообще странно себя ведет :)
     
  7. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Без обращения к GDT никак. Любой адрес, формируемый в защищенном режиме требует обращения к GDT. Точнее, обращение идет к теневому регистру, содержимое которого заполняется из GDT. Кстати, чтобы обратиться именно к определенному _физическому_ адресу необходимо построить свои таблицы страничного преобразования.
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    реально, если хочешь приключений на свои вторые девяносто
     
  9. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    для чего все равно нужно знать физические адреса, по которым будет находится каталог и таблицы страниц :derisive:
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    rei3er
    ну каталог доступен через cr3, а адрес таблицы страниц через каталог )
     
  11. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    Great
    т. е я говорю про случай, когда мы создаем свой каталог и таблицы страниц, а не используем существующий/е
     
  12. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Я тоже про этот случай говорил. Например, если надо посмотреть, что находится в нулевом физическом адресе, то можно построить свою таблицу отображения, отобразить ее в физ. адрес 0 и считать значение.
     
  13. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    Mika0x65
    вот я и говорю, если код, создающий все эти структуры, будет работать в ядре какой-нибудь ОС, придется средствами ОС получать физические адреса
     
  14. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    rei3er
    Ты имеешь ввиду что надо запросить у ОС 8 КБ памяти для по крайней мере одного каталога и одной таблицы?
     
  15. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    Mika0x65
    ну а как по твоему?
    можно в модуле прописать BSS секцию на 8K
    не знаю как в Windows-драйверах, а в Linux что-то наподобие этого
    Код (Text):
    1. .bss
    2. page_directory:
    3. .skip 4096
    4. page_table:
    5. .skip 4096
    6. ...
    а потом узнавать физические адреса `page_directory' и `page_table' (ну по крайней мере `page_directory')
     
  16. Kondratyuk

    Kondratyuk New Member

    Публикаций:
    0
    Регистрация:
    8 май 2007
    Сообщения:
    6
    Так или иначе, для обращения к физическому адресу, создания каталога таблиц страниц и таблиц страниц нужно получить линейный! адрес каталога таблиц страниц. Каталог таблиц страниц находится по фиксированному линейному адресу. По моему, С0300000. Тогда можно лазить по таблицам страниц, определять физические адреса по линейным, линейные по физическим. Правда у меня что-то не работало. Может быть, я ошибаюсь, но в теории должно быть так.
     
  17. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    В CR3 хранится не линейный, а физический адрес.
     
  18. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    думаю, Kondratyuk имел в виду эффективный (=линейный во flat модели) адрес каталога страниц (т. е отображение самого каталога страниц на виртуальное адресное пространство)
     
  19. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Kondratyuk
    В режиме /3GB адрес другой; в PAE точно не помню, но, кажется, также отличается; это не говоря уже о Win64. В Висте, судя по всему, этот адрес вообще может быть произвольным из-за динамического распределения ядерного адресного пространства. Наиболее корректный метод - использовать MmMapIoSpace, хотя тормоза в этом случае гарантированы.