Работа с физической памятью из драйвера.

Тема в разделе "WASM.NT.KERNEL", создана пользователем Ivan_32, 12 фев 2010.

  1. Ivan_32

    Ivan_32 New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2008
    Сообщения:
    18
    Собственно интересует, как открыть устройство PhysicalMemory. Проблема вот в чем: в GDTR лежит адрес 0x500003FF
    что подпадает на UserMode процесса в чьем контексте происходит обмен данными. Мне получается нужно либо каким то образом переключить контекст на ядро(или на то в чем работает драйвер - я не очень разбираюсь в этом), что бы в CR3 лежала таблица с страницами с прямой проекцией страниц на физ.память. В общем у меня замкнутый круг - не могу создать шлюз для физ.памяти, т.к. не имею доступа к оной.
    Мелькала мысль зарегистрировать обработчик прерывания(неиспользуемого - скажем 0xFE) и вызвать его, после чего он сделает шлюз, но я опять же не знаю какой функцией это можно сделать.
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Не понял, речь о \Device\PhysicalMemory? Если да, то из ядра секция открывается без проблем через ZwOpenSection(). Кроме того, с физической памятью можно работать гораздо проще, вызвав MmMapIoSpace(). Или требуется что-то другое?
     
  3. Ivan_32

    Ivan_32 New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2008
    Сообщения:
    18
    Огромное спасибо! По поводу MmMapIoSpace в MSDN написано что она должна вызываться перед началом работы, т.е. в DriverEntry - это так или ее можно вызывать и в процессе работы, скажем в IRP_MJ_READ ?
     
  4. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Там нигде не сказано, что это обязательное требование. Более того, если посмотреть внимательно, то окажется, что там написано про device drivers (т.е. драйвера физических устройств). Драйвера других типов могут вызывать эту функцию когда им нужно.
     
  5. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Ivan_32
    Физическая памяти и ядерный контекст не связаны в данном случае. Тебе не нужен доступ к физической памяти, и не требуется переключение контекста. "0x500003FF" – это не полное содержимое GDTR. При исполнении инструкции "sgdt" в legacy или compatibility mode сохраняется 6 байт. 0x03FF – лимит GDT, а 0x????5000 – виртуальный адрес.
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Ivan_32
    Что за шлюз ?
    Шлюзы прерываний и ловушки никак не связаны с физической памятью.
    Адреса в системном ап(0x80000000 и выше) отображаются линейно на на физические 0x00000000, для этого диапазона работает макро:
    Код (Text):
    1. VIRTUAL_TO_PHYSICAL macro Va
    2.     .if (Va > 080000000H)  && (Va < 0A0000000H)
    3.     and Va,1FFFFFFFH
    4.     .else
    5.     and Va,0FFFFFFH
    6.     .endif
    7. endm
    Например линейный адрес ядра(нтос) - 0x804D7000, соответственно физический адрес 0x4D7000. Отобразить страницы на ап не составляет труда, именно это и делает MmMapIoSpace как сказали, совсем другое это выделить линейный блок физической памяти(вручную возникнут проблемы с pfn).
     
  7. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    Есть исключение - local APIC
     
  8. Ivan_32

    Ivan_32 New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2008
    Сообщения:
    18
    Т.е. в GDTR лежит все таки виртуальный адрес?
    PS: Не работал со страничной адресацией - только с FLAT.
     
  9. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Ivan_32
    В GDTR и IDTR лежат виртуальные адреса (это и по значениям видно). При желании можно каждому процессу дать свою GDT/IDT.
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ivan_32
    Физические адреса лежат только в каталогах страниц и в CR3 - только там, где происходит преобразование.
    В остальных системных структурах виртуальные.

    Чточто? Какие шлюзы прерываний? При чем они тут?
     
  11. int2eh

    int2eh Alexander Leevy

    Публикаций:
    0
    Регистрация:
    19 авг 2007
    Сообщения:
    106
    Адрес:
    Москва
    Ivan_32

    скачай вот здесь http://www.wasm.ru/forum/viewtopic.php?pid=300232#p300232 мой int0x002E.c и см. там следующее моё сообщение про нулевой адрес на который я там отображаю 1 видеостраницу видяхи - пример этот по-моему как раз тебе поможет разобраться с физ. и виртуал. адресами.
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    int2eh
    Отвалится ось после ваших отображений скорее всего. VMM весьма сложен, там несколько списков описывающих физическую память и адресное пространство есть и проверки валидности этих структур. То как процессор адреса транслирует это самые простые вещи при рассмотрении менеджера памяти.
     
  13. int2eh

    int2eh Alexander Leevy

    Публикаций:
    0
    Регистрация:
    19 авг 2007
    Сообщения:
    106
    Адрес:
    Москва
    Clerk
    Ничего страшного, если ось "отвалится" - одна перезагрузка и всё ok! С чего-то надо же начинать парню?!!! А пример изменения трансляции адреса в самый раз. И тем более я тот код делал по-Руссиновичу, это вполне докумментированные вещи!
     
  14. Ivan_32

    Ivan_32 New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2008
    Сообщения:
    18
    Неправильно выразился - думал залить в GDT новый дескриптор, через который бы и обращался к памяти.
    int2eh, спасибо за исходник, поковыряю на досуге :)
    Правда с С у меня нынче кое какие проблемы(попросту говоря я не понимаю во что превращается мой код после компиляции), но все равно спасибо.
    Всем огромное спасибо за помощь!
     
  15. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А тебе и не нужно. Это некий тип абстракции - ты пишешь сишный код, а что в результате получится - забота исключительно компилятора (и потом линкера, чтобы все вместе собрать и сделать конфетку. ой, PEшник).
    Будешь еще и этим себе голову забивать - совсем запутаешься.