我的所有驱动程序代码目前都是这样做的,主要是因为我与一位非常高级的驱动程序员一起工作了几年,之前曾在Windows内核团队工作了15年并且他要求它。我养成了它的习惯,从未真正问过“为什么?”这个问题。
我知道显而易见的原因,例如非分页池与分页相比很少,你无法对目标系统做出假设(比如有多少非分页内存可用)。但是我们最近继承了一大批Linux驱动程序员,他们开始使用我的驱动程序代码(显然在Linux中没有这样的区别),当我告诉他们代码/数据必须放在页面缓冲池中时,他们全都搞定了。可能的。
那么,我们进行分页/非分页池分配的真正原因是什么?
答案 0 :(得分:4)
简而言之,Windows尝试通过分页内核分配来最小化内存消耗。
更长版本:任何非分页分配必须保留在物理内存中,直到取消分配。因此,这些分配消耗虚拟地址空间和物理内存。虚拟地址在32位系统中非常有限,因此驱动程序分配是由稀缺空间构成的(因为分配是全局的)。在64位Windows系统上,存在相当大的VA空间,因此这不是特别关注的问题。
但是,每个分配仍然使用物理内存。因此用户无法使用的内存,可能很小(当前在我的机器上约为2.5%)。在VM环境中运行时会产生更大的问题,因为这些分配是累积的。因此,减少非分页分配将允许更多VM实例在物理机器上运行。
分页分配可以分页到磁盘,因此只能在PASSIVE和APC级别访问,否则你可能会看到蓝屏,因为Windows无法在更高的IRQL上处理页面错误。
重申: