Библиотека трансляции адресов

Тема в разделе "WASM.ZEN", создана пользователем gilg, 13 окт 2006.

  1. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Кому-нибудь попадалась библиотека трансляции виртуальных адресов в физические и обратно для i386 (в т.ч. с поддержкой PAE), amd64?
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    а что там сложного? Хотя с PAE не знаю.
     
  3. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Не удается с включенным PAE получить виртуальный адрес для Page Directory Pointer Table (физический адрес в Cr3).

    Cr3 = 0x0a240020
    MmGetVirtualForPhysical(Cr3) = 0x0a240220

    По этому адресу ошибка чтения памяти. Для других физических адресов MmGetVirtualForPhysical работает как надо, т.е.:
    MmGetVirtualForPhysical( MmGetPhysicalAddress(x) ) == x
    Для Cr3 получается:
    MmGetPhysicalAddress( MmGetVirtualForPhysical(Cr3) ) == NULL, т.е. нет такого соответствия. В чем может быть трабл?
     
  4. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Возможно такого соответствия действительно нет:)
    А что если создать свою ссылку на этот адрес?
     
  5. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    А как тогда система определяет виртуальный адрес PDPT? Может быть она, конечно, вообще не использует cr3, а хранит виртуальный адрес где-нибудь в Peb...
    Ссылку можно, просто не хотел связываться с MmMapIoSpace, сильно тормознутая это функция. Придется наверное тоже где-нибудь кэшировать соответствие
     
  6. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Еще один вопрос в тему. Как можно заставить систему выделить память в больших или маленьких страницах?
     
  7. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    2gilg

    А ты уверен что код правилен:

    Код (Text):
    1. MmGetPhysicalAddress( MmGetVirtualForPhysical(Cr3) ) == NULL
    Ведь в Cr3 не адрес, а в особенности в 3,и 4м бите те более :)
     
  8. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Естественно, что код выглядит немного по-другому. Это просто выражение идеи, каким образом он работает. Как-никак Wasm.ZEN :))
     
  9. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Я имел ввиду, что выражение идеи с включенным PAE и выключенным - разнится. (из за форматов cr3)
     
  10. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Ну судя по интеловским докам, для PAE виртуальный адрес Cr3 можно получить так:
    Код (Text):
    1. MmGetVirtualForPhysical(Cr3 & 0xFFFFFFE0)
    Но MmGetVirtualForPhysical() выдает в таком случае лажу (см. третий пост). Для других физических адресов такая штука работает. Чем может быть вызвано такое отличие?
    MmGetVirtualForPhysical() выполняет такое преобразование:
    Получается, что MmPfnDB не заполнена для Cr3 или заполнена каким-то левым значением?

    ЗЫ: Такая хрень наблюдается только на машине с Windows XP. На Win2000 с включенным PAE никаких вопросов
    ЗЗЫ: Что еще интереснее, checked build WinXP под VmWare также работает как надо :dntknw:((
     
  11. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Интересно, такая ситуация наблюдается для всех процессов, и системных в т.ч. ?
    <Imho>Просто странно как то создавать PDPT а далее модифицировать его таким образом, чтобы он не присутствовал в виртуальной памяти, при этом оставляя ссылки на него в системных таблицах. Все это похоже на глобальный глюк в мозгу разработчика ос... или может это трюк сайса? ... Пожалуй стоит посмотреть дампы самих PDPT ...</Imho>
     
  12. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Поковырял еще эту штуку. Оказалось, что в PFN для Cr3 в поле PteAddress лежит вместо виртуального адреса PTE некое странное число. Например, PFN = 0xa240, PteAddress = 0x51201. Что это такое так и не понял. Проблема существует только для юзер-модных контекстов (драйвер естественно работает в нужном контексте). Для системного контекста все верно.
    В "WindowsNT Device Driver Development" нашел, что
    Похоже есть и другие схожие ситуации, хотя ни один google ничего похожего не говорит. Видимо, придется остановиться на MmMapIoSpace()
     
  13. _Serega_

    _Serega_ New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    288
    Что-то не пойму... Какое это имеет отношение к проблеме? Ведь для памяти выделенной по MmMapIoSpace(), MmGetVirtualForPhysical должен возвращать 0, а не ерунду всякую? Верно?