• [Linux] BIOS Bootloader por NvK + conceptos

 #439412  por NvK
 23 Mar 2014, 08:05
Hoy vengo con algo sumamente interesante en el area de la ciencias computacionales, se trata
de un bootloader, algo necesario para que un sistema operativo funcione.
Realmente me costo llevar este concepto al RM, y aun que esta probado en entornos virtuales(linux BT 5 R3),
y con el emulador bosch, no debería ser demasiado dificil llevarlo a una maquina fisica.

Pero RECUERDA que si haces esto tu ordenador podría dejar de funcionar ya que este bootloader contiene lo
basico para leer una imagen de disco floppy(solo en prueba de concepto) y leer 2 sectores, realmente
pude entender esté concepto gracias a Ashakiran bhatter, en su artículo nos explica basicamente como se compone
un floppy disk, y ademas un código de como leer un determinado sector.
Entonces se me ocurrio implementar mi propio sistema, el cual repito humildemente es muy basico, pero sirve perfectamente
como prueba de concepto y al final de esta lectura les dejare un enlace a su articulo.

BIOS:
Voy a describir rapidamente la tarea de una BIOS.
[+] Lectura del ROM(cargar su configuración).
[+] Comprobación por medio de POST del hardware(perifericos).
[+] Test de memoria.
[+] Enumeracion de dispositivos y su posterior inicialización
[+] Preever los servicios del BIOS (las famosas interrupciones del BIOS).


Voy a mencionar rapidamente como se compone un bootloader y su uso:
Un bootloader(o cargador de arranque) es la parte fundamental de un SO, y es necesario para que éste arranque
se podría hablar de el en 2 etapas:
Etapa - 1 : MBR (Master Boot record) o sector zero.
Es el primer bootloader despues de que la BIOS realiza el proceso POST correctamente, éste contiene 512 bytes de tamaño,
Los primeros 446 bytes son los que contienen el código ejecutable y mensajes de error.
Los otros 64 bytes contienen la tabla de particiones de dispositivos, el MBR seleccionara el que ha sido configurado y/o activo
para que arranque(ésto puede ser configurado manualmente entrando en el setup del BIOS que recordemos que a su vez se liga al ROM).
Los últimos 2 bytes contienen el famoso "numero magico" o en éste caso llamado boot signature(necesario para que el sistema de boteo pueda ser llevado a cabo).
encontrar el segundo gestor de arranque (bootloader etapa 2) y saltar a el.
NOTA: En la actualidad existen muchos sistemas de booteos(ya que el floppy disk es antiguo), ej: USB, CD-ROOM, DVD, etc...

Etapa - 2 :
Tener conocimiento del FS(en sistemas más actuales) y proporcionar algún tipo lista de Kernels disponibles(entre posibles diferentes sistemas operativos).
Cargar la imagen del kernel adecuada(o por defecto en caso de que no se ha seleccionado una), descomprimirla y pasar el control a la RAM acto seguido ejecutarla.
A este punto el trabajo del BIOS ya esta hecho y entra en juego el Kernel, el cual inicializa el SO en si mismo(por medio de un sistema más complejo).
Existen varios tipos de bootloaders, por ejemplo : GRUB, LiLo, etc...

Datos adicionales:
En la dirección 0xf00000 se inicia la BIOS(esta dirección es cargada/leída desde la ROM), una vez tomado el control y cargada la configuración
se pasa al BOOTLOADER.
El registro DL contiene el numero de la unidad de arranque actual.
Un bootloader comunmente es cargado en la RAM en la dirección 0x7c00(por la BIOS), pasando el control por medio de un código de salto (JMP)

Entonces logre elaborar este pequeño bootloader el cual tiene algúnas de las siguientes caracteristicas:
1)leer un sector
2)limpiar la pantalla
3)reiniciar la BIOS
4)sistema de interrupcion del teclado(para elegir opción)
# -------------------------------------------------------
Autor : NvK
Agradecimientos : Ashakiran bhatter por la exelente explicación del funcionamiento de bootloaders.
Descripción : Pequeño Bootloader para prueba de concepto.
Fecha : 23-3-2014
# -------------------------------------------------------
.code16
.text
	.globl _start

_start:	
	jmp _bootload
	
	# ---------------------------------------
	# evitar la polucion.
	pres: .ascii "\n\rbootloader por NvK.\n\[email protected]"
	credits: .ascii "Agradecimientos a Ashakiran bhatter por ayudarme\n\ra entender el funcionamiento del floppy disk.\n\[email protected]"
	leer_sec: .ascii "Elija que sector desea leer [2-3]:\n\r1)limpiar pantalla\n\r4)resetear BIOS\n\[email protected]"	
	fallo_de_sec: .ascii "error al leer el [email protected]"
	# ---------------------------------------
	
	# ------------------------
	# codigo de impresion de texto estatico(solo un tag), aun que esta incompleto te lo dejo
	# por si te es de ayuda.
	.bios_static_printz:
	xor %bx, %bx
	
	__st_bpr:
	movzx pres+(%bx), %ax
	cmpb $'@', %ax
	jz end
	
	movb $0x0e, %ah
	int $0x10
	
	incb %bx
	jmp __st_bpr
	# ------------------------
	
	.print_dash:
	xor %bx, %bx
	.loop_dash:
	movb $'-', %ax
	movb $0x0e, %ah
	int $0x10
	incb %bx
	cmpb $0x24, %bx
	jz end_dash
	jmp .loop_dash
	end_dash:
	movb $'\n', %ax
	movb $0x0e, %ah
	int $0x10
	movb $'\r', %ax
	movb $0x0e, %ah
	int $0x10
	ret
	
	.bios_printz:
	lodsb
	cmpb $'@', %ax
	jz __bp_out
	movb $0x0e, %ah
	int $0x10
	jmp .bios_printz
	__bp_out : ret
	
	.clear_screen:
	mov $0x03, %al
	mov $0x00, %ah
	int $0x10
	ret
	
	.reset_bios:
	# resetear
	.byte 0x0ea
	.word 0x0000
	.word 0xffff # restaurar dir. del BIOS
	ret
	
	.macro read_sector_floppy sec
	movb $0x02	, %ah # leer funcion del disco
	movb $0x01	, %al # total de sectores a leer
	movb $0x00	, %ch # cilindro del sector
	movb $0x00	, %dh # seleccionar la cabeza zero
	movb \sec	, %cl # sector a leer
	movb $0x00	, %dl # numero de dispositivo
	int $0x13
	jc _err
	cmpb $0x01 	, %al
	jne _err
	.endm
	
	.display_sector_data:
	__in:
	movb %es:(%bx)	, %al
	cmpb $0x00		, %al
	jz __dsd_out
	movb $0x0e		, %ah
	int $0x10
	incw %bx
	jmp __in
	__dsd_out : ret
	
_bootload:
	movw $0x07c0	, %ax
	movw %ax		, %ds
	movw $0x9000	, %ax
	movw %ax		, %es
	xorw %bx		, %bx
	
	#call .clear_screen
	lea pres, %si
	call .bios_printz
	lea credits, %si
	call .bios_printz

	call .print_dash
	lea leer_sec, %si
	call .bios_printz
	call .print_dash
	
	mov $0x00, %ah
	int $0x16
	cmpb $'2', %ax
	jz .read_sect_2
	cmpb $'3', %ax
	jz .read_sect_3
	cmpb $'1', %ax
	jz .clear_screen
	cmpb $'4', %ax
	jz .reset_bios
	
	jmp _err
	
	#call .reset_bios
	.read_sect_2:
	mov $0x02, %cl
	jmp _bootsector
	.read_sect_3:
	movb $0x03, %cl
	jmp _bootsector
	
_bootsector:
	read_sector_floppy %cl
	call .display_sector_data
	
_halt 	: jmp _halt
_err	:
	lea fallo_de_sec, %si
	jmp _halt
	
	. = _start + 510
	.byte 0x55
	.byte 0xAA
	
_sector2:
	.ascii "Sector: 2\n\r"
	. = _sector2 + 510
_sector3:
	.ascii "Sector: 3\n"
	. = _sector3 + 510

	#call .reset_bios
Y bueno despues de explicar el proceso dejare algunas imágenes de como quedo con el emulador bochs en x86.


floppy.img, escrita en sectores desde hex


simple emulacion de lectura de un sector del floppy disk:


para compilar por su cuenta usen éste comando:
as bootloader.S -o bootloader.o && ld -Ttext 0x00000 --oformat=binary bootloader.o -o bootloader.bin && dd if=/dev/zero of=floppy.img bs=512 count=2880 && dd if=bootloader.bin of=floppy.img && bochs

Es cierto que me salte muchos conceptos(y no he explicado siertas cosas como el floppy disk), pero tengan en cuenta que éste tema es muy grande y amplio,
por esto dejare articulos adjuntados que podrian servirte si quieres saver mas de esta area de la ciencia.

Escribir un bootloader en assembler (Ashakiran bhatter) [ Debe registrarse para ver este enlace ] (ademas explica el floppy disk).
Explicacion del proceso de booteo en linux : [ Debe registrarse para ver este enlace ] (realemente pude comprender mucho más del mundo de las BIOS gracias a esto).
Explicacion del proceso de booteo en linux suplemento: [ Debe registrarse para ver este enlace ]
Última edición por NvK el 23 Mar 2014, 08:15, editado 2 veces en total.
 #439413  por NvK
 23 Mar 2014, 08:08
NvK escribió:Hoy vengo con algo sumamente interesante en el area de la ciencias computacionales, se trata
de un bootloader, algo necesario para que un sistema operativo funcione.
Realmente me costo llevar este concepto al RM, y aun que esta probado en entornos virtuales(linux BT 5 R3),
y con el emulador bosch, no debería ser demasiado dificil llevarlo a una maquina fisica.

Pero RECUERDA que si haces esto tu ordenador podría dejar de funcionar ya que este bootloader contiene lo
basico para leer una imagen de disco floppy(solo en prueba de concepto) y leer 2 sectores, realmente
pude entender esté concepto gracias a Ashakiran bhatter, en su artículo nos explica basicamente como se compone
un floppy disk, y ademas un código de como leer un determinado sector.
Entonces se me ocurrio implementar mi propio sistema, el cual repito humildemente es muy basico, pero sirve perfectamente
como prueba de concepto y al final de esta lectura les dejare un enlace a su articulo.

BIOS :
Voy a describir rapidamente la tarea de una BIOS.
[+] Lectura del ROM(cargar su configuración).
[+] Comprobación por medio de POST del hardware(perifericos).
[+] Test de memoria.
[+] Enumeracion de dispositivos y su posterior inicialización
[+] Preever los servicios del BIOS (las famosas interrupciones del BIOS).


Voy a mencionar rapidamente como se compone un bootloader y su uso:
Un bootloader(o cargador de arranque) es la parte fundamental de un SO, y es necesario para que éste arranque
se podría hablar de el en 2 etapas:
Etapa - 1 : MBR (Master Boot record) o sector zero.
Es el primer bootloader despues de que la BIOS realiza el proceso POST correctamente, éste contiene 512 bytes de tamaño,
Los primeros 446 bytes son los que contienen el código ejecutable y mensajes de error.
Los otros 64 bytes contienen la tabla de particiones de dispositivos, el MBR seleccionara el que ha sido configurado y/o activo
para que arranque(ésto puede ser configurado manualmente entrando en el setup del BIOS que recordemos que a su vez se liga al ROM).
Los últimos 2 bytes contienen el famoso "numero magico" o en éste caso llamado boot signature(necesario para que el sistema de boteo pueda ser llevado a cabo).
encontrar el segundo gestor de arranque (bootloader etapa 2) y saltar a el.
NOTA: En la actualidad existen muchos sistemas de booteos(ya que el floppy disk es antiguo), ej: USB, CD-ROOM, DVD, etc...

Etapa - 2 :
Tener conocimiento del FS(en sistemas más actuales) y proporcionar algún tipo lista de Kernels disponibles(entre posibles diferentes sistemas operativos).
Cargar la imagen del kernel adecuada(o por defecto en caso de que no se ha seleccionado una), descomprimirla y pasar el control a la RAM acto seguido ejecutarla.
A este punto el trabajo del BIOS ya esta hecho y entra en juego el Kernel, el cual inicializa el SO en si mismo(por medio de un sistema más complejo).
Existen varios tipos de bootloaders, por ejemplo : GRUB, LiLo, etc...

Datos adicionales:
En la dirección 0xf00000 se inicia la BIOS(esta dirección es cargada/leída desde la ROM), una vez tomado el control y cargada la configuración
se pasa al BOOTLOADER.
El registro DL contiene el numero de la unidad de arranque actual.
Un bootloader comunmente es cargado en la RAM en la dirección 0x7c00(por la BIOS), pasando el control por medio de un código de salto (JMP)

Entonces logre elaborar este pequeño bootloader el cual tiene algúnas de las siguientes caracteristicas:
1)leer un sector
2)limpiar la pantalla
3)reiniciar la BIOS
4)sistema de interrupcion del teclado(para elegir opción)

Y bueno despues de explicar el proceso dejare algunas imágenes de como quedo con el emulador bochs en x86.


floppy.img, escrita en sectores desde hex


simple emulacion de lectura de un sector del floppy disk:


para compilar por su cuenta usen éste comando:
as bootloader.S -o bootloader.o && ld -Ttext 0x00000 --oformat=binary bootloader.o -o bootloader.bin && dd if=/dev/zero of=floppy.img bs=512 count=2880 && dd if=bootloader.bin of=floppy.img && bochs

Es cierto que me salte muchos conceptos(y no he explicado siertas cosas como el floppy disk), pero tengan en cuenta que éste tema es muy grande y amplio,
por esto dejare articulos adjuntados que podrian servirte si quieres saver mas de esta area de la ciencia.

Escribir un bootloader en assembler (Ashakiran bhatter) [ Debe registrarse para ver este enlace ] (ademas explica el floppy disk).
Explicacion del proceso de booteo en linux : [ Debe registrarse para ver este enlace ] (realemente pude comprender mucho más del mundo de las BIOS gracias a esto).
Explicacion del proceso de booteo en linux suplemento: [ Debe registrarse para ver este enlace ]
 #439505  por NvK
 24 Mar 2014, 21:23
Te agradezco Pink, es una lastima que tan poca gente le tome interés a ésta área de la ciencia.
Hace tiempo que también vengo estudiando como funciona el hardware, los chips y las radiofrecuencias(como los chips RFID que relacionan las frecuencias con el hardware) en fin, es mundo increíble....
 #439507  por Pink
 24 Mar 2014, 21:43
Si realmente es algo fascinante. Yo realmente ahora ando con muy poco tiempo para probar y estudiar tantas cosas. pero siempre saco tiempo para leer tus temas. a ver cuando hablamos por el msn. y me asesores en unas cosas que estoy por hacer.

saludos bro

PD: Estudie un año Electronica hace tiempo (vos pareces como Electronico)
 #439508  por NvK
 24 Mar 2014, 21:49
Claro si me gustaría como te dije el otro día, lo que pasa que éstas semanas estuve MUY ocupado... y realmente no me queda ni margen de tiempo si quiera para hacer más publicaciones, espero pronto desocuparme y prometo que hablaremos con más tiempo.