Собственно интересует, как открыть устройство PhysicalMemory. Проблема вот в чем: в GDTR лежит адрес 0x500003FF что подпадает на UserMode процесса в чьем контексте происходит обмен данными. Мне получается нужно либо каким то образом переключить контекст на ядро(или на то в чем работает драйвер - я не очень разбираюсь в этом), что бы в CR3 лежала таблица с страницами с прямой проекцией страниц на физ.память. В общем у меня замкнутый круг - не могу создать шлюз для физ.памяти, т.к. не имею доступа к оной. Мелькала мысль зарегистрировать обработчик прерывания(неиспользуемого - скажем 0xFE) и вызвать его, после чего он сделает шлюз, но я опять же не знаю какой функцией это можно сделать.
Не понял, речь о \Device\PhysicalMemory? Если да, то из ядра секция открывается без проблем через ZwOpenSection(). Кроме того, с физической памятью можно работать гораздо проще, вызвав MmMapIoSpace(). Или требуется что-то другое?
Огромное спасибо! По поводу MmMapIoSpace в MSDN написано что она должна вызываться перед началом работы, т.е. в DriverEntry - это так или ее можно вызывать и в процессе работы, скажем в IRP_MJ_READ ?
Там нигде не сказано, что это обязательное требование. Более того, если посмотреть внимательно, то окажется, что там написано про device drivers (т.е. драйвера физических устройств). Драйвера других типов могут вызывать эту функцию когда им нужно.
Ivan_32 Физическая памяти и ядерный контекст не связаны в данном случае. Тебе не нужен доступ к физической памяти, и не требуется переключение контекста. "0x500003FF" – это не полное содержимое GDTR. При исполнении инструкции "sgdt" в legacy или compatibility mode сохраняется 6 байт. 0x03FF – лимит GDT, а 0x????5000 – виртуальный адрес.
Ivan_32 Что за шлюз ? Шлюзы прерываний и ловушки никак не связаны с физической памятью. Адреса в системном ап(0x80000000 и выше) отображаются линейно на на физические 0x00000000, для этого диапазона работает макро: Код (Text): VIRTUAL_TO_PHYSICAL macro Va .if (Va > 080000000H) && (Va < 0A0000000H) and Va,1FFFFFFFH .else and Va,0FFFFFFH .endif endm Например линейный адрес ядра(нтос) - 0x804D7000, соответственно физический адрес 0x4D7000. Отобразить страницы на ап не составляет труда, именно это и делает MmMapIoSpace как сказали, совсем другое это выделить линейный блок физической памяти(вручную возникнут проблемы с pfn).
Т.е. в GDTR лежит все таки виртуальный адрес? PS: Не работал со страничной адресацией - только с FLAT.
Ivan_32 В GDTR и IDTR лежат виртуальные адреса (это и по значениям видно). При желании можно каждому процессу дать свою GDT/IDT.
Ivan_32 Физические адреса лежат только в каталогах страниц и в CR3 - только там, где происходит преобразование. В остальных системных структурах виртуальные. Чточто? Какие шлюзы прерываний? При чем они тут?
Ivan_32 скачай вот здесь http://www.wasm.ru/forum/viewtopic.php?pid=300232#p300232 мой int0x002E.c и см. там следующее моё сообщение про нулевой адрес на который я там отображаю 1 видеостраницу видяхи - пример этот по-моему как раз тебе поможет разобраться с физ. и виртуал. адресами.
int2eh Отвалится ось после ваших отображений скорее всего. VMM весьма сложен, там несколько списков описывающих физическую память и адресное пространство есть и проверки валидности этих структур. То как процессор адреса транслирует это самые простые вещи при рассмотрении менеджера памяти.
Clerk Ничего страшного, если ось "отвалится" - одна перезагрузка и всё ok! С чего-то надо же начинать парню?!!! А пример изменения трансляции адреса в самый раз. И тем более я тот код делал по-Руссиновичу, это вполне докумментированные вещи!
Неправильно выразился - думал залить в GDT новый дескриптор, через который бы и обращался к памяти. int2eh, спасибо за исходник, поковыряю на досуге Правда с С у меня нынче кое какие проблемы(попросту говоря я не понимаю во что превращается мой код после компиляции), но все равно спасибо. Всем огромное спасибо за помощь!
А тебе и не нужно. Это некий тип абстракции - ты пишешь сишный код, а что в результате получится - забота исключительно компилятора (и потом линкера, чтобы все вместе собрать и сделать конфетку. ой, PEшник). Будешь еще и этим себе голову забивать - совсем запутаешься.