0

我所有的驱动程序代码目前都是这样做的,主要是因为我与一位非常资深的驱动程序程序员一起工作了几年,他之前在 Windows 内核团队工作了 15 年,他要求这样做。我养成了这样的习惯,从来没有真正问过“为什么?”这个问题。

我知道明显的原因,例如与分页相比,非分页池稀缺,并且您无法对目标系统做出假设(例如有多少非分页内存可用)。但是我们最近继承了许多 Linux 驱动程序程序员,他们开始使用我的驱动程序代码(显然在 Linux 中没有这样的区别),当我告诉他们代码/数据必须随时放入分页池时,他们都起身了可能的。

那么,我们进行分页/非分页池分配的真正原因是什么?

4

1 回答 1

4

简而言之,Windows 试图通过对其内核分配进行分页来最小化内存消耗。

更长的版本:任何非分页分配必须保留在物理内存中,直到被释放。因此,这些分配会消耗虚拟地址空间和物理内存。虚拟地址在 32 位系统中非常有限,因此驱动程序分配是在稀缺的空间中进行的(因为分配是全局的)。在 64 位 Windows 系统上,有相当大的 VA 空间,因此这不是特别值得关注的问题。

但是,每个分配仍然使用物理内存。因此用户无法使用的内存可能很小(目前在我的机器上大约为 2.5%)。在 VM 环境中运行时会出现更大的问题,因为这些分配是累积的。因此,减少非分页分配将允许更多 VM 实例在物理机器上运行。

分页分配可以分页到磁盘,因此只能在 PASSIVE 和 APC 级别访问,否则您可能会看到蓝屏,因为 Windows 无法在更高的 IRQL 处处理页面错误。

重复:

  1. 如果您的驱动程序在 DPC 或更高的 IRQL 下运行,则确定将您的代码/数据合理划分为这些级别所需的部分,并将它们设为 NONPAGED。
  2. 如果您的驱动程序不更改 IRQL,也不接受中断,则将所有分配 PAGED 设置为一个好公民并最大限度地减少您的物理内存使用量。
于 2010-09-28T20:25:26.293 回答