Un detalle fino de cómo se reubican las DLL como resultado de una colisión de direcciones base y consecuencias

Raymond

19 de enero, 2017

Si se debe reubicar una DLL debido a un conflicto de direcciones base, la imagen se reubicará y toda la DLL reubicada estará respaldada por el archivo de página.

Si lee la descripción con más cuidado, verá que no es exactamente toda la DLL reubicada la que recibe la copia de seguridad del archivo de página. Más precisamente, todas las páginas que contienen correcciones se colocan en el archivo de página. Si tiene suerte y tiene una página sin ninguna reparación, entonces esa página seguirá siendo paginada a la demanda de la imagen porque el núcleo no le aplicó ninguna reparación, y por lo tanto no incurrió en una copia al escribir para esa página, por lo que continúa siendo respaldada por la imagen del sistema de archivos.

Uno de los argumentos que he visto para causar intencionalmente una colisión de direcciones base es que la DLL reubicada se copie en el archivo de página, lo que es una victoria si el archivo de página está en un medio más rápido que la DLL. Por ejemplo, el archivo de página puede estar en una SSD o (gasp) en una unidad RAM.

Esa lógica no tiene en cuenta el caso de páginas sin correcciones. Esas páginas seguirán ingresando directamente desde el archivo original, lo que es un problema si el archivo original está en un medio muy lento, o en un medio que podría perderse, como una unidad de CD-ROM o una unidad de red.

Afortunadamente, no es necesario jugar juegos divertidos con conflictos de direcciones base para cargar toda la DLL en el archivo de página. En su lugar, use la bandera enlazadora /SWAPRUN que le permite especificar en el encabezado del módulo que el cargador debe copiar la imagen en el archivo de intercambio.

Raymond Chen

Seguir

Deja una respuesta

Tu dirección de correo electrónico no será publicada.