如何映射到进程地址空间的适配器内存

文章翻译 文章翻译
文章编号: 189327 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

当您映射大量适配器内存时,您可能会收到下列症状之一:
  • 系统 pte (NO_MORE_SYSTEM_PTES) 不可用。
  • 没有足够的连续的进程地址空间。
本文解释:
  • 发生这些问题的原因
  • 如何解决它们
  • 两种方法可以映射到进程地址空间的适配器内存

更多信息

简介页表项 (PTE)

在 Windows NT 系统运行的每个进程具有 4 GB 虚拟地址范围从 0x00000000 到 0xFFFFFFFF 供其使用。这,上部的 2 GB 地址范围到 0xFFFFFFFF 0x8000000 是常见系统中, 运行的所有进程,它被称为内核或系统的地址空间。较低的区域从 0x00000000 0x7FFFFFFF 到称为用户地址空间。

从进程的角度虚拟地址的每个元素从概念上讲是指一个字节的物理内存。它负责的虚拟内存管理器 (VMM) 配合处理器内存管理器单元 (MMU) 转换,或将每个虚拟地址映射到相应的物理地址。VMM 映射来执行将内存划分为固定大小页框架创建页表来存储这些页帧有关的信息并将它们映射。每个 PTE 表示页面框架,并包含所需的查找页面 VMM 信息。

在 x 基于 x86 的系统上使用 4 KB 页大小的映射 2 GB 地址空间的所需的 pte 的最大数目为 524,288 (2 GB/4 KB)。在典型系统上使用此空间,如下所示:
  • 保留了最大为 50,000 pte (大约 195 MB 地址空间) 以供常规使用。
  • 其余部分用于映射系统缓存、 超空间、 页面缓冲的池、 非页面缓冲的池、 故障转储区域和等等。
在基于在 $ 系统中的物理内存量的系统启动时自动确定此 PTE 池大小。该池被挤压在页面缓冲的池和还与物理内存量增长以及系统中的非分页缓冲的池之间。

系统将创建内核线程堆栈、 加载设备驱动程序 (和其 dll),将系统虚拟地址空间映射的 I/O 传输或调用方的 MmMapIoSpace/MmMapLockedPages/MmGetSystemAddressForMdl/MmAllocateNonCachedMemory 和其他杂项目的使用这些 pte。此系统 PTE 池可以成为频繁使用,并严重碎片化。这意味着您的驱动程序可能无法从系统 PTE 池获得足够的连续虚拟地址空间,在任何给定时间即使总地址仍在其剩余的空间可能不够大。

这也意味着如果您的驱动程序安装系统 PTE 池完全使用,其他部分的系统性能将会降低,甚至造成线程无法创建,系统停止和彻底的错误检查 (因为某些驱动程序将调用分配-系统-内存参数设置了 MustSucceed)。

您必须使用此池仅映射时一定要非常小心。使用的适配器您真正需要系统的内存部分从任何过程上下文的访问和映射只需要的数量。如果您并不真正需要对所有从系统模式下对其进行访问,并不映射整个适配器范围。

重要提示: 取消内存映射为适当的进程上下文中完成。否则为系统将会超出 pte,它将错误检查。您可以增加默认数 pte 计算基于总系统内存最多到最大值通过添加一个号 (等于的页数增加) 到在注册表:
   HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager
   \Memory Management\SystemPages
				
,您也可以监视当前可用"可用系统页表项"使用性能监视器。

: 该适配器内存页未用于页替换。即使在过程是空闲或完全交换出,它们保持映射到进程的地址空间。

以下是两个最常用的方法映射适配器内存。第一种方法将内存映射到进程的用户空间的直接和第二种方法映射到进程的系统空间和 (可选) 用户空间。这两种方法要求是连续的物理内存。 由于的 PTE 的限制可能不能将大量的系统空间中的内存映射。但是,您可能能够将映射到用户的空间,如果它不是碎片化,或用完。

部分对象方法

在 Windows NT 4.0 DDK (可通过 MSDN 专业成员身份),显示如何执行此映射中没有一个示例 (MAPMEM)。下面是该技术的大纲:

  1. 获取已翻译的物理地址的适配器内存 (HalTranslateBusAddress)。
  2. 打开到物理内存设备 \Device\PhysicalMemory 的部分句柄 (ZwOpenSection)。
  3. 引用该对象句柄 (ObReferenceObjectByHandle) 以防止其被删除。
  4. 映射内存 (ZwMapViewOfSection)。
虚拟地址可获得该 ZwMapViewOfSection 只是它映射的过程的上下文中有效的。如果您想要访问您的驱动程序延迟的过程调用 (DPC) 在内存或中断服务例程 (ISR) 可以运行在任意的进程的上下文中,也应该映射系统地址空间 (使用下一种方法) 中的内存。取消映射 (ZwUnMapViewOfSection) 在同一内存的进程上下文映射之前退出。

: 一般情况下,也可以是危险使用 ZwMapViewOfSection 使用 \Device\PhysicalMemory,除非您已经拥有物理页面。 映射它不拥有几乎总是导致内存损坏因为所有者可更改页面属性页的驱动程序释放了的页面,并进行其他更改。 驱动器应该映射只他们所拥有的内存。此外,它是严格非法同时具有两个不同的属性的物理地址映射 (也就是缓存与 noncached 的与 writecombined)。 执行此操作会使处理器 TLB 损坏和不可预知的结果。

上 WindowsXP,ZwMapViewOfSection 函数返回 STATUS_CONFLICTING_ADDRESSES 错误,如果驱动程序试图同时具有冲突属性相同的物理地址映射。

MmMapIoSpace 方法

此方法显示如何将内存中进程系统地址空间和进程的用户地址空间中的映射。
  1. 获取已翻译的物理地址的适配器内存 (HalTranslateBusAddress)。
  2. 映射到非分页的系统地址空间的内存,如下所示:
          SystemVirtualAddress = MmMapIoSpace(PhysicalAddress, SizeofMemory,
             CacheEnable);
    					
  3. 分配一个 Mdl:
          Mdl = IoAllocateMdl(SystemVirtualAddress, SizeOfMemory, FALSE, FALSE,
             NULL);
  4. 生成来描述内存页 MDL:
          MmBuildMdlForNonPagedPool(Mdl);
  5. 映射到进程的内存的使用 MmMapLockedPages 用户空间。 因为此函数的 Windows NT 的预 SP4 和 SP4 版本之间的返回值中有不一致使用下面的语句,以使此代码与所有版本的 Windows NT 兼容:
          UserVirtualAddress = (PVOID)(((ULONG)PAGE_ALIGN(MmMapLockedPages(Mdl,
             Mode))) + MmGetMdlByteOffset(Mdl));
    					
有关更多的信息请单击下面文章编号,以查看 Microsoft 知识库中相应的文章:
199311信息: MmMapLockedPages 在 SP4 中返回实际虚拟地址
此方法的优点是您获得 SystemVirtualAddress,可用于在任何进程上下文中 (如 dpc 和 ISR) 和可在其上下文中它映射的用户模式应用程序由一个 UserVirtualAddress。

取消如果将映射到系统地址空间,您应映射,如下所示:
MmUnmapIoSpace(SystemVirtualAddress, SizeofMemory);
				
取消如果您将映射到用户地址空间,您应映射,如下所示仅在您要在其中映射内存的进程的上下文中运行时:
MmUnmapLockedPages(UserVirtualAddress, Mdl); 

Finally, free the MDL by calling:

IoFreeMdl(Mdl);
				

参考

详细的信息,请参阅 Windows NT 4.0 DDK 文档或"内部 Windows NT"由张三 Custer (Microsoft 新闻 1993)。

属性

文章编号: 189327 - 最后修改: 2005年3月7日 - 修订: 1.2
这篇文章中的信息适用于:
  • 适用于 Windows NT 4.0 的 Microsoft Win32 设备驱动程序工具包
关键字:?
kbmt kbhowto kbkmode KB189327 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 189327
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。
不再更新的 KB 内容免责声明
本文介绍那些 Microsoft 不再提供支持的产品。因此本文按“原样”提供,并且不再更新。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com