DISEÑO DEL SECTOR DE ARRANQUE (BOOT SECTOR)

Boot Sector

Entorno.

El cometido principal de crear un bootsector, es obvia. Si se está crando un sistema operativo, el tiene que tener un mecanismo de arranque, por lo general en un disco de sistema, y no esperar que el sistema ya esté arrancado con otro sistema operativo, para tomar propiedad de sus recursos. Es por ello que aparece esta herramienta, creada a bajo nivel.

Uno de los grandes problemas a la hora de realizar dicha herramienta, es que, no debe superar un tamaño de 512 bytes, que es el tamaño del sector de un disquette, con lo que hay que hacer auténticos esfuerzos, para que sea eficiente en un código tan reducido, una función tan importante, es por ello que si se quiere hacer de una manera eficaz se debe programar en ensamblador. Además no puede ceñirse al estándar de creación de ficheros ejecutables .EXE, sino que debe de ser con respecto al .COM, cosa que no es muy complicada, pero hay que atenerse también a ciertas restricciones.

Para crear el disco de arranque se desarrolló otra herramienta, esta en PASCAL, para ubicar, en el disco de arranque –que en principio es un disquette- tanto el bootsector, como un fichero que será ejecutado, tras acabar con la ejecución del bootsector. El fichero ejecutado será el ZEUS.EXE, que puede contener la inicialización del sistema y concluir con la carga de un shell, por ejemplo.

Para información adicional consultar en anexos temas sobre FAT (File Allocation Table), Master Boot Record y Particiones.

 

Pseudocódigo del Boot Sector.

Es difícil indicar en pseudocódigo, la secuencia de un programa en ensamblador, y es así porque por lo general, no hay nada que sobre o que su uso sea obvio. Vamos pues a ver la secuencia del boot sector.

 

  1. inicio
  2. inicializa cs:ip
  3. inicializa ss:sp
  4. inicio_del_programa;
  5. leer_pistas_de_UNIDAD_A;
  6. inicializar_EXE;
  7. establecer_reubicaciones_del_EXE;
  8. inicializa cs:ip de_EXE;
  9. inicializa cs:ip de_EXE;
  10. preparar_salto_largo;
  11. pasar_el_control_EXE;
  12. fin.

 

Creador de disco de Sistema

Entorno

Lo que hace esta herramienta es leer el BOOTSECT.COM y ZEUS.EXE y los copia en la unidad de disquette. Por lo generla primero hace las actualizaciones en memoria y luego las escribe en el disquette.

Está claro que esta herramienta será de importante uso cuando haya un sistema sin sistema operativo, y queramos instaurar el ZEUS 98 OS, o bien si teniendo ya un sistema operativo instalado queremos arrancar bajo ZEUS 98 OS.

Esta puede ser la primera de un conjunto de herramientas, que hagan más humano el sistema operativo. Pero en sí, no es herramienta interna del sistema, ya que no puede funcionar bajo ZEUS 98 OS. Es una ayuda al grupo de desarrollo para llevar a buen fin la ejecución del Sistema Operativo. Funciona Bajo DOS 5.0 o superior o Windows 9x.

Tipos de datos predefinidos.

Se van a definir una serie de tipos de datos para hacer más asequible la programación del código desarrollado, éstos van a ser:

Tipos.

Sector.

Tipo: array [1..512]del tipo byte.

Cometido: Tipo básico de acceso a sectores de unidad de disco tipo FDD

Cilindro.

Tipo: array [1..18] de tipo sector.

Cometido: Tipo básico de acceso a cilindros de unidad de disco tipo FDD

Pista.

Tipo: array [1..2] de tipo cilindro.

Cometido: Tipo básico de acceso a pistas de unidad de disco tipo FDD

pPista.

Tipo: Pista *.

Cometido: Creación de pistas virtuales en memoria, para unidades de disco tipo FDD.

disco.

Tipo: array [1..80] del tipo pPista;

Cometido: Disco virtual en memoria, para unidades de disco tipo FDD.

fat.

Tipo: array[1..9] del tipo Sector.

Cometido: Contener la información básica sobre la situación de los ficheros, para unidades de disco tipo FDD.

 

Funciones.

Grabar_Pista.

  1. p1 Grabar_Pista(p2,p3);
  2. Parámetros:
  3. p1: booleano, devuelve cierto si ha grabado con éxito.
  4. p2: char, número de pistas a grabar.
  5. p3: pPista, contenido de la pista que se quiere grabar.
  6. Cometido: Grabar un número determinado de pistas p2 en una unidad de disquette.
  7. Pseudocódigo:
  8. p1 Grabar_Pista(p2,p3)
  9. inicio
  10. inicializa_disquetera;
  11. repetir(escribir_por_las_dos_caras)hasta terminar;
  12. si(no_error) devolver verdadero;
  13. sino devolver falso;
  14. finsi;
  15. fin.

Grabar_Disco.

  1. p1 Grabar_Disco(p2,p3);
  2. Parámetros:
  3. p1: devuelve cierto si se escribe correctamente.
  4. p2: número de pistas a escribir.
  5. p3: disco virtual.
  6. Cometido: Escribir un número p2 de pistas en el disco
  7. pseudocódigo:
  8. p1 Grabar_Disco(p2,p3)
  9. inicio
  10. repetir(p2)veces
  11. grabar_pista;
  12. finrepetir;
  13. si (no_error) devolver verdadero;
  14. sino devolver falso;
  15. finsi;
  16. fin

Inicia_Raiz.

  1. Inicia_Raiz(p1,p2);
  2. Parámetros:
  3. p1: disco, disco que se quiere crear la raíz.
  4. p2: long int, tamaño de la raíz.
  5. Cometido: Inciar la raíz en la uniodad de disquette.
  6. pseudocódigo:
  7. Inicia_Raiz(p1,p2)
  8. inicio
  9. hacer_raíz_con_p1_y_p2;
  10. fin.

Inicia_Fat.

  1. Inicia_Fat(p1);
  2. Parámetros:
  3. p1: fat, copia de la fat a incializar.
  4. Cometido: Inicializa una copia de la fat en memoria.
  5. pseudocódigo:
  6. Inicia_Fat(p1)
  7. inicio
  8. copiar_en_512_bytes_la_fat_en_memoria;
  9. fin.

Copia_Fat.

  1. Copia_Fat(p1,p2);
  2. Parámetros:
  3. p1: fat, original de la fat en la memoria.
  4. p2: disco, disco virtual donde crear nueva copia.
  5. Cometido: Escribe en el disco virtual creado en memoria, la copia de la fat creada.
  6. pseudocódigo:
  7. Copia_Fat(p1,p2)
  8. inicio
  9. realizar_copia_de_la_fat_creada_en_memoria;
  10. fin.

Escribir_Fat.

  1. Escribir_Fat(p1,p2,p3);
  2. Parámetros:
  3. p1: unsigned int, posición de la fat.
  4. p2: unsigned int, valor que se le asigna.
  5. p3: fat, copia de la fat que se quiere escribir.
  6. Cometido: Hacer una escritura de la fat cuando haya modificaciones.
  7. pseudocódigo:
  8. Escribir_Fat(p1,p2,p3)
  9. inicio
  10. escribir_fat;
  11. fin.

Borrar_Pista.

  1. Borrar_Pista(p1);
  2. Parámetros:
  3. p1: pPista, pista que se quiere borrar.
  4. Cometido:
  5. pseudocódigo:
  6. Borrar_Pista(p1)
  7. inicio
  8. dureante(longitud_de_pista)
  9. recorrer_pista;
  10. recorrer_cilindro;
  11. recorrer_sector;
  12. borrar_pista;
  13. findurante;
  14. fin.

Programa principal.

Vamos a ver el pseudocódigo del programa principal, no utiliza parámetros, ya que no le hacen falta. Obviamente, para que el programa se ejecute perfectamente hay que tener un disquette metido en la unidad de FDD.

Por defecto busca el BOOTSECT.COM como fichero de arranque y ZEUS.EXE como fichero para iniciar tras el arranque del sistema.

Las variables que se utilizan tienen fines temporales, con lo que omitimos su aparición. Veamos pues el pseudocódigo:

  1. principal()
  2. inicio
  3. asignar_y_abrir_ficheros;
  4. si (error) terminar_ejecución;
  5. finsi;
  6. borrar_pistas;
  7. inciar_fat;
  8. crear_disco_virtual;
  9. copiar_al_disco_virtual_ZEUS.EXE;
  10. escribir_fat;
  11. escribir_boot;
  12. copiar_fat;
  13. inciar_raíz;
  14. grabar_disco;
  15. eliminar_disco_vitual;
  16. cerrar_ficheros;
  17. fin.

Diagrama de relación.

Vamos a ver como se interrelacionan los módulos de la herramienta BOOTSEC.


zeusv2@geocities.com

Última actualización de la página: 12/03/99


Esta página está hospedada en   Consigue tu Página Web Gratis