Explicacion del Proceso de Arranque
_____________________________
Si habeis descargado el RAR y habeis leido el fichero de texto explicativo , os habreis dado cuenta de que el
proceso de carga esta dividido en dos bloques Bien diferenciados el
BOOT o cargador y el
KERNEL o programa que que será ejecutado por el cargador.
- Si habeis seguido leyendo,
el boot ya está hecho , se prodria mejorar pero funciona.
- El kernel se podria cargar uno tipo EXE y
NO necesariamente escrito en ensamblador , de momento se ha usado el de BOB esponja por motivos de facilidad pero
aquí ya podriamos usar un kernel echo en PASCAL trocearlo en sectores y probarlo.
El problema , al parecer es que hay que usar una cabecera , de carga de registros iniciales , que todavia
no tengo muy claro. Estoy en ello y espero que algien lo vaya haciendo paralelamente por si yo no lo consigo.
- Con el kernel de BOB veremos que no es necesario reiniciar la máquina cada vez que hagamos una prueba , tan solo ejecutamos nuestro ejecutable BOOT y veremos el proceso de carga.
Esto facilita cualquier cambio en el Boot , lastima habermne dado cuaenta solo al final.
__________________
Explicacion del BOOT
__________________
El BIOS está preparado para cargar un sector de arranque de casi cualquier dispositivo , el mas simple es
del de disco flexible , en el disco duro el proceso se complica un poco por el echo de tener particiones.
Si en nuestro BIOS tenemos activada la opcion de arranque en disquete , el programa interno del bios
lee del disco el primer sector fisico (512 bytes) y lo carga siempre en una zona de memora especifica FFFF:7C00 ó y 0000:7C00 y todavia no le cede el control , el bios comprueba que los dos últimos bytes de estos 512 bytes
que ha leido de un disquete coinciden con la firma 55,AA en haxadecimal ,si es correcto le cede el control al primer byte o instruccion de nuetro sector cargado en la memoria.
Nuestra mision es colocar el inicio de nuetro programa en esa posicion 7C00 , esto se hace con la clausula en
ensamblador ORG,
- ORG 100h para un programa .com
- ORG 0h para un programa .SYS o uno EXE
- ORG 7C00h para nuestro programa
Sin esta clausula nuestro programa cargador no se ejecutaria , se ejecutaria lo que hubiere en esa posicion de memoria , lo mas normal es que no haya nada y entonces se bloquee la maquina.
Nuestro programa no dispone de todos los 512 bytes del sector ya que se suelen reservar 30 bytes para una tabla de datos que describe el soporte fisico del disco y los dos ultimos bytes que deben terminar con la firma 55AA. lo que nos queda son unos cuantos bytes y lo normal no es hacer aqui un programa completo
si no iniciar la carga de un programa que esté situado en disquete.
En este proceso de carga no podemos usar el sistema tradicional de ficheros DOS int 25h y 26h ya que los servicios tipo DOS no existen , tan solo disponemos de los servicios BIOS que se encuentran en todos los ordenadores . A este nivel BIOS , usaremos la interrupcion INT 13H para cargar sectores especificos
del disco, normalmente sectores consecutivos, en los cuales deberá estar nuestro programa ,
no necesariamente escrito en ensamblador, el BIOS puede cargar de una sola pasada ,el maximo de sectores que soporta la unidad por pista , en unidad de 3,5 pulgadas alta densidad 18 sectores por 512 bytes
(tamaño sector sector) =9216 bytes o aproximadamente 9k , 9k para nuestro programa , pero podemos cargar mas sectores en otra llamada al BIOS incrementando el tamaño de nuestro programa hasta un maximo de la capacidad de nuestro disco o incluso más introduciendo mas discos.
El único problema estriba que al no disponer de un sistema de manejo de ficheros , el tema se complica ya que el código siempre deberia ocupar unos sectores fijos e inamovibles para poder cargar el código.
La posicion de carga del KERNEL está establecida en la INT 13h por el registro ES:BX y
no necesariamente en la posicion 1000:0000 podria ser otra cualquiera 10000:00100 Tipo .com por ejemplo u otra cualquera
2000:00000 ó
FABA:DA hex
Como veremos mas adelante podemos cargar un executable Programa.EXE que esté troceado en estos sectores , en un principio no deberia haber problemas si el EXE está escrito en ensamblador o en otro lenguaje.
Pero parece ser que el ejecutable debe usar unos registros especiales y un sistema de pila propio, dicho de otra manera los segmentos deben apuntar a
unos valores preestablecidos y esto dificulta el proceso de creacion de ficheros estandar en los que los segmentos apuntan a nuetro programa.
Esto último debe explicarlo mejor BOB esponja.- y me corrija -
__ NOTA PERSONAL _____________________________________________
Creo que podremos cargar cualquier EXE creado en cualquier lenguaje
siempre y cuando pongamos una cabecera en ensablador a nuestro programa.
y prescindamos de algunos servicios tipo DOS que aún no estan disponibles ya que este no está cargado. habrá que emularlos o reinventarlos o crear un
sistema propio tanto basico a base de sectores o mas complicado. quien sabe.
Respecto al cargador de sectores en disco he usado DEBUG , pero se prodria hacer uno escrito en Pascal para cargar cualquer fichero ejecutable a unos sectores en concreto del disco.
La verdad trabajar bajo ensamblador aveces desmoraliza un poco .La mayoria
de las veces por falta de conocimientos. - casi todas las veces -.
sigo en el proyecto
ya sabeis en Teoria se puede cargar cualquier EXE (Pascal C etc..) para el kernel
_________________________________________________________________
Saludos.