2009-04-03 10 views
9

¿Cómo compilar un programa C en una válida ELF formato (o RAW) para que pueda ser ejecutado directamente desde la memoria RAM sin ningún OS? Supongamos que existe un gestor de arranque que es capaz de cargar el código en cualquier ubicación de la RAM y comenzar la ejecución en esa dirección. Para ser precisos, ¿cuál debería ser el compilador (GCC) flags? ¿Hay una necesidad de un archivo de mapa?ejecución sin OS

Una aplicación de ejemplo holamundo sería muy bienvenida :)

Sólo para elaborar mi punto,
dejar que el método main() sea un infinito vacío mientras bucle para garantizar que no OS llamadas específicas o estándar de la biblioteca son usados. El o/p deseado es un cuelgue. Con las opciones habituales de GCC, el gestor de arranque definitivamente no cargará el ejecutable diciendo que no es válido formato ELF. Sin embargo, al pasar -dN la opción del enlazador lo convertirá en ELF válido. ¡Se necesitan más opciones de compilador/enlazador para que se cuelgue y no se cuelgue! ¿Qué son exactamente esas opciones de compilación?

file.c: 
int main() 
{ 
    while(1); 
} 

Compilación
gcc -c opciones -nostdinc file.c -fno-incorporado
ld -dn -nostdlib file.o

cargas cargador de arranque a.out a la RAM y se ejecuta.

Respuesta

6

En primer lugar, hay limitaciones de lo que puede hacer, una vez que el gestor de arranque finaliza su trabajo. Estas limitaciones se deben a las siguientes cosas: (suponiendo que su gestor de arranque (por ejemplo: grub), lo lleva al modo protegido de 32 bits) 1. No hay paginación habilitada. Necesitas habilitarlo. 2. Allí no puede interactuar con dispositivos ya que tiene que configurar controladores para IRQ.

Aquí hay un enlace clásico que utilicé para aprender el arte de programar sobre metal desnudo (http://geezer.osdevbrasil.net/osd/index.htm). Además, hay un enlace de descarga en la página (http://geezer.osdevbrasil.net/osd/code/osd.tgz). El archivo tar contiene núcleos de demostración con un nivel de complejidad creciente. Además, puede buscar en el archivo make (linux.mak) y obtener indicadores necesarios para gcc.

me abrió un archivo make azar y encontró que se utilizaron indicadores siguientes: gcc: opciones -nostdinc -fno-orden interna ld: -nostdlib
(se hace una llamada explícita a enlazador, por lo tanto, ld también necesita una bandera) .

El objetivo de las banderas es decirle a gcc que no debe haber enlaces con la biblioteca estándar.

+0

Gracias ... Los enlaces eran muy útiles :) – AIB

0

¿Se da cuenta de que si no carga un sistema operativo debe escribir un controlador de dispositivo para trabajar con cualquier dispositivo. Eso significa que no debe escribir en la pantalla sin escribir un controlador para esa tarjeta de video en particular, no debe leer el disco sin escribir un controlador para esa tarjeta controladora del disco duro en particular, no acceder al teclado, etc.

Es posible que desee buscar algo llamado Kiosk Mode en su lugar. La idea básica es que el sistema operativo se ejecuta, carga todo lo que necesita su aplicación, carga su aplicación y luego no puede cambiar a otra aplicación.

+0

En lugar de escribir controladores de dispositivo, puede simplemente quedarse en modo real y usar interrupciones de BIOS para acceder a todas estas cosas. De lo contrario, el video (VESA), el teclado (emulación PS/2), etc. está bastante estandarizado. – Andy

+0

Para empezar, estaba intentando crear un Hang en el sistema (Ver código en la pregunta). Para producir un bloqueo, no necesita ningún controlador (excepto el controlador de memoria, que creo que proporcionará el gestor de arranque). Pero estaba teniendo un accidente. Una vez que haya terminado con esto puedo obtener el código de conductor y explorar más ... – AIB

Cuestiones relacionadas