5 - Lectura de archivos ejecutables

[editar]
Tutorial creado por Juan Manuel. Extraido de: http://www.lawebdejm.com
30 de Noviembre de 1999
Supongo que alguna vez os habréis preocupado viendo que vuestro ejecutable ocupa demasiado espacio en disco, pensando que cuanto mayor sea el ejecutable, más lenta será la carga, incluso quizá alguien ha utilizado uno de esos compresores de ejecutables, que hacen que el programa "parezca" más pequeño.

En realidad, esto no es así, un ejecutable no carga más lento por ser más grande, ya que los archivos EXE (y librerías DLL) se cargan a través de archivos proyectados en memoria.

Vamos a explicarlo detalladamente con un ejemplo. Supongamos que hemos creado un ejecutable que ocupa en disco 400 KB. Cuando hagamos doble clic sobre él (es decir, cuando lo ejecutemos), ocurrirá lo siguiente:

  1. Se abre el fichero a través de la función del API CreateFile.

  2. Se leen los datos de la cabecera del ejecutable, como referencias a funciones en DLLs externas, posición en el espacio de memoria donde debe comenzar la imagen, creación de variables estáticas (las que son globales, que no están definidas dentro de ninguna función o clase), etc. Todas estas tareas se hacen a través de la funciones de la librería "imagehlp" (dbghelp.dll), tales como ImageDirectoryEntryToData, ImageLoad, ImageNtHeader, MapAndLoad, etc.

  3. Se reserva un bloque de memoria virtual para almacenar todo el ejecutable, pero se compromete en el mismo espacio físico donde reside el archivo EXE. Es decir, el "Page Directory" indicará que el rango de páginas reservado cuenta con almacenamiento físico comprometido en el archivo "Programa.exe". De este modo no se lee todo el ejecutable para volcarlo a memoria, sino que se deja en disco, y cada vez que se lea una nueva instrucción para ejecutarla, se accederá a la página en disco (si no está todavía en RAM).

  4. Cada vez que se vaya a ejecutar una instrucción de nuestro programa, se irá a leer a la dirección de memoria virtual correspondiente. Si la página de esa dirección virtual no se encuentra en ese momento en RAM, se producirá un fallo de página y el sistema entrará en el proceso de lectura de la página y volcado a RAM. Una vez que ya se cuenta con la nueva instrucción en memoria física, se continúa la ejecución.

Como hemos visto, el tamaño del ejecutable no influye (hasta cierto punto) en el tiempo de carga, ya que realmente no se realiza toda la carga del código ejecutable al arrancar, sino que se va haciendo conforme se necesita. Si el contenido de una página nunca llega a ejecutarse, esa página nunca se cargará en RAM, sino que permanecerá en el propio archivo ejecutable.


Además, si creamos una nueva instancia de nuestro programa (ejecutándolo de nuevo), se reservará otro bloque de memoria proyectándolo en el mismo espacio físico (el archivo EXE de nuevo), por lo que se reserva memoria virtual para cada una de las instancias, pero sólo se utiliza la memoria física que ocupa el archivo ejecutable en el disco.

En la figura de la derecha podemos ver un esquema de cómo se proyecta un mismo ejecutable sobre el espacio de direcciones virtuales de dos procesos.


[editar]

1 opinión

Bien.

Cool.

Tutoriales relacionados con 'Los rincones del API Win32: Archivos proyectados en memoria'

Este curso trata el tema de la memoria en la plataforma Win32. En esta ocasión... Más »
Curso que profundiza en el gestor de montones (o montículos) dentro de Win32, así como... Más »
El protocolo FTP desde el API WinInet. Con este curso aprenderás a hacer un pequeño... Más »
Entramos en temas interesantes: el acceso a recursos remotos a través del protocolo de aplicación... Más »

Autor y licencia de 'Los rincones del API Win32: Archivos proyectados en memoria'


Tutorial de Juan Manuel. Extraido de: http://www.lawebdejm.com CopyLeft
Este contenido ha sido recopilado por el equipo de Wikilearning. Todo el contenido recopilado se ha obtenido respetando y comunicando en nuestro site la licencia de cada fuente.
Wikilearning tiene permiso expreso por escrito de los autores para publicar los contenidos que ha extraído de otras webs, incluyendo su uso comercial.