Windows #pragma alloc_文本(第页,函数名)

Windows #pragma alloc_文本(第页,函数名),windows,winapi,pragma,virtual-memory,Windows,Winapi,Pragma,Virtual Memory,此代码通常用于设备驱动程序。 当系统需要时,foo函数将被交换 问题 它在用户空间代码中工作吗?该功能是否也会被分页 如果没有pragma,我的意思是默认情况下,是否所有内核级函数都分配了非分页内存 PE文件加载器是否决定函数的分配位置 默认情况下,用户模式程序会被交换。你需要别的东西是不寻常的。听起来像是一个设备驱动程序要求常驻以处理中断或诸如此类的事情。用户模式程序不会这样做。如果您编译一个简单的hello world驱动程序,那么您将看到名为“.text”的PE(可移植可执行文件)部分将

此代码通常用于设备驱动程序。
当系统需要时,foo函数将被交换

问题

  • 它在用户空间代码中工作吗?该功能是否也会被分页
  • 如果没有pragma,我的意思是默认情况下,是否所有内核级函数都分配了非分页内存
  • PE文件加载器是否决定函数的分配位置

默认情况下,用户模式程序会被交换。你需要别的东西是不寻常的。听起来像是一个设备驱动程序要求常驻以处理中断或诸如此类的事情。用户模式程序不会这样做。

如果您编译一个简单的hello world驱动程序,那么您将看到名为“.text”的PE(可移植可执行文件)部分将设置“不可分页”特征标志。因此,是的,默认情况下,所有驱动程序代码都位于该部分,除非您将其标记为可分页,这将使其最终位于“页面”部分而不是“.text”部分。

那么,我们如何做用户模式代码(文本)无法交换?有可能吗?我不知道,我从没试过。无论如何,一个应用程序为自己获取物理内存,而为其他所有应用程序保留更少的内存是非常不礼貌的。非分页内存实际上是为中断处理程序设计的,在这种情况下,您无法在已有的基础上处理页面错误中断。您是对的。这简直是胡说八道。可以使用VirtualLock锁定用户模式数据。它永远不会被翻页。我想我们也可以制作不可交换的用户模式函数(文本)。
#pramga alloc_text(PAGE, foo)

void foo(){ return; }