Здрасте. Тут смысл задачи: Некоторая область ядра использует 4M страницы(Large Page). Необходимо заменить физический адрес этой страницы в каталоге страниц. Я не вижу возможности выделить непрерывный блок памяти такого размера с выравниванием на границу 4M. Менеджер памяти использует в основном наборы страниц расположенные произвольным образом в физической памяти. Моё решение - создать таблицу страниц и создать описатель её в каталоге страниц, заменив тем самым страницу размером 4M. Формируем MDL, затем для каждой страницы определяем её физический адрес и загружаем описатели в созданную таблицу страниц. Существует ли способ выделить непрерывный участок физической памяти средствами менеджера памяти(чтоб вручную не парсить каталог страниц) ?
Bazhan Выделяет регион выравненный на 4K. У меня 512M всего, 8M не выделяется(можно былобы сделать (~(LARGE_PAGE_SIZE - 1) && (Ptr + LARGE_PAGE_SIZE - 1)).
PHYSICAL_ADDRESS pa = { 0xffffffff, 0xffffffff }; PVOID pv = MmAllocateContiguousMemory( 0x800000, pa ); у меня выделяется при 256M
Что-то совсем непонятно. "Во всех процессах например заголовок ядра имеет одинаковый физический адрес" - офигенный вывод) "Необходимо заменить физический адрес этой страницы в каталоге страниц. Я не вижу возможности выделить непрерывный блок памяти такого размера с выравниванием на границу 4M." Блин, хоть убей - не пойму зачем тебе именно блок физ.памяти такого размера.Выравнивание на 4М идет лесом, на 4 кб страницах все то же самое
medstrax1 Для 4k страниц описатель каждой её хранится в таблице страниц, физический адрес которой находится в каталоге страниц. Для 4M страниц описатель в каталоге страниц определяет не таблицу страниц, а непосредственно её физический адрес, тоесть ссылается на страницу. Под памяти нтос отводятся 4M страницы. Дескриптор 4M страницы содержит в младших 22 битах маску в которой флажки, тоесть физический адрес страницы должен быть выравнен на 4M.