【问题标题】:Paged pool memory or Nonpaged pool memory ?? (windows driver development)分页池内存或非分页池内存? (windows驱动开发)
【发布时间】:2009-04-28 08:41:56
【问题描述】:

我是 Windows 驱动程序开发的新手。我只是想知道,驱动程序中的全局变量将使用分页池内存还是非分页池内存?

感谢和问候

纳瓦内斯

【问题讨论】:

    标签: windows-xp kernel device-driver


    【解决方案1】:

    视情况而定。非分页池应保留用于必须保留在 RAM 中的内存,因此,如果您正在执行可能受磁盘操作中的内存页面影响的关键操作,请使用非分页。

    请参阅here 了解更多信息。

    看看this(尽管它讨论的是c++而不是C),默认情况下,全局变量似乎可以通过#pragma定位。同样在this 的 p22 上,我们看到了如何做到这一点。最后this discuss这里我们看到数据段默认是不可分页的。

    【讨论】:

    • 不。我的问题是,如果我在设备驱动程序中声明一个全局变量,将使用哪个内存,即分页池内存或非分页池内存?(局部变量将使用非分页池记忆)。
    • 这不会取决于。它将是分页池或非分页池。
    • #pragma data_seg("PAGE") int foo; #pragma data_seg("NONPAGE") 整数条; -- 这里的 foo 是可分页的,而 bar 是非分页的。如果你不给它一个 pragma,默认是非分页的。
    【解决方案2】:

    内核模式驱动程序中的全局变量是从 NonPagedPool 分配的。

    你也可以使用设备扩展(当你调用 IoCreateDevice 时),它总是从非分页内存中分配的。

    我希望这会有所帮助, 马丁

    【讨论】:

    • 这不是真的。 Windows 中的内核驱动程序是具有多个部分的 PE 文件,与普通的用户模式程序不同,KM 驱动程序通常有 两个 数据部分 - 一个是分页的,一个是非分页的(偶尔还有一个第三个在 KM 驱动程序初始化后被丢弃)。在您的代码中,您可以通过使用 alloc pragma 来选择您的变量(或实际上是函数)是分页的还是非分页的。
    【解决方案3】:

    我找到的另一个很好的答案是:“非分页池是内核内存,当 Windows 用完可用物理内存时,它不能被分页到页面文件中。驱动程序使用它来分配他们需要的内存。”来自here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-30
      • 2012-02-22
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      • 2011-03-24
      • 2010-11-18
      • 1970-01-01
      相关资源
      最近更新 更多