Este artículo necesita citas adicionales para su verificación . ( agosto de 2009 ) |
En informática , la ejecución en el lugar ( XIP ) es un método para ejecutar programas directamente desde el almacenamiento a largo plazo en lugar de copiarlos en la RAM . Es una extensión del uso de la memoria compartida para reducir la cantidad total de memoria necesaria.
Su efecto general es que el texto del programa no consume memoria escribible, guardándolo para datos dinámicos, y que todas las instancias del programa se ejecutan desde una única copia.
Para que esto funcione, se deben cumplir varios criterios:
Los requisitos de almacenamiento generalmente se satisfacen mediante el uso de memoria flash NOR o EEPROM , que puede direccionarse por bytes para operaciones de lectura, aunque es un poco más lenta que la RAM del sistema normal en la mayoría de las configuraciones.
En los sistemas x86, normalmente el cargador de arranque de primera etapa es un programa XIP que está vinculado para ejecutarse en la dirección en la que se asignan los chips flash durante el encendido y contiene un programa mínimo para configurar la RAM del sistema (que depende de los componentes utilizados en las placas individuales y no se puede generalizar lo suficiente para que la secuencia adecuada pueda integrarse en el hardware del procesador) y luego carga el cargador de arranque de segunda etapa o el núcleo del sistema operativo en la RAM.
Durante esta inicialización, puede que no haya memoria escribible disponible, por lo que todos los cálculos deben realizarse dentro de los registros del procesador. Por este motivo, los cargadores de arranque de primera etapa tienden a estar escritos en lenguaje ensamblador y solo hacen lo mínimo para proporcionar un entorno de ejecución normal para el próximo programa. Algunos procesadores incorporan una pequeña cantidad de SRAM en el propio chip [1] o permiten utilizar la memoria caché integrada como RAM [2] para que sea más fácil escribir este cargador de arranque de primera etapa utilizando un lenguaje de alto nivel.
En el caso de un núcleo o un gestor de arranque, el espacio de direcciones se asigna generalmente de forma interna, por lo que para poder utilizar XIP en ellos, basta con indicar al enlazador que coloque los datos modificables y no modificables en diferentes rangos de direcciones y proporcionar un mecanismo para que los datos modificables se copien en la memoria grabable antes de ejecutar cualquier código que suponga que se puede acceder a los datos de forma normal. Esto se puede hacer como parte de la etapa anterior o dentro de un pequeño segmento de código al principio del programa.
Si el espacio de direcciones se asigna externamente, como en un programa de aplicación que se ejecuta en un sistema que no proporciona memoria virtual , el compilador debe acceder a todos los datos modificables agregando un desplazamiento a un puntero a una copia privada del área de datos. En este caso, el cargador externo es responsable de configurar las áreas de memoria específicas de la instancia.
En los sistemas x86, normalmente la ROM BIOS / UEFI se asigna a un espacio de memoria fijo al encender el sistema, [3] y la BIOS/UEFI en los sistemas x86 utiliza XIP para inicializar la memoria principal . En los sistemas integrados ARM y RISC-V, normalmente la ROM de arranque integrada del SoC se asigna a un espacio de memoria fijo al encender el sistema, y la ROM de arranque puede encontrar y cargar un gestor de arranque integrado, como Das U-Boot , desde la memoria flash NAND , y ese proceso de arranque no utiliza un chip EEPROM dedicado .
XIP impone requisitos a los sistemas de archivos que a menudo son difíciles de cumplir. En sistemas sin tabla de páginas , el archivo completo debe almacenarse en bytes consecutivos y no debe fragmentarse, mientras que los sistemas de archivos basados en flash suelen tener como objetivo distribuir los datos en sectores del chip flash que tienen menos ciclos de borrado e igualar el desgaste del chip, prolongando su vida útil.
Todas estas complicaciones y la desventaja de la velocidad hacen que XIP se utilice generalmente solo para cargadores de arranque de primera etapa o cuando la RAM es extremadamente escasa. En particular, las consolas de videojuegos de segunda a cuarta generación conectan la dirección y el bus de datos del cartucho ROM a los de la consola, [ 4] lo que permite (por ejemplo) que el Atari 2600 funcione solo con los 128 bytes de RAM en su IC de interfaz de joystick .
Un sistema de archivos relativamente nuevo para Linux, llamado AXFS ( Advanced XIP File System ), tiene como objetivo superar algunas de las deficiencias asociadas con XIP, especialmente en lo que respecta a la ejecución in situ de aplicaciones en el espacio de usuario . Por ejemplo, permite dividir un archivo binario ejecutable en "regiones XIP", evitando así la restricción de fragmentación que se mencionó anteriormente.
También se está desarrollando una implementación de NetBSD . [5]