堆栈跟踪

这些系统 PTE 是什么?

Bob Golding and David Butler

内容

系统 API 被用来映射这些地址?
停止的 3F 不总是需要跟踪 PTE
内核堆栈

系统 PTE 像所有 PTE,代表系统地址空间中的地址。 使这些 PTE 不同,则是它们是系统资源。 只有那么多每个系统。 这些"系统 PTE"是表示的地址范围是系统地址空间中的保留,并且用于映射请求的页和将地址分配给缓冲区,或用于系统线程堆栈在系统地址空间图中的"动态段"。 地址范围居住页面缓冲的池非分页缓冲的池之间。 下面是从 mi386.h。

E1000000 | Start of paged system area         |
         |   Kernel mode access only.         |
         |                                    |
         |                                    |
         +------------------------------------+
         |                                    |
         | System PTE area - for mapping      |
         |   kernel thread stacks and MDLs    |
         |   that require system VAs.         |<----- Range reserved for dynamic mapping. 
         |   Kernel mode access only.         |
         |                                    |
         +------------------------------------+
         |                                    |
         | NonPaged System area               |
         |   Kernel mode access only.         |
         |                                    |
         +------------------------------------+
FFBE0000 | Crash Dump Driver area             |
         |   Kernel mode access only.         |
         +------------------------------------+

因此由于其大小是分页和非分页缓冲池之间,调整这些内存池造成的影响映射窗口的大小。 此外,因为这是在地址空间的一部分,影响内存池 (这就是 3GB) 的大小的因素将影响映射窗口的大小。

系统 API 被用来映射这些地址?

将这些地址映射的某些 API 是 MiMapLockedPagesInUserSpace、 MiUnmapLockedPagesInUserSpace、 MmMapLockedPages,和 MmUnmapLockedPages。 这些 API 映射到动态地址范围的缓冲区。 它们将使缓冲区大小,则确定多少连续页获取用于映射在整个的缓冲区。

正如您所看到的有是每个映射 API 的 unmap API。 这一点要注意非常重要。 缓冲区应当是非映射 ; 否则,将关闭映射窗口中。 换句话说: 没有更多系统 PTE。 获取更多页映射多个系统 PTE 习惯。 如我之前的提到系统堆栈将使用此范围。 视频以及执行以映射视频缓冲区中。 因此有必须足够保留通过映射缓冲区。 当系统 PTE 获取低时, 将发生性能问题。 此外,可能停止 3F,但这些应少数,NT 代码是资源不足条件的更多容错。

停止的 3F 不总是需要跟踪 PTE

缺少系统 PTE 通常 troubleshot 使用 TrackPtes 查找大量在 PTE 的使用者。 但是,有时这是不有用因为 TrackPtes 未实现 sysptes.c 代码本身。 因此,就可以保留 PTE 不进行跟踪。 TrackPtes 只是由 MiReserveSystemPtes 的调用方的某些实现的。

内核堆栈

不会跟踪 TrackPtes 的一个常见的使用者是 sysptes 的内核堆栈。 幸运的是,内存管理器提供我们使用来映射内核堆栈的 sysptes 深入的多个全局。

在以下示例内存管理器只具有创建 23,000 sysptes。 这是很少但不是经常使用 / 3GB。 这些 sysptes 的 17,860 正在使用映射内核堆栈。 分析进程和线程未找到明显的泄漏,; 客户的应用程序体系结构需要许多 GDI 线程。 分析计算机的内存使用率之后, 我们能够优化内存管理器增加总系统 PTE,并进行足够的空间要运行的事项。

1: kd> !sysptes 

System PTE Information
  Total System Ptes 23006 

1: kd> dc nt!MmKernelStackPages l 1
80483680  000045c4                             .E..
1: kd> ?45c4
Evaluate expression: 17860 = 000045c4

1: kd> dc MmLargeStacks l 1
8048368c  0000037b
1: kd> dc MmSmallStacks l 1
8048367c  00000385
1: kd> ?37b*f
Evaluate expression: 13365 = 00003435
1: kd> ?385*3
Evaluate expression: 2703 = 00000a8f
1: kd> ?3435+a8f+37b+385
Evaluate expression: 17860 = 000045c4 

Bob Golding 后与 Microsoft 1997 年。 他是全局的升级,他支持 Microsoft 与其最重要的问题的最大客户服务团队在高级升级工程师。

David Butler 后与 Microsoft 2000。 他是全局的升级,他支持 Microsoft 与其最重要的问题的最大客户服务团队的升级工程师。