Народ подкиньте идейку как прочитать табличку GDT. Регистр GDTR вроде прочитал. Вот мои мысли по этому поводу: чтобы прочитать любую область памяти необходимо, чтобы она была описана в GDT, т.е. память в которой находится GDT должна быть описана в самой GDT. И если не знаешь селектора к дескриптору этой области памяти, то выходит и не имеешь доступа к GDT. А ходелось бы (хотябы ридонли).
Дело, как я понимаю, происходит под Win? Сегменты в Win плоские, поэтому можно воспользоваться дескрипторами, которые выдает сама Win. Правда GDT отображается в область, недоступную из usermode, поэтому надо либо писать драйвер, либо воспользоваться командами 'lar' & 'lsl', хотя они не дают информации о базе сегмента.
Да имеется ввиду именно драйвер 0 кольца защиты под WinXP. Проблема в том, как прочитать некоторую область физической памяти без обращения к GDT
физическая память тут вообще не причем, тут надо уже либо с каталогами страниц танцевать с бубном, либо юзать MmMapIoSpace, как было сказано=\ еще можно воспользоваться NtSystemDebugControl, только она не все физические страницы выдает и вообще странно себя ведет
Без обращения к GDT никак. Любой адрес, формируемый в защищенном режиме требует обращения к GDT. Точнее, обращение идет к теневому регистру, содержимое которого заполняется из GDT. Кстати, чтобы обратиться именно к определенному _физическому_ адресу необходимо построить свои таблицы страничного преобразования.
для чего все равно нужно знать физические адреса, по которым будет находится каталог и таблицы страниц
Great т. е я говорю про случай, когда мы создаем свой каталог и таблицы страниц, а не используем существующий/е
Я тоже про этот случай говорил. Например, если надо посмотреть, что находится в нулевом физическом адресе, то можно построить свою таблицу отображения, отобразить ее в физ. адрес 0 и считать значение.
Mika0x65 вот я и говорю, если код, создающий все эти структуры, будет работать в ядре какой-нибудь ОС, придется средствами ОС получать физические адреса
rei3er Ты имеешь ввиду что надо запросить у ОС 8 КБ памяти для по крайней мере одного каталога и одной таблицы?
Mika0x65 ну а как по твоему? можно в модуле прописать BSS секцию на 8K не знаю как в Windows-драйверах, а в Linux что-то наподобие этого Код (Text): .bss page_directory: .skip 4096 page_table: .skip 4096 ... а потом узнавать физические адреса `page_directory' и `page_table' (ну по крайней мере `page_directory')
Так или иначе, для обращения к физическому адресу, создания каталога таблиц страниц и таблиц страниц нужно получить линейный! адрес каталога таблиц страниц. Каталог таблиц страниц находится по фиксированному линейному адресу. По моему, С0300000. Тогда можно лазить по таблицам страниц, определять физические адреса по линейным, линейные по физическим. Правда у меня что-то не работало. Может быть, я ошибаюсь, но в теории должно быть так.
думаю, Kondratyuk имел в виду эффективный (=линейный во flat модели) адрес каталога страниц (т. е отображение самого каталога страниц на виртуальное адресное пространство)
Kondratyuk В режиме /3GB адрес другой; в PAE точно не помню, но, кажется, также отличается; это не говоря уже о Win64. В Висте, судя по всему, этот адрес вообще может быть произвольным из-за динамического распределения ядерного адресного пространства. Наиболее корректный метод - использовать MmMapIoSpace, хотя тормоза в этом случае гарантированы.