
Desde el lanzamiento de la edición anterior de este libro, el sistema operativo Windows ha recorrido un largo camino en las actualizaciones y los cambios conceptuales que han resultado en la nueva arquitectura estable del kernel de Windows 10.
El libro "Dispositivo interno de Windows" fue creado para profesionales que desean comprender la vida interna de los componentes principales de Windows 10. En base a esta información, será más fácil para los desarrolladores encontrar las soluciones de diseño correctas al crear aplicaciones para la plataforma Windows y resolver problemas complejos asociados con su operación. Los administradores del sistema, sabiendo lo que se encuentra debajo del capó debajo del sistema operativo, podrán comprender el comportamiento del sistema y resolver rápidamente los problemas de aumentar la productividad y diagnosticar fallas. Los profesionales de seguridad necesitarán información sobre cómo tratar las vulnerabilidades en el sistema operativo.
Dinámica de la lista de páginas
En la fig. 5.37 muestra un diagrama de estado de transiciones de bloques de página. Para simplificar, no proporciona una lista de páginas modificadas pero no grabables.
Los bloques de página se mueven entre las listas de páginas de las siguientes maneras.
1. Cuando un administrador de memoria necesita una página llena de ceros para reparar un error de página relacionado con el requisito de restablecer la página (acceso a una página que se define como completamente llena de ceros, o a una página cerrada, confirmada en modo de usuario que aún no se ha accedido), primero Se intenta obtener esta página de la lista de tales páginas. Si la lista está vacía, la página se toma de la lista de páginas libres y se llena con ceros. Si la lista de páginas libres está vacía, se accede a una lista de páginas en espera y una página de esta lista se llena con ceros.
2. Una de las razones de la demanda de páginas llenas de ceros es el cumplimiento de varios requisitos de seguridad, por ejemplo, criterios comunes (Criterios comunes). La mayoría de las disposiciones de los criterios generales indican que los procesos en modo de usuario deben recibir bloques de página a cero para que no puedan leer el contenido de la memoria de los procesos anteriores. Por lo tanto, el administrador de memoria proporciona procesos en modo de usuario con bloques de página anulados, a menos que la página se haya leído desde el almacenamiento de respaldo. En este caso, el administrador de memoria utiliza bloques de página sin restablecer, inicializándolos con datos del disco o del almacenamiento remoto. La lista de páginas llenas de ceros se repone de la lista de páginas libres con un hilo de programa del sistema llamado hilo de página cero; este es el hilo 0 en el proceso del sistema. El flujo de puesta a cero de la página está esperando que una señal funcione desde el objeto de puerta de enlace. Cuando hay ocho o más páginas en la lista gratuita, el portal emite un pitido. Pero el subproceso de puesta a cero de la página solo se inicia si al menos un procesador no tiene otros subprocesos ejecutables, ya que el subproceso de puesta a cero de la página comienza con la prioridad 0, y la prioridad más baja que se puede establecer para la secuencia de usuario es 1.
NOTA Cuando la memoria debido a la asignación de una página física por un controlador que llama a la función MmAllocatePagesForMdl o MmAllocatePagesForMdlEx debe llenarse con ceros por la aplicación de Windows que llama a la función AllocateUserPhysicalPages o AllocateUserPhysicalPagesNuma, o cuando la aplicación asigna páginas grandes que usan la memoria, el administrador de memoria usa la memoria vacía para usar el administrador de memoria muestra áreas más grandes que una secuencia de puesta a cero de página, restableciendo solo una página a la vez. Además, en sistemas multiprocesador, el administrador de memoria crea un subproceso de sistema adicional para la puesta a cero en modo paralelo (y en plataformas NUMA esto se hace en un estilo optimizado para la tecnología NUMA).
3. Cuando el administrador de memoria no necesita una página llena de ceros, primero accede a la lista de páginas libres. Si esta lista está vacía, va a la lista de páginas puestas a cero. Si la lista de páginas puestas a cero está vacía, va a la lista de páginas pendientes. Antes de que el administrador de memoria pueda usar el bloque de páginas de la lista de páginas en espera, primero debe regresar y eliminar el enlace del registro PTE no válido (o del registro PTE prototipo), que todavía apunta al bloque de páginas. Dado que las entradas de la base de datos de números PFN contienen punteros hacia atrás a la página anterior de la tabla de páginas de usuario (o al prototipo de página de grupo de entradas PTE para páginas compartidas), el administrador de memoria puede encontrar rápidamente la entrada PTE y realizar el cambio correspondiente.
4. Cuando un proceso debe abandonar una página de su conjunto de trabajo (ya sea porque se refiere a una página nueva y su conjunto de trabajo está lleno, o porque el administrador de memoria cortó su conjunto de trabajo), la página pasa a la lista de espera si permanece intacta (sin cambios), o en la lista de páginas cambiadas, si la página se cambió mientras estaba en la memoria física.
5. Cuando se completa el proceso, todas las páginas cerradas van a la lista de páginas libres. Además, si al cerrar el último enlace a la sección admitida por el archivo de página, la sección no tiene vistas visualizadas, las páginas de esta sección también entran en la lista de páginas libres.
EXPERIMENTO: VER LISTAS DE PÁGINAS GRATUITAS Y CERO
La publicación de páginas cerradas al final de un proceso se puede observar en la ventana de Información del sistema de Process Explorer. Primero debe crear un proceso con muchas páginas cerradas en su conjunto de trabajo. Ya hicimos esto en uno de los experimentos anteriores usando la utilidad TestLimit:
C:\Tools\Sysinternals>Testlimit.exe -d 1 -c 1500 Testlimit v5.24 - test Windows limits Copyright (C) 2012-2015 Mark Russinovich Sysinternals - www.sysinternals.com Process ID: 13928 Leaking private bytes with touch 1 MB at a time... Leaked 1500 MB of private memory (1500 MB total leaked). Lasterror: 0 The operation completed successfully.
El interruptor –d hace que TestLimit no solo seleccione la memoria como cerrada y confirmada, sino que también la “toque”, es decir, acceda a esta memoria. Esto da como resultado la asignación de memoria física y su asignación al proceso para liberar el área de memoria virtual cerrada y confirmada. Si el sistema tiene una cantidad suficiente de RAM disponible, se asignarán hasta 1,500 MB para el proceso en RAM. Ahora este proceso esperará hasta que lo obligue a completar o interrumpir el trabajo (posiblemente con la combinación de teclas Ctrl + C en su ventana de comandos). Sigue estos pasos.
1. Abra el Explorador de procesos.
2. Seleccione el comando VerInformación del sistema y seleccione la pestaña Memoria.
3. Observe el tamaño de las listas de páginas libres (puestas a cero) y libres (puestas a cero).
4. Finalice o anule el proceso TestLimit.
Es posible que pueda ver que la lista de páginas gratuitas ha aumentado momentáneamente de tamaño. Decimos "tal vez" porque la secuencia de puesta a cero de la página "se activará" tan pronto como haya solo ocho entradas en la lista de páginas puestas a cero, y funcionará muy rápidamente. Process Explorer actualiza esta ventana solo una vez por segundo, y parece que el resto de las páginas ya tienen tiempo para restablecer la lista de páginas de restablecimiento, mientras que logramos "atrapar" este estado. Si logras notar un aumento temporal en la lista de páginas libres, entonces verás que su tamaño caerá a cero, y se producirá un aumento correspondiente en la lista de páginas puestas a cero. Si se pierde el momento, solo verá un aumento en la lista de páginas puestas a cero.
EXPERIMENTO: VER LISTAS DE PÁGINAS CAMBIADAS Y ESPERADAS
El desplazamiento de páginas del conjunto de trabajo del proceso a la lista de páginas modificadas y luego a la lista de páginas en espera se puede observar utilizando los programas VMMap y RAMMap del paquete Sysinternals o en el depurador del núcleo. Sigue estos pasos.
1. Ejecute el programa RAMMap y observe el estado de calma del sistema. En este caso, es un sistema x86 con 3 GB de RAM. Las columnas en la ventana reflejan los diferentes estados de las páginas (ver Fig. 5.37). Algunas columnas que no son relevantes para este experimento se han reducido por conveniencia.
2. El sistema tiene aproximadamente 420 MB de RAM libre (que consta de páginas libres y puestas a cero). Alrededor de 580 MB aparecen en la lista de páginas de espera (por lo tanto, algunos de ellos están "disponibles", pero lo más probable es que contengan datos previamente perdidos por procesos o utilizados en supermuestreo). Cerca de 830 MB están activos y se asignan directamente a direcciones virtuales a través de entradas válidas de la tabla de páginas.
3. Cada línea se desglosa según los estados de las páginas por uso u origen (páginas de proceso cerradas, archivo visualizado, etc.). Por ejemplo, en el momento de los 830 MB activos, aproximadamente 400 MB se deben a la asignación de páginas cerradas del proceso.
4. Ahora, como en el experimento anterior, use la utilidad TestLimit para crear un proceso con una gran cantidad de páginas en el conjunto de trabajo. Aquí nuevamente, usamos el modificador –d para forzar a TestLimit a escribir en cada página, pero esta vez sin limitación, para crear tantas páginas modificadas como sea posible:
C:\Tools\Sysinternals>Testlimit.exe -d Testlimit v5.24 - test Windows limits Copyright (C) 2012-2015 Mark Russinovich Sysinternals - www.sysinternals.com Process ID: 7548 Leaking private bytes with touch (MB)... Leaked 1975 MB of private memory (1975 MB total leaked). Lasterror: 8
5. Ahora TestLimit ha creado 1975 áreas de asignación de 1 MB cada una. Para actualizar la pantalla en RAMMap, debe usar el comando FileRefresh para actualizar la pantalla, ya que RAMMap no lo hace por sí solo (debido al alto costo de esta operación).
6. Como puede ver, más de 2.8 GB están activos, de los cuales 2.4 GB están en la línea de páginas de proceso cerradas (Línea privada de proceso). Este es el resultado de asignar memoria y acceder a ella desde el proceso TestLimit. También tenga en cuenta que las listas de páginas en espera, puestas a cero y gratuitas ahora son mucho más pequeñas. La mayor parte de la memoria asignada a TestLimit se tomó de las páginas enumeradas en estas listas.
7. Luego, utilizando RAMMap, debe evaluar la asignación de las páginas físicas del proceso. Vaya a la pestaña Páginas físicas y configure el filtro en la parte inferior de la columna Proceso, configurándolo en Testlimit.exe. La siguiente ventana muestra todas las páginas físicas que forman parte del conjunto de trabajo del proceso.
8. Necesitamos identificar la página física involucrada en la asignación del espacio de direcciones físicas, que se realizó utilizando el modificador –d cuando se lanzó el programa TestLimit. RAMMap no da ninguna indicación de qué áreas virtuales se asignaron debido a la llamada desde la función RAMMap VirtualAlloc. Pero podemos obtener una pista valiosa sobre este tema utilizando el programa VMMap. Al llamar a VMMap para
del mismo proceso, obtenemos el siguiente resultado (ver la figura en la página 535 anterior).
9. En la parte inferior de la información mostrada hay cientos de áreas asignadas para datos de proceso cerrados, cada una de las cuales tiene un tamaño de 1 MB con 1 MB de memoria confirmada. Esto corresponde al tamaño de la memoria asignada por TestLimit. La captura de pantalla anterior resalta la primera de estas opciones de distribución. Tenga en cuenta que su dirección virtual inicial es 0x310000.
10. Ahora regrese a la información sobre la memoria física que el programa RAMMap muestra en la pantalla. Reorganice las columnas para que la columna Dirección virtual sea claramente visible. Haga clic en él para ordenar las líneas por este valor, y puede encontrar la dirección virtual deseada (consulte la figura en la página 535 a continuación).
11. Aquí se muestra que la página virtual que comienza con la dirección 0x310000 está actualmente asignada a la dirección física 0x212D1000. Con el modificador -d, TestLimit escribe su nombre en los primeros bytes de cada área seleccionada. Esto se puede demostrar utilizando el comando! Dc del depurador del kernel local (dc significa "caracteres de visualización", es decir, emitir caracteres a una dirección física):
lkd> !dc 0x212d1000 #212d1000 74736554 696d694c 00000074 00000000 TestLimit....... #212d1010 00000000 00000000 00000000 00000000 ................ ...
12. Si se demora, el intento puede fallar; la página ya puede estar eliminada del conjunto de trabajo. En la última fase del experimento, mostraremos que los datos permanecen sin cambios (al menos por un tiempo) después de que se reduce el conjunto de trabajo del proceso, y la página se mueve primero a la lista de cambios y luego a las páginas de espera.
13. Una vez seleccionado el proceso TestLimit en el programa VMMap, abra el menú Ver y seleccione el comando Vaciar conjunto de trabajo para minimizar el conjunto de trabajo del proceso. Ahora en la ventana VMMap se debe mostrar la siguiente información:
14. Tenga en cuenta que la línea del conjunto de trabajo está casi vacía. La parte central del proceso muestra que el tamaño total del conjunto de trabajo es de solo 4 KB, con casi todo su espacio ocupado por tablas de páginas. Ahora regrese a RAMMap. En la pestaña Usar recuentos, puede ver que el número de páginas activas se ha reducido significativamente, y un gran número de páginas están en la lista de cambios y un número significativo de páginas están en la lista de espera.
15. Los datos en la pestaña Procesos de RAMMap confirman que la mayoría de estas páginas aparecieron en estas listas debido al proceso TestLimit.
»Se puede encontrar más información sobre el libro en
el sitio web del editor»
Contenidos»
Extracto20% de descuento en cupones para
Windows -
Windows