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