Hacer un programa en C que se ejecute sin SO

Iniciado por n1sen, 19 Noviembre 2017, 00:17 AM

0 Miembros y 1 Visitante están viendo este tema.

n1sen

Duda no resuelta, y de paso idea abandonada  :-( Pero si saben como responder, aganlo igual me sirve

Pues eso, esa es mi duda como lo dice el titulo. En VirtualBox logre arrancar con un "bootloader" que programe en assembler, seguiendo una guia que encontre en internet.
El problema es que viendo la guia entera, terminas con mas de 3000 lineas de codigo programadas en assembler, solo para recibir comandos y leer el teclado, algo que en cualquier lenguaje como C puedes hacerlo con algo de 200 lineas o menos.
Asi que la duda seria como compilar un programa en C a un .iso. Nota, el "bootloader" programado en assembler que bootea la maquina debe estar si o si en el mismo .iso o no arranca la maquina. Asi que en teoria, el "bootloader" debe tener una forma de llamar a ese codigo programado en C que leeria y recibiria comandos.

Aca les dejo el codigo del "bootloader" que hice:
Código (asm) [Seleccionar]
EBIOSVIDEOINT       equ 16 ;Servicio de video de la BIOS
EBIOSTTYOUTPUTFN    equ 14 ;Funcion de video TTY (teletipo) de salida de la BIOS

   cpu 8086 ;La CPU minima donde puede funcionar este codigo
Start:
           mov ax,cs ;carga el segmento de codigo
           mov ds,ax ;carga el segmento de info.
           call .10
           db 'Hola mundo! ',13,10,0 ;String que se imprimira
.10         pop si
           call PutString ;Llamado a la funcion PutString
.20         hlt
           jmp .20

PutString:   mov ah,EBIOSTTYOUTPUTFN ;Funcion de teletipo de la BIOS
.10          lodsb
            or al,al
            jz .20
            int EBIOSVIDEOINT ;llama a la interrupcion de video de la BIOS
            jmp .10 ;repite hasta que termina
            ret ;Retorna a el llamado call PutString
.20




Como ven, muestra en pantalla la cadena "Hola mundo!" y arranca la pc, y lo mejor, se ejecuta directamente en el procesador y la BIOS
La funcion de leer el teclado y recibir comandos, seria hacerlo en C, si lo hacemos en assembler... ya saben.
Si no me entienden mandemen un PM (mensaje privado)
Saludos

PD: Estoy en Linux Mint, nasm como ensamblador de asm.
ah, y los comandos para convertir el codigo en un archivo .img:
nasm bootloader.asm  -o bootloader.bin
Eso de arriba ensambla en codigo no en un .o si no en un .bin
dd if=/dev/zero of=floppy.img bs=1024 count=1440
dd if=bootloader.bin of=floppy.img seek=0 count=1 conv=notrunc

Se crea la imagen de disquette (en este caso es el floppy.img que despues ejecutamos como dispositivo de arranque en Oracle VirtualBox.
Solo funciona para Linux, en Windows, no tengo idea como se haria


PD2: Lei por ahi en una pagina de StackOverflow que alguien dijo que "tecnicamente cualquier programa que se ejecute sin SO es un SO".
El texto original estaba en ingles
null

engel lex

nunca lo he intentado, sin embargo he visto que se pueden usar las librerías standard porque están hechas con este fin...

sin embargo creo que es mejor opción usar el kernel de linux y trabajar sobre el, así te ahorras escribir todas las operaciones de IO, manejo de tareas, memoria, etc... puedes intentar con linux from scratch, que te da un ambiente booteaable 0 de linux
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

n1sen

Si, pero seria dificil, ya que en si compilar algo de esa embergadura como Linux tardaria mucho, mas peor, mi pc es una papa de solo 2GB de ram... Mi PC no podria compilar eso.
En cambio, si hago lo que intento sabre como funciona perfectamente, ya que yo mismo lo cree, le podria añadir lo que quisiese a diferencia de usar algo ya hecho que no conozco como funciona, terminaria rompiendo todo.
Aunque si no logro avanzar en esto, lo abandonare y quedara como un curioso proyecto mio...  :o
Se que hacer algo como un kernel es dificil.
Saludos
null

engel lex

no, no es alterar el nucleo de linux, si, te toca compilarlo, pero lo que haces es cambiar el proceso  de inicio, así que compilas una sola vez, y cambias tu proceso inicial y listo
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

n1sen

vale, abandonare la idea, era muy "subrealista" lo que se me ocurrio.
null

engel lex

aquí hay más opciones XD

recomiendan no intentarlo de buenas a primeras con LFS (linux from scratch) porque puede llevar a "caminos oscuros" XD

https://unix.stackexchange.com/questions/122717/custom-linux-distro-that-runs-just-one-program-nothing-else
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.