代码之家  ›  专栏  ›  技术社区  ›  Giuseppe Guerrini

#pragma alloc_text(PAGE)代码未按页对齐

  •  1
  • Giuseppe Guerrini  · 技术社区  · 14 年前

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

    如何强制链接器/加载程序为可分页代码分配单独的页?是否有一些“#pragma”来强制剖面对齐attibute?我做错什么了吗?

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

    PPS:在我的函数前后添加4096“nop”。。。好的,它工作。。。没有更好的建议?

    1 回复  |  直到 12 年前
        1
  •  1
  •   jabaldonedo    11 年前

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

    #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 相反