我在WinXP 32位的DDK (一个相当老的版本: 3590)上遇到(可能)问题。我的驱动程序包含一些未初始化的静态变量(我想,它们应该被赋值给.bss部分)和一个可分页的代码部分中的一些函数(用#alloc_page(页面,函数)标记)。可分页的代码收集在一个单独的目标文件中。我发现链接器似乎将静态代码和可分页代码分配给内核地址空间中的同一页(即变量位于0xEFFCB0A0,函数位于0xEFFCB600 -使用windbg验证)。静态变量在中断环境中使用,因此它们的页面必须锁定在内存中。但是,如果同一页面包含可切换的代码,我担心变量可能会突然消失。链接器的映射正确地报告可分页代码在不同的部分(“页面”)中,但偏移量("Rva+Base")在包含静态信息的页面的中间。
如何强制链接器/加载器将单独的页分配给可分页的代码?是否有一些“#杂注”来强制段对齐属性?我做错了什么吗?
PS:驱动程序加载器肯定足够智能,可以将包含变量和代码的页面放到分页池之外,但由于页面包含变量,因此它必须是可写的。我更希望可执行代码位于只读页面中。在内核模式下错误的数组访问仍然很难调试...
PPS:在我的函数前后增加了4096个“nop”...好吧,它起作用了..。没有更好的建议了吗?
发布于 2013-06-16 15:42:51
将您的全局变量放在它们自己的数据段中:
#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
https://stackoverflow.com/questions/4279824
复制相似问题