【问题标题】:#pragma alloc_text(PAGE) code not page-aligned#pragma alloc_text(PAGE) 代码不是页面对齐的
【发布时间】:2011-05-15 20:31:50
【问题描述】:

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

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

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

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

【问题讨论】:

  • 哇,这个问题肯定在这里挂了很久。您确定驱动程序可执行代码通常是只读的吗?毕竟,将代码设为只读似乎是一个相当近期的“趋势”。

标签: memory-management drivers kernel wdk


【解决方案1】:

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

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

来源:MSDN link on data_seg

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

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

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

来源:MSDN link on /SECTION

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-13
    • 2018-11-01
    • 2011-01-17
    • 1970-01-01
    • 2013-01-13
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多