Cómo asignar RAM del adaptador en el espacio de direcciones de proceso

Seleccione idioma Seleccione idioma
Id. de artículo: 189327 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

Cuando asigna una gran cantidad de memoria del adaptador, puede recibir uno de los síntomas siguientes:
  • Falta de disponibilidad del sistema NO_MORE_SYSTEM_PTES (PTE).
  • No hay proceso contiguo dirección espacio suficiente.
En este artículo se explica:
  • ¿Por qué se producen estos problemas
  • cómo trabajar a su alrededor
  • espacio de direcciones de dos formas de asignar memoria del adaptador en un proceso

Más información

Introducción a entradas de tabla de páginas (PTE)

Cada proceso que se ejecuta en un sistema Windows NT tiene una dirección virtual de 4 GB comprendidos entre 0 x 00000000 y 0xFFFFFFFF para su uso. Esto, la dirección de 2 GB superior desde 0x8000000 hasta 0xFFFFFFFF es común a todos los procesos que se ejecutan en el sistema y se denomina espacio de direcciones del núcleo o del sistema. El área inferior comprendidos entre 0 x 00000000 y 0x7FFFFFFF se denomina espacio de direcciones de usuario.

Desde la perspectiva de proceso, cada elemento de dirección virtual hace referencia conceptualmente a un byte de memoria física. Es responsabilidad del Administrador de memoria virtual (VMM) junto con la unidad de administrador de memoria de procesador (MMU), convertir o asignar cada dirección virtual a una dirección física correspondiente. El VMM realiza la asignación dividiendo la cantidad de RAM en marcos de página de tamaño fijo, crear tablas de la página para almacenar información acerca de estos marcos de página y asignándolos. Cada PTE representa un marco de página y contiene información necesaria para que el VMM encuentre una página.

En un sistema x 86 que utiliza un tamaño de página de 4 KB, el número máximo de PTE necesarias para asignar 2 GB de espacio de direcciones es 524.288 (2 GB/4 KB). En un sistema típico, este espacio se utiliza como sigue:
  • Un máximo de 50.000 PTE (aproximadamente 195 MB espacio de direcciones) están reservados para uso general.
  • El resto se utiliza en la asignación de caché del sistema, hiperespacio, grupo paginado, bloque no paginado, área de volcado de bloqueo y así sucesivamente.
Este tamaño de grupo PTE se determina automáticamente al iniciar el sistema según la cantidad de memoria física en el sistema. Este grupo se introduce entre paginado y no paginado, que también crece con la cantidad de memoria física en el sistema así.

El sistema utiliza estas PTE para crear las pilas de subprocesos de núcleo, cargar controladores de dispositivos (y sus DLL), para asignar espacio de direcciones virtual del sistema para las transferencias de E/s o de los llamadores de MmMapIoSpace/MmMapLockedPages/MmGetSystemAddressForMdl/MmAllocateNonCachedMemory y otros varios fines. Este grupo PTE de sistema puede se convierten en un uso intensivo y muy fragmentado. Esto significa que el controlador no podrían obtener suficiente espacio de direcciones virtuales contiguas desde el grupo PTE de sistema en cualquier momento, incluso aunque el total de direcciones espacio restante sigue en ella podría ser lo suficientemente grande.

También significa que si el controlador utiliza grupo PTE de sistema completamente, otras partes del sistema lo que puede resultar, incluso en subprocesos que no se crean, paradas del sistema y comprobaciones de errores completamente (porque algunos controladores de llamar a asignar-memoria del sistema con el parámetro MustSucceed establecido).

Debe ser sumamente cuidadoso al utilizar este mapa de grupo. Utilice las partes de la RAM que necesita realmente del sistema del adaptador de acceso a desde cualquier contexto de proceso y asignan sólo la cantidad que necesita. No asigne el intervalo de adaptador todo si no necesita realmente acceder a él todo en modo de sistema.

importante : desasignar la memoria tan pronto como termine de trabajar en el contexto correcto. En caso contrario, el sistema se ejecutará fuera de PTE, y se caza de verificación. Puede aumentar el número predeterminado de calcula PTE basados en la memoria total del sistema, copia a un valor máximo agregando un número (igual que el número de páginas a aumentarse) en el registro en:
   HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager
   \Memory Management\SystemPages
				
, también puede supervisar actualmente disponible "entradas libres de páginas del sistema tabla" con el Monitor de rendimiento.

Nota : no se utilizan las páginas de memoria del adaptador para la sustitución de la página. Permanecen asignadas al espacio de direcciones del proceso incluso si el proceso está inactivo o completamente intercambiado fuera.

Siguiente es las dos formas más comunes de asignar memoria del adaptador. El primer método asigna la memoria directamente en el espacio de usuario del proceso y el segundo método asigna en espacio del proceso sistema y, opcionalmente, en el espacio de usuario. Ambos métodos requieren la memoria física sean contiguos. Debido a de la limitación de PTE, es posible que no pueda asignar una gran cantidad de memoria en el espacio del sistema. Sin embargo, puede asignar en el espacio de usuario si no está fragmentado o utilizado.

Método de objeto de sección

No hay un ejemplo (MAPMEM) en el DDK de Windows NT 4.0 (disponible a través de suscripciones de MSDN Professional) que muestra cómo realizar esta asignación. Aquí es un esquema de la técnica:

  1. Obtener la dirección física traducida de la memoria del adaptador (HalTranslateBusAddress).
  2. Abrir un identificador de sección (ZwOpenSection) para el \Device\PhysicalMemory de dispositivo de memoria física.
  3. Hacer referencia el identificador de objeto (ObReferenceObjectByHandle) para evitar que se va a eliminar.
  4. Asignar la memoria (ZwMapViewOfSection).
Sólo es válida en el contexto del proceso que se asigna la dirección virtual que recibe de la ZwMapViewOfSection. Si desea tener acceso a la memoria en llamada del controlador en el procedimiento diferidas (DPC) o interrumpir la rutina de servicio (ISR) se ejecuta en un contexto de proceso arbitrario, también debe asignar la memoria en el espacio de direcciones del sistema (Utilice el método siguiente). Desasignar (ZwUnMapViewOfSection) la memoria en el mismo contexto de proceso que asignado antes de que sale.

Nota : en general, puede ser peligroso utilizar el ZwMapViewOfSection mediante \Device\PhysicalMemory a menos que ya dispone de páginas físicas. Un controlador que asigna las páginas que no posee casi siempre causas daños en la memoria porque el propietario puede cambiar los atributos de página, libere las páginas y realizar otros cambios. Las unidades deben asignar sólo la memoria que poseen. Además, es estrictamente no válido para asignar una dirección física simultáneamente con dos atributos diferentes (es decir, en caché frente a frente sin almacenamiento en caché writecombined). Esto hace que daños de TLB de procesador y resultados imprevisibles.

En WindowsXP, la función de ZwMapViewOfSection devuelve el error STATUS_CONFLICTING_ADDRESSES si controladores intentan asignar la misma dirección física simultáneamente con atributos en conflicto.

Método MmMapIoSpace

Este método muestra cómo asignar la memoria en el espacio de direcciones de proceso del sistema y en el espacio de dirección de usuario de proceso.
  1. Obtenga la dirección física traducida de la memoria del adaptador (HalTranslateBusAddress).
  2. Asignar la memoria al espacio de direcciones no paginada del sistema como sigue:
          SystemVirtualAddress = MmMapIoSpace(PhysicalAddress, SizeofMemory,
             CacheEnable);
    					
  3. Asignar un Mdl:
          Mdl = IoAllocateMdl(SystemVirtualAddress, SizeOfMemory, FALSE, FALSE,
             NULL);
  4. La MDL para describir las páginas de memoria de la generación:
          MmBuildMdlForNonPagedPool(Mdl);
  5. Asignar la memoria en el proceso del espacio de usuario mediante MmMapLockedPages. Puesto que hay una incoherencia en el valor devuelto de esta función entre versiones anteriores a SP4 y posterior a SP4 de Windows NT, utilice la instrucción siguiente para que este código sea compatible con todas las versiones de Windows:
          UserVirtualAddress = (PVOID)(((ULONG)PAGE_ALIGN(MmMapLockedPages(Mdl,
             Mode))) + MmGetMdlByteOffset(Mdl));
    					
Para obtener información adicional, haga clic en el número de artículo siguiente para ver el artículo en Microsoft Knowledge Base:
199311INFORMACIÓN: MmMapLockedPages devuelve dirección virtual real en SP4
La ventaja de este método es que obtendrá SystemVirtualAddress, que pueden utilizarse en cualquier contexto de proceso (como DPC y ISR) y un UserVirtualAddress que pueden utilizar la aplicación de modo de usuario en cuyo contexto se asigna.

Si asigna al espacio de direcciones del sistema, debe desasignar como sigue:
MmUnmapIoSpace(SystemVirtualAddress, SizeofMemory);
				
si asigna al espacio de direcciones de usuario, debe desasignar manera sólo mientras se ejecuta en el contexto del proceso en el que se asigna la memoria:
MmUnmapLockedPages(UserVirtualAddress, Mdl); 

Finally, free the MDL by calling:

IoFreeMdl(Mdl);
				

Referencias

Para obtener más información, vea la documentación del DDK de Windows NT 4.0 o "en Windows NT" Helen Custer (Microsoft Press 1993).

Propiedades

Id. de artículo: 189327 - Última revisión: lunes, 7 de marzo de 2005 - Versión: 1.2
La información de este artículo se refiere a:
  • Microsoft Win32 Device Driver Kit for Windows NT 4.0
Palabras clave: 
kbmt kbhowto kbkmode KB189327 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 189327
Renuncia a responsabilidad de los contenidos de la KB sobre productos a los que ya no se ofrece asistencia alguna
El presente artículo se escribió para productos para los que Microsoft ya no ofrece soporte técnico. Por tanto, el presente artículo se ofrece "tal cual" y no será actualizado.

Enviar comentarios

 

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