对于Winxp 32位,我面临DDK(一个相当旧的版本:3590)的(可能)问题。我的驱动程序包含一些未化为不化的静态变量(我想它们应分配给.bss部分),并在可触摸的代码部分中(标有#pragma alloc_page(page,func))中的一些函数。 PAGABLE代码收集在单独的对象文件中。我已经发现,链接器似乎将静电量和可打开代码分配给内核地址空间的同一页面(即变量为0xeffCB0A0,该函数为0xeffcb600-通过WINDBG验证)。静态变量用于中断环境中,因此必须将其页面锁定在内存中。但是,如果同一页面包含可交换代码,恐怕变量会突然消失。链接器的地图正确地报告了Pagable代码在不同的部分(“页面”)中,但是偏移量(“ RVA+BASE”)位于包含静态功能的页面中间。

如何强制链接器/加载程序将单独的页面分配给Pagable代码?是否有一些“ #pragma”来迫使该部分的对齐方式进行调整?难道我做错了什么?

PS:驱动程序加载程序肯定足够聪明,可以将页面缩放,将变量和代码置于分类池之外,但是由于该页面包含变量,因此必须是可写的。我更喜欢可执行的代码在只读页面中。在内核模式下,错误的数组访问很难调试...

pps:在我的功能之前和之后添加了4096“ nop” s ...好吧,它有效...没有什么更好的建议?

有帮助吗?

解决方案

将您的全球群体放在自己的数据段中:

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

来源: data_seg上的msdn链接

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

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

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

来源: MSDN链接 /部分

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

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

注意:如果您要建立库,请使用 LIBRARIAN_FLAGS 反而

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top