#pragma alloc_text (PAGE) код не выровнен по странице - PullRequest
1 голос
/ 25 ноября 2010

Я столкнулся с (возможной) проблемой с DDK (довольно старая версия: 3590) для 32-битной WinXP.Мой драйвер содержит некоторые статические переменные, которые не были инициализированы (я полагаю, они должны быть назначены разделу .bss) и некоторые функции в разделе кода с возможностью просмотра страниц (помечены #pragma alloc_page (PAGE, func)).Пейджинговый код собирается в отдельном объектном файле.Я обнаружил, что компоновщик, похоже, назначает статику и код для постраничного вывода одной и той же странице в адресном пространстве ядра (т. Е. Переменная имеет значение 0xEFFCB0A0, а функция имеет значение 0xEFFCB600 - проверяется с помощью windbg).Статические переменные используются в среде прерываний, поэтому их страницы должны быть заблокированы в памяти.Но если эта же страница содержит заменяемый код, я боюсь, что переменные могут внезапно исчезнуть.Карта компоновщика правильно сообщает, что код для постраничного ввода находится в другом разделе («PAGE»), но смещение («Rva + Base») находится в середине страницы, содержащей статику.

Как можноЯ заставляю компоновщик / загрузчик назначать отдельные страницы коду страницы?Есть ли какая-то "#pragma" для принудительного выравнивания раздела?Я что-то не так делаю?

PS: Загрузчик драйверов, безусловно, достаточно умен, чтобы вывести страницу, содержащую как переменные, так и код, из выгружаемого пула, но поскольку страница содержит переменные, она должна быть доступна для записи.Я бы предпочел, чтобы исполняемый код находился на странице только для чтения.Неправильный доступ к массиву в режиме ядра все еще так трудно отлаживать ...

PPS: добавлено 4096 "nop" до и после моей функции ... хорошо, это работает ... ничего лучше предложить?

1 Ответ

1 голос
/ 16 июня 2013

Поместите ваши глобалы в отдельный сегмент данных:

#pragma data_seg("NONPAGE")
// declare your globals here
#pragma data_seg()

источник: ссылка MSDN на data_seg

По умолчанию ваш раздел будет создаваться с флагами чтения / записи, а не с перемещаемыми флагами.

Вы можете указать дополнительные параметры раздела:

#pragma comment(linker, "/section:NONPAGE,ERW")

источник: Ссылка MSDN включена / РАЗДЕЛ

или вы можете разместить параметры компоновщика в файле SOURCES:

LINKER_FLAGS = $(LINKER_FLAGS) /SECTION:NONPAGE,ERW

ПРИМЕЧАНИЕ: если вы создаете библиотеку, используйте LIBRARIAN_FLAGS вместо

...