1

对于 WinXP 32 位,我在使用 DDK(一个相当旧的版本:3590)时遇到了一个(可能的)问题。我的驱动程序包含一些未初始化的静态变量(我想它们应该分配给 .bss 部分)和可分页代码部分中的一些函数(标有#pragma alloc_page(PAGE, func))。可分页代码收集在单独的目标文件中。我发现链接器似乎将静态和可分页代码分配给内核地址空间中的同一页面(即变量位于 0xEFFCB0A0 且函数位于 0xEFFCB600 - 已通过 windbg 验证)。静态变量在中断环境中使用,因此它们的页面必须锁定在内存中。但如果同一页面包含可交换代码,恐怕变量会突然消失。链接器'

如何强制链接器/加载器将单独的页面分配给可分页代码?是否有一些“#pragma”来强制部分对齐属性?难道我做错了什么?

PS:驱动程序加载器确实足够聪明,可以将包含变量和代码的页面从分页池中取出,但是由于页面包含变量,它必须是可写的。我希望可执行代码位于只读页面中。内核模式下错误的数组访问仍然很难调试......

PPS:在我的函数之前和之后添加了 4096 个“nop”......好吧,它有效......没有更好的建议吗?

4

1 回答 1

1

将您的全局变量放在他们自己的数据段中:

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

来源:data_seg 上的 MSDN 链接

默认情况下,您的部分将使用读/写创建,而不是分页标志。

您可以指定其他部分选项:

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

来源:/SECTION 上的 MSDN 链接

或者您可以将链接器选项放在SOURCES文件中:

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

注意:如果您正在构建库,请LIBRARIAN_FLAGS改用

于 2013-06-16T07:42:51.267 回答