Usando GRUB

From Movaxes

Revision as of 18:43, 7 February 2007 by Admin (Talk | contribs)

GRUB es un poderoso bootloader capaz de cargar un SO de 32-bit desde un floppy, un disco duro, a travez de la red, etc.

El desarrollo de un SO debe ser fácil como crear cualquier archivo ejecutable, GRUB se encarga de eso, nos permite crear un solo archivo ejecutable en cualquiera de los formatos reconocidos y se encarga de preparar el sistema para cargarlo en la memoria y ejecutarlo. Claro que no hace todo por nosotros, aún quedan algunas cosas pendientes, pero nos ahorra bastante trabajo (escribir un bootloader no es tarea fácil ni demasiado emocionante).

Para que nuestro SO sea capaz de cargar con GRUB debe tener el Multiboot Header (cabecera). Eso nos permite usar cualquier bootloader capaz de cargar un SO con un multiboot header.

MUltiboot Header

Esta cabecera debe estar contenida completamente en los primeros 8192 bytes de la imagen del SO. Por lo general mientras más pronto se encuentra mejor.

El layout de la cabecera es así:

Offset  Tipo  	Campo  	        Nota
0 	u32 	magic 	        requerido
4 	u32 	flags 	        requerido
8 	u32 	checksum 	requerido
12 	u32 	header_addr 	si la bandera[16] está puesta
16 	u32 	load_addr 	si la bandera[16] está puesta
20 	u32 	load_end_addr 	si la bandera[16] está puesta
24 	u32 	bss_end_addr 	si la bandera[16] está puesta
28 	u32 	entry_addr 	si la bandera[16] está puesta
32 	u32 	mode_type 	si la bandera[2] está puesta
36 	u32 	width 	        si la bandera[2] está puesta
40 	u32 	height 	        si la bandera[2] está puesta
44 	u32 	depth 	        si la bandera[2] está puesta

Como se puede ver en la tabla solo las primeras 3 son requeridas.

+ El campo 'magic' es el número mágico que identifica la cabecera, debe ser el valor hexadecimal: 0x1BADB002.

+ El campo 'flags' indica que es lo que necesita del bootloader para funcionar bien, los bits 0 al 15 indican los requerimientos, si el bootloader no entiende alguna de estas banderas o no puede cumplir con los requerimientos entonces no carga el SO y avisa al usuario. Los bits 16 al 31 indican otras opciones para el bootloader. Si el bit 0 está puesto todos los modulos cargados con el sistema operativo deben estar alineados a 4bytes. Si el bit 1 está puesto entonces la información disponible al menos por la via de los campos 'mem_' de la estructura de información del multiboot debe ser incluida (ver acá). Si el bootloader es capaz de pasar un mapa de memoria (campos 'mmap_') entonces debe pasarlo. Si el bit 2 está puesto la información acerca de la tabla de modo de video debe estar disponible para el kernel. SI el bit 16 está puesto los campos con offset 12 al 28 en el multiboot header son validos y el bootloader debe usarlos en lugar de los campos actuales en lugar del formato del ejecutable actual para calcular en dónde cargar el SO. Esto es necesario si el ejecutable no está en formato ELF sino en un a.out estandar o algún otro tipo de ejecutable.

+ El campo checksum es un valor de 32 bits sin signo que al sumarlo a los otros campos (magic+flags) debe tener una suma de 32bits sin signo de 0 (cero).

Cargando nuestro Kernel desde el GRUB de Linux

Si ya tienes instalado alguna distro de Linux en tu computadora (con GRUB) y quieres probar tu SO en hardware real, esto es lo que debes hacer:

Primero abre el archivo del menu de GRUB para agregar nuestro kernel usando el comando en un terminal (ejemplo usando UBUNTU):

$ sudo gedit /boot/grub/menu.lst

Ahora que tenemos abierto el archivo en gedit vamos a agregar al final:

title    Kernel de Prueva
root     (fd0)
kernel   /boot/kernel.bin
boot

Eso agrega al menu de GRUB la opción de cargar nuestro kernel de prueva desde un floppy (fd0): title es el nombre que aparecerá en el menu (puedes poner lo que quieras)
root es el lugar en donde está el kernel (fd0 es nuestro floppy)
kernel le indica a GRUB en donde se encuentra el kernel (en este caso en un folder llamado 'boot' del floppy)

Eso es todo, cuando tengas un kernel listo solo lo grabas en el directorio boot del floppy y reinicias la computadora, cuando veas la opción en el menu de GRUB la seleccionas y presions ENTER, y ya está!!

Cargando nuestro kernel en BOCHS



Personal tools