Кому-нибудь попадалась библиотека трансляции виртуальных адресов в физические и обратно для i386 (в т.ч. с поддержкой PAE), amd64?
Не удается с включенным PAE получить виртуальный адрес для Page Directory Pointer Table (физический адрес в Cr3). Cr3 = 0x0a240020 MmGetVirtualForPhysical(Cr3) = 0x0a240220 По этому адресу ошибка чтения памяти. Для других физических адресов MmGetVirtualForPhysical работает как надо, т.е.: MmGetVirtualForPhysical( MmGetPhysicalAddress(x) ) == x Для Cr3 получается: MmGetPhysicalAddress( MmGetVirtualForPhysical(Cr3) ) == NULL, т.е. нет такого соответствия. В чем может быть трабл?
А как тогда система определяет виртуальный адрес PDPT? Может быть она, конечно, вообще не использует cr3, а хранит виртуальный адрес где-нибудь в Peb... Ссылку можно, просто не хотел связываться с MmMapIoSpace, сильно тормознутая это функция. Придется наверное тоже где-нибудь кэшировать соответствие
Еще один вопрос в тему. Как можно заставить систему выделить память в больших или маленьких страницах?
2gilg А ты уверен что код правилен: Код (Text): MmGetPhysicalAddress( MmGetVirtualForPhysical(Cr3) ) == NULL Ведь в Cr3 не адрес, а в особенности в 3,и 4м бите те более
Естественно, что код выглядит немного по-другому. Это просто выражение идеи, каким образом он работает. Как-никак Wasm.ZEN )
Ну судя по интеловским докам, для PAE виртуальный адрес Cr3 можно получить так: Код (Text): MmGetVirtualForPhysical(Cr3 & 0xFFFFFFE0) Но MmGetVirtualForPhysical() выдает в таком случае лажу (см. третий пост). Для других физических адресов такая штука работает. Чем может быть вызвано такое отличие? MmGetVirtualForPhysical() выполняет такое преобразование: Получается, что MmPfnDB не заполнена для Cr3 или заполнена каким-то левым значением? ЗЫ: Такая хрень наблюдается только на машине с Windows XP. На Win2000 с включенным PAE никаких вопросов ЗЗЫ: Что еще интереснее, checked build WinXP под VmWare также работает как надо ((
Интересно, такая ситуация наблюдается для всех процессов, и системных в т.ч. ? <Imho>Просто странно как то создавать PDPT а далее модифицировать его таким образом, чтобы он не присутствовал в виртуальной памяти, при этом оставляя ссылки на него в системных таблицах. Все это похоже на глобальный глюк в мозгу разработчика ос... или может это трюк сайса? ... Пожалуй стоит посмотреть дампы самих PDPT ...</Imho>
Поковырял еще эту штуку. Оказалось, что в PFN для Cr3 в поле PteAddress лежит вместо виртуального адреса PTE некое странное число. Например, PFN = 0xa240, PteAddress = 0x51201. Что это такое так и не понял. Проблема существует только для юзер-модных контекстов (драйвер естественно работает в нужном контексте). Для системного контекста все верно. В "WindowsNT Device Driver Development" нашел, что Похоже есть и другие схожие ситуации, хотя ни один google ничего похожего не говорит. Видимо, придется остановиться на MmMapIoSpace()
Что-то не пойму... Какое это имеет отношение к проблеме? Ведь для памяти выделенной по MmMapIoSpace(), MmGetVirtualForPhysical должен возвращать 0, а не ерунду всякую? Верно?