特殊池功能将 Windows 配置为在使用指定的池标记分配内存或分配的内存处于指定大小范围内时,从保留内存池中请求内存分配。
Abbreviation |
spp |
十六进制值 |
(无) |
符号名称 |
(无) |
目的地 |
系统范围的注册表项 (Windows Vista 及更高版本)系统范围的注册表项,内核标志 |
选择池标记
为特定池标记请求特殊池时,请确保驱动程序或其他内核模式程序使用唯一的池标记。
此外,在创建池标记(如使用 ExAllocatePoolWithTag)时,请考虑按相反顺序输入标记字符。 例如,如果标记为 Fred,请考虑将其输入为 derF (0x64657246)。 池标记存储在注册表中,并按反向(下端顺序)显示在调试器和其他工具中。 如果按相反顺序输入它们,它们将按正向顺序显示(0x46726564)
如果怀疑驱动程序耗尽了所有的特殊池资源,请考虑在代码中使用多个池标记。 然后,可以多次测试驱动程序,在每次测试中将专用内存池分配给一个特定的池标记。
此外,选择具有十六进制值的池标记,该值大于系统的页大小。 对于内核模式代码,如果输入的池标记值小于 PAGE_SIZE,Gflags 会为大小在相应范围内的所有分配请求特殊池,并为具有等效池标记的分配请求特殊池。 例如,如果选择的大小为 30,则特殊池将用于大小在 17 到 32 字节之间的所有分配,以及池标记为 0x0030 的分配。
选择分配大小
使用以下准则为特殊池功能选择分配大小。
在具有 x86 处理器的计算机上,PAGE_SIZE 0x1000,分配大小范围长度为 8 字节。 若要为此范围中大小的所有分配配置特殊池功能,请输入等于此范围上限加上 8 的数字。 (此数字始终为 8 的倍数。下表说明了这些值:
| 大小范围 | 输入此数字 |
|---|---|
1 到 8 个字节 |
10 (十进制 16) |
9 到 16 字节 |
18 (小数 24) |
17 到 24 字节 |
20 (十进制 32) |
... |
... |
0xFE9到0xFF0字节 |
FF8 (十进制 4088) |
在具有 AMD x86-64 处理器的计算机上,PAGE_SIZE 0x1000,分配大小范围长度为 16 字节。 若要为此范围中大小的所有分配配置特殊池功能,请输入等于此范围最大值加上 16 的数字。 (此数字始终为 16 的倍数。下表说明了这些值:
| 大小范围 | 输入此数字 |
|---|---|
1 到 16 字节 |
20 (十进制 32) |
17 到 32 字节 |
30 (十进制 48) |
33 到 48 字节 |
40 (十进制 64) |
... |
... |
0xFD1到0xFE0字节 |
FF0 (十进制 4080) |
在任何处理器的计算机上,可以使用星号( * )或0x2A(十进制 42)为系统上的所有内存分配配置特殊池功能。
批注
有关在“全局标志”对话框中配置特殊池功能的信息,请参阅 “配置特殊池”。 有关在命令行配置特殊池功能的信息,请参阅 GFlags 命令。 有关示例,请参阅 示例 14:配置特殊池。
Gflags 的特殊池功能会指示 Windows 当使用特定的池标记进行内存分配或内存在指定大小范围内时,从保留的内存池中请求内存分配。 若要为特定驱动程序的所有分配请求特殊内存池,请使用驱动程序验证工具。 有关详细信息,请参阅 Windows 驱动程序工具包(WDK)的“驱动程序验证程序”部分中的“特殊池”主题。
Gflags 和驱动程序验证程序的特殊池功能可帮助你检测和识别内核池使用中的错误源,例如在分配的内存空间之外写入或引用已释放的内存。
并非所有特殊池请求都得到满足。 特殊池中的每次分配使用一页不可分页的物理内存和两页虚拟地址空间。 如果特殊池已用尽,则会从标准池分配内存,直到特殊池再次可用。 从标准池填充特殊池请求时,请求函数将返回成功状态。 它不会返回错误,因为分配已成功,即使它未从特殊池填充。
特殊池的大小随系统上的物理内存量增加:理想情况下,这应至少为 1 GB(GB)。 在 x86 计算机上,由于虚拟空间(除了物理空间)被占用,在使用特殊池时请勿使用 /3GB 启动选项。 最好将页面文件的最小/最大数量增加到原来的两到三倍。
还可以配置特殊池功能,以对齐内存分配,从而检测对分配前内存的引用(“下溢”)或对超出分配内存的引用(“溢出”)。 此功能仅在 Windows 的所有版本的“全局标志”对话框中可用。 有关详细信息,请参阅 检测溢出和不足。
在 Windows Vista 和更高版本的 Windows 上,可以将特殊池功能配置为需要重新启动的注册表设置,但在更改之前仍有效,或者作为不需要重新启动的内核标志设置,但仅在重新启动或关闭 Windows 之前有效。 在早期版本的 Windows 中,特殊池仅可用作注册表设置。
在 Windows Vista 和更高版本的 Windows 上,可以使用“全局标志”对话框或命令行配置特殊池功能。 在早期版本的 Windows 中,此功能仅在“全局标志”对话框中可用。