2010-09-01 25 views
5

En MSVC, la dirección base Randomizaiton es una opción predeterminada. (¿Desde VS2005?)¿ASLR causa una carga lenta de Dlls?

Por lo tanto, no rebase manualmente la dirección base del dll.

Pero volví a instalar todos mis dlls para mejorar el rendimiento de carga cuando uso VS2003.

Si uso la opción ASLR, el rendimiento de la carga siempre disminuye?
(De fuente puedo obtener otros beneficios)

+0

Debo admitir que estoy interesado. ASLR parecería invertir décadas de ajustes de rendimiento del sistema operativo. Y sé que Windows TODAVÍA demora demasiado en arrancar. –

Respuesta

8

La respuesta corta es no.

en un sistema sin ASLR (por ejemplo XP), la carga de una DLL en una dirección no preferida tiene varios costos:

  1. La sección reubicaciones ha de ser analizada y fixups tener que ser aplicado a toda la imagen .
  2. El acto de aplicar correcciones provoca fallas de copiado en escritura que son relativamente costosas para la CPU, y también obligan a las páginas a leerse desde el disco, incluso si la aplicación no hace referencia a ellas.
  3. Cada proceso que carga la DLL en una dirección no preferida obtiene una copia privada de cada página en la que se escribe, lo que aumenta el uso de la memoria.

Los elementos 2 y 3 son por lejos los mayores costos, y son la razón principal por la cual era necesario volver a usar manualmente las DLL.

Con ASLR, el sistema operativo aplica correcciones transparentes, lo que hace que parezca que el archivo DLL se cargó en su dirección preferida. No hay fallas de copia en escritura y no se crean páginas privadas de proceso. Además, las correcciones solo se aplican a las páginas a las que accede realmente la aplicación, en lugar de a la imagen completa, lo que significa que no se leen datos extra del disco.

Además de eso, los esquemas de rebase manual no pueden evitar todos los conflictos de direcciones base (por ejemplo, las DLL de diferentes proveedores pueden entrar en conflicto entre sí o una DLL del sistema operativo podría aumentar de tamaño debido a una revisión y extenderse a un rango reservado para alguna otra DLL, etc.). ASLR es mucho más eficiente a la hora de tratar estos problemas, de modo que cuando se analiza el sistema en su conjunto, en realidad puede mejorar el rendimiento.

+0

He escrito packer/unpacker antes, y sus puntos 1,2,3 son correctos, ya que tiene que recorrer la tabla de reubicación y aplicar todas las reparaciones manualmente en el programa de ensamblaje. Pero creo que cuando un proceso bifurca a otro, inicialmente compartían la misma tabla de páginas, hasta que el mecanismo de COW los obliga a diferir (en el caso de ASLR) y, por lo tanto, se necesita duplicar la tabla de páginas. Y esto también significa la creación de entradas TLB adicionales (a veces incluso la descarga de la memoria caché TLB) al hacer la traducción de la página MMU. El rendimiento sufrirá a causa de esto? –

+5

@Pavel: ¿De dónde vino esta información? Estoy interesado en leer sobre los efectos de rendimiento de ASLR en Windows. Aparte de su respuesta aquí, mis búsquedas han arrojado muy poco. – mcmcc

+0

Nunca he leído que las correcciones ASLR "se apliquen aparentemente por el sistema operativo". ¿Alguien tiene una cita para eso? –