对于WinXP 32位,我正面临DDK(一个相当旧版本:3590)的(可能)问题。我的驱动程序包含一些未经过初始化的静态变量(我认为它们应分配给.bss部分)和可分页代码部分中的一些函数(标有#pragma alloc_page(PAGE,func))。可分页代码收集在单独的目标文件中。我发现链接器似乎将静态和可分页代码分配给内核地址空间中的同一页面(即变量位于0xEFFCB0A0,函数位于0xEFFCB600 - 使用windbg验证)。静态变量用于中断环境,因此它们的页面必须锁定在内存中。但是如果同一页面包含可交换的代码,恐怕变量会突然消失。链接器的映射正确报告可分页代码位于不同的部分(“PAGE”),但偏移量(“Rva + Base”)位于包含静态的页面的中间。
如何强制链接器/加载器为可分页代码分配单独的页面?是否有一些“#pragma”强制部分对齐attibute?我做错了吗?
PS:驱动程序加载器肯定足够聪明,可以将包含变量和代码的页面放在页面缓冲池之外,但由于页面包含变量,因此必须是可写的。我更喜欢可执行代码在只读页面中。内核模式下错误的数组访问仍然很难调试......
PPS:在我的功能之前和之后添加了4096个“nop”......好吧,它有效...没有比这更好的建议了吗?
答案 0 :(得分:1)
将全局变量放在自己的数据段中:
#pragma data_seg("NONPAGE")
// declare your globals here
#pragma data_seg()
默认情况下,您的部分将使用读/写创建,而不是分页标记。
您可以指定其他部分选项:
#pragma comment(linker, "/section:NONPAGE,ERW")
或者您可以将链接器选项放在SOURCES
文件中:
LINKER_FLAGS = $(LINKER_FLAGS) /SECTION:NONPAGE,ERW
注意:如果您要构建库,请使用LIBRARIAN_FLAGS
代替