Ingeniería en Informática Sistemas Operativos MBUM (MultiBootloader de la Universidad de La Matanza) Equipo De Investigación Alvarez Matías Barrett Guillermo Leguizamón Romina Otero Andrea 33.081.870 33.676.599 28.053.350 28.350.661 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM Índice TEMAS RELACIONADOS ...................................................................................................................................... 3 OBJETIVOS ............................................................................................................................................................ 10 DESARROLLO ....................................................................................................................................................... 10 Instalación del MBUM...................................................................................................................................... 10 Estructura de la partición del BUM .................................................................................................................. 11 Funciónamiento del MBUM .............................................................................................................................. 11 Gestor de particiones ................................................................................................................................................................. 13 Restricciones .................................................................................................................................................... 14 CONCLUSIONES.................................................................................................................................................... 14 Pendientes: ....................................................................................................................................................... 14 Booteo directo de Linux. ........................................................................................................................................................... 14 Reconocimiento de varios discos.............................................................................................................................................. 15 Reconocer Windows sin que la partición este marcada como activa. ..................................................................................... 15 File system para la partición del BUM. .................................................................................................................................... 15 Booteo desde pendrive. ............................................................................................................................................................. 16 APENDICE A .......................................................................................................................................................... 17 Organización de archivos ................................................................................................................................. 17 Estructuras de datos utilizadas: ........................................................................................................................ 17 stuCHS: ...................................................................................................................................................................................... 17 stuDiskAddressPacket ............................................................................................................................................................... 17 stuPartitionBootRecord ............................................................................................................................................................. 18 stuComando ............................................................................................................................................................................... 18 Descripción del contenido de los subdirectorios del proyecto. .......................................................................... 18 ./bum..................................................................................................................................................................................... 18 . /bum/bs_instalador ............................................................................................................................................................. 18 . /bum/include/multiboot ..................................................................................................................................................... 18 ./bum/mbr_hdd ..................................................................................................................................................................... 18 ./bum/pbr_hdd ...................................................................................................................................................................... 18 ./libInit16 .............................................................................................................................................................................. 18 Variables, constantes y funciones definidas en algunos de los archivos intervinientes ....................................... 18 Directorio /bum/ ........................................................................................................................................................................ 18 Archivo: bum.c .................................................................................................................................................................... 18 Archivo: bum.h .................................................................................................................................................................... 19 Archivo: config.c ................................................................................................................................................................. 19 Archivo: comandos.c ........................................................................................................................................................... 20 Archivo: consola.c ............................................................................................................................................................... 26 Directorio / libInit16/ ................................................................................................................................................................ 27 Archivo: bios.c ..................................................................................................................................................................... 27 Archivo: consola.c ............................................................................................................................................................... 31 Archivo: floppy.c ................................................................................................................................................................. 37 Archivo: mem.c.................................................................................................................................................................... 39 Archivo: part.c ..................................................................................................................................................................... 40 Archivo: puertos.c................................................................................................................................................................ 45 Archivo: string.c .................................................................................................................................................................. 45 GLOSARIO.............................................................................................................................................................. 47 BIBLIOGRAFÍA: .................................................................................................................................................... 48 Internet ............................................................................................................................................................. 48 2/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM Temas Relacionados Master Boot Record De todos los sectores de una unidad de disco, el primero de la primera cabeza del primer cilindro tiene una gran importancia ya que es el sitio al que se dirige la BIOS cuando busca si existe en el sistema un dispositivo cargable. Sus 512 bytes contienen tres bloques con información sobre la arquitectura física y lógica del disco: el código maestro de carga, la tabla de particiones y la firma. Código maestro de carga: Si el disco es "bootable", los primeros 446 bytes del MBR (sector de arranque), están ocupados por un pequeño trozo de código denominado código maestro de carga MBC ("Master Boot Code") o cargador inicial (bootstrap loader), que es cargado por la BIOS para comenzar el proceso de carga. El bootstrap loader repasa la tabla maestra de particiones buscando una partición activa. En caso de encontrarla, busca su sector inicial, carga su código en memoria, y le transfiere el control. Dicho código es ya capaz de cargar y ejecutar cualquier otro programa situado en cualquier partición del disco. Que a su vez inicializará directamente el SO, o tal vez una utilidad conocida como gestor de arranque, que permite elegir entre distintas alternativas. Tabla de particiones: A continuación del MBC, se sitúa la tabla maestra de particiones MPT ("Master Partition Table"). Está constituida por cuatro trozos de 16 bytes (4 entradas) que contienen información sobre las particiones definidas en la unidad. Para que un disco "maestro" (cuyo MBR pueda ser accedido por el proceso de carga de la BIOS) sea "bootable", se precisa que alguna de las entradas de la tabla contenga un 80h en el bit de estado, señalando cual es partición activa Firma: Los dos últimos bytes del sector de arranque (MBR) contienen dos caracteres (55h, AAh). que son denominados firma del sector de carga ("Boot record signature") 3/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM Particiones La estructura lógica de segundo nivel que puede encontrarse en un disco físico es la partición primaria. En realidad, una partición no es más que un artificio por el que el sistema puede considerar dividida la unidad física en varias partes, que pueden incluso tener distinta estructura. De hecho, cada una de estas particiones puede albergar un sistema de archivos distinto. Por ejemplo, un sistema FAT de DOS/Windows y un sistema ext2 Linux. Además de otras ventajas, las particiones ofrecen la posibilidad de montar distintos sistemas operativos, lo que a su vez, permite al equipo adoptar "personalidades" distintas según el SO que se cargue en cada momento. En cada unidad se puede tener una partición primaria y una extendida. La partición primaria consume 4 posibilidades del disco, por su parte la extendida consume otras 4 posibilidades. Estructuras: La parte superior corresponde al MBR ("Master Boot Record"). A continuación siguen tres particiones primarias que son de estructura muy sencilla; solo tienen sector de carga ("Boot sector") y área de datos. El área de datos tiene composición análoga en todos los casos; comienza con las tablas FAT; sigue con la estructura del directorio raíz y a continuación los datos propiamente dichos [6]. 4/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM En principio una partición extendida xDp no debería ser distinta de las demás particiones primarias de la unidad. Sin embargo, se le incluyeron algunas estructuras adicionales para poder subdividir su espacio en partes más pequeñas denominadas volúmenes lógicos VL. Lo mismo que la información de la pDp y de cualquier otra partición primaria que se hubiese definido en la unidad, la información básica sobre la xDp está en la entrada correspondiente de la MPT del sector de arranque. A su vez, el primer sector de la xDp es de funciónalidad y estructura semejantes a las del bloque de carga MBR, aunque en este caso se denomina EBR ("Extended Boot Record"). La imagen anterior muestra la organización interna de una partición extendida que contiene tres volúmenes lógicos. La tabla de particiones del EBR se denomina tabla de partición extendida xPT ("Extended Partition table"), y tiene la misma disposición interna que la tabla MPT. Aunque la xPT solo utilizan las dos primeras entradas. La figura muestra el detalle de la estructura interna de una partición extendida con tres volúmenes lógicos. 5/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM La primera entrada de la xPT señala a su propio sector de carga "Boot sector". La segunda señala al EBR del siguiente volumen lógico (si no existiera ningún otro, contiene ceros). Las 2 entradas restantes no se utilizan (contienen ceros). El segundo volumen lógico tiene una estructura similar al primero. La segunda entrada de su xPT señala a la EBR del siguiente y así sucesivamente. Puede verse que la estructura de los VLs es una cadena de enlaces que comienza en la MPT, y que cada volumen lógico contiene su propio EBR. Cuando se declara una xDp, inicialmente el espacio está vacío, pero puede habilitarse construyendo en su interior una o varias particiones lógicas ("Logical partitions"), también denominadas volúmenes lógicos VL. Posteriormente los sistemas DOS/Windows las referencian con una letra, de la C a la Z, como si fuesen discos distintos. Las letras A y B se reservan para designar los sistemas de fichero de los disquetes (que no admiten particiones). Durante el proceso de carga, el SO realiza una exploración ordenada de las unidades de disco y sus volúmenes lógicos. Los sistemas DOS/Windows asignan sucesivamente una letra a cada volumen encontrado. Por esta razón, en una xDp pueden declararse hasta 24 volúmenes lógicos si no se está usando una pDp, o 23 en caso contrario. El factor limitador es la letra que se asigna a cada VL (empiezan por C y terminan con la Z). Por supuesto que salvo circunstancias excepcionales, es muy raro que se definan tal número de VLs en una partición extendida DOS. GRUB El GRand Unified Bootloader (GRUB) es un gestor de arranque múltiple que se usa comúnmente para iniciar dos o más sistemas operativos instalados. Mientras los gestores de arranque convencionales tienen una tabla de bloques en el disco duro, GRUB es capaz de examinar el sistema de archivos. Actualmente, soporta los siguientes sistemas 6/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM de archivos: ext2/ext3 usado por los sistemas UNIX y su variante GNU/Linux ext4 en versiones de pruebas. ReiserFS. XFS de SGI (aunque puede provocar problemas). UFS. VFAT, como FAT16 y FAT32 que son usados por Windows 9.x NTFS usado por los sistemas Windows NT (a partir de Windows NT v.3.51). JFS de IBM. HFS de Apple Inc. Otros ejemplos de cargadores multi arranque son LILO y SYSLINUX. La configuración del grub está basada en tres archivos que se describen a continuación: /boot/grub/menú.lst Este archivo contiene toda la información acerca de las particiones o de los sistemas operativos que se pueden arrancar con GRUB. Sin esta información, el control del sistema no se puede pasar al sistema operativo. /boot/grub/device.map Este archivo traduce los nombre de los dispositivos desde GRUB y la notación del BIOS a nombres de dispositivo s de Linux. /etc/grub.conf Este archivo contiene los parámetros y las opciones que necesita GRUB para instalar el gestor de arranque de forma correcta. GRUB 2 está basado en un proyecto llamado PUPA cuya meta era desarrollar un GRUB más “limpio”, seguro, robusto y potente así como más portable y con soporte para diferentes idiomas. Sin embargo Grub2 es un paquete nuevo que permite: Permitir scripting, condicionales, bucles, variables y funciones. Interfaz gráfica. Extensibilidad mediante carga dinámica de módulos. Portabilidad a distintas arquitecturas. Internacionalización. Soporte para caracteres fuera del conjunto ASCII, mensajes localizados, etc. Mejor administración de memoria. Marco de trabajo modular, jerárquico y orientado a objetos para sistemas de archivo, archivos, dispositivos, unidades, terminales, comandos, tablas de partición y cargadores de SO. 7/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM Instalación multiplataforma. Modo de rescate para casos en los cuales es imposible iniciar. Corregir errores de diseño de la versión anterior de GRUB, que no pueden resolverse debido a compatibilidad inversa, por ejemplo el numerado de las particiones PROCESO DE INICIO DE GRUB 1 [01] 1. El BIOS busca un dispositivo de inicio, como el disco duro, y lee el MBR del disco (Master Boot Record, los primeros 512 bytes del disco duro, mira últimos 2 bytes para verificar si el MBR), para pasarle el control. 2. El MBR contiene la fase 1 de GRUB. Como el MBR es pequeño (512 bytes), la fase 1 sólo carga la siguiente fase del GRUB, ubicado físicamente en cualquier parte del disco duro. La fase 1 puede cargar ya sea la fase 1.5 o directamente la etapa 2. 3. La fase 1.5 GRUB está ubicada en los siguientes 30 kilobytes del disco duro ( “DOS compact Space” inmediatamente después de la MBR). La fase 1.5 carga la fase 2. 4. La fase 2 GRUB recibe el control, y presenta al usuario el menú de inicio de GRUB. Etapa contiene la mayor parte de la lógica de GRUB. Se carga el archivo menu.lst y ejecuta las instrucciones, por lo general proporciona un menú para el usuario. 5. GRUB carga el kernel seleccionado por el usuario en la memoria y le pasa el control. GRUB PROCESO DE INICIO DE GRUB 2 [03] La estructura de GRUB ha cambiado un poco con la versión 2. En lugar de la etapa 1, etapa de 1,5 y la fase 2 tiene una colección de módulos que se pueden combinar de diferentes maneras. Para reflejar la funciónalidad original de las etapas del GRUB como se describe anteriormente, se tiene por ejemplo: stage 1 = boot.img stage 1.5 = diskboot.img+kernel.img+pc.mod+ext2.mod (la imagen principal) stage 2 = normal.mod+_chain.mod El proceso de arranque del grub2 es más flexible y sería el siguiente: 1. El BIOS lee el MBR de un disco (mira últimos 2 bytes para verificar si MBR). 2. Inicia la ejecución de código del bootloader (boot.img). 8/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM 3. Esto carga el primer sector de la imagen principal (diskboot.img), cuya ubicación se guarda en un lugar determinado en el boot.img en el momento de la instalación de GRUB y por lo general apunta a la imagen principal situada en el “DOS compact Space” inmediatamente después de la MBR. Diskboot.img a su vez carga y ejecuta el resto de la imagen principal. 4. Estos módulos de la imagen principal buscan y cargan el normal.mod El normal.mod carga el archivo grub.cfg y ejecuta las sentencias, por lo general proporciona un menú para el usuario, etc. Diferencias entre GRUB y GRUB 2: 9/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM Objetivos SODIUM es un sistema operativo didáctico desarrollado por alumnos de la Materia. Hoy en día la instalación del mismo está en desarrollo y quizás muy pronta a concluirse e implementarse, por lo tanto es posible que SODIUM este conviviendo con otros sistemas operativos como Windows y Linux. Para los alumnos que necesiten o deseen ver su funciónamiento, esto puede ser un problema ya que los multibootloaders disponibles no lo reconocerían en el momento del booteo. Si bien ya existía un multibootloader desarrollado por alumnos de la materia que reconozca SODIUM, éste necesitaba algunas modificaciones y mejoras en su funciónamiento. Es por ello que como propuestas nos fijamos el objetivo de mejorarlo y agregarle funciónalidades como una instalación independiente del SODIUM, además encontrar la posibilidad de volver al estado anterior a su instalación, es decir, realizar un Backup del MBR. Dada la naturaleza de SODIUM de mejora continua nos propusimos desarrollar la mayor parte de lo implementado en lenguaje C, lo cual facilita futuras modificaciones. Además se implementaron estructuras y funciones para manejo de disco que pueden ser reutilizadas para otras aplicaciones dentro de SODIUM. Desarrollo El BUM es un bootloader que permite ejecutarse en modo Live y bootear los sistemas operativos encontrados en el disco primario (sólo es capaz de ver el disco marcado como primario). En ésta condición, permite instalarse de forma residente en la PC; pero para esto requiere crear una partición dedicada para él (ya se primaria como lógica). El propio BUM provee la funciónalidad necesaria para crear y borrar particiones. Instalación del MBUM Cuando se corre el BUM en modo LIVE este permite, entre otras funciones, la instalación del BUM de forma definitiva en el sistema. A continuación se resume el proceso de instalación: 1. Al iniciar tanto en modo LIVE con desde disco el BUM recorre el disco y genera la tabla de particiones del sistema. El comando instalar recorre la tabla de particiones y las lista dando la opción al usuario de elegir en que partición desea instalar el BUM. 2. Pregunta si se desea generar un Backup del MBR original del sistema en la partición elegida por el usuario. De ser así, lo copia en el segundo sector. 3. Lee el archivo BUM.bin (funciónalidades y estructuras del BUM) del diskette y lo copia en la partición a partir del cuarto sector de la partición. 4. Copia el archivo PBR.bin del diskette al primer sector de la partición. 5. Lee el archivo BUMMBR.bin del diskette (este contiene el MBR del BUM) y lo copia en el primer sector del disco. Antes de copiar el MBR le pega la tabla de particiones, la cual se obtiene del MBR original. 6. Por último cambia el tipo del partición a 0x12 (partición tipo BUM) 10/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM Estructura de la partición del BUM Como resultado de la instalación del BUM, la partición queda con una configuración como se muestra en la figura. A continuación se enumeran los archivos/sectores arriba mostrados: PBR BUM: contiene el código capaz de cargar el BUM.bin Backup MBR original: contiene una copia del MBR al momento de la instalación. Sector reservado para el archivo de configuración: de crearse un archivo de configuración, aquí se ubicara. Este archivo permite fijar el tiempo de la cuenta regresiva para el arranque, cambiar el sistema operativo por defecto y asignar etiquetas a los SOs. BUM.bin: segunda etapa del BUM. Es el BUM propiamente dicho. Al cedérsele la ejecución, se encarga de todas las funciones (buscar los SOs ejecutables, crear/borrar particiones, ejecutar algún sistema operativo, provee la consola, etc) Se deduce que esta partición no posee un sistema de archivos popular y estándar como FAT; queda para una futura mejora implementarlo. Funciónamiento del MBUM El BUM es un cargador de 2 etapas y media. El BIOS carga el MBR del disco (que corresponde al MBR copiado durante la instalación) en la posición 0x000:0x7C00 y le cede la ejecución. Éste recorre el disco en busca de la etapa 2 del BUM: busca un partición primaria o lógica del tipo BUM (0x12). Al encontrarla, carga su primer sector (PBR BUM) en 0x000:0x7C00 y le cede la ejecución. Éste repite la búsqueda anterior para encontrarse a sí mismo, carga el BUM.bin (que se encuentra 3 sectores más adelante) en la dirección 0x8000:0x0000 y posicióna la pila al final de este segmento (que crece hacia abajo). Luego le cede la ejecución. 11/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM Se eliminaron las referencias explicitas a memoria ganando mayor flexibilidad y aprovechamiento de la misma. La segunda etapa recorre el disco (MPT y EBRs de haber particiones extendidas) y crea la tabla de particiones del sistema y la tabla de particiones ejecutables (ambas definidas de un tamaño máximo en un define). Una vez creadas estas 2 tablas, busca en el archivo de configuración el sistema operativo que debe cargar por defecto. De no existir un archivo de configuración, toma la primera partición ejecutable, espera el tiempo indicado el archivo de configuración o el que tiene por defecto y ejecuta la partición indicada. Si no encuentra ninguna partición ejecutable, pasa a la consola. MBR Partición Primaria Extendida Partición Extendida Extendida Partición MBUM Extendida MBUM Partición Primaria AA55 En ésta versión del BUM, el criterio utilizado para decidir si una partición es ejecutable se indica a continuación (esto se realiza consultando el byte de tipo): Partición tipo SODIUM. Partición tipo BUM que tenga un backup del MBR (se fija la firma). Esto se realiza para permitir la ejecución del MBR anterior. IMPORTANTE: esto se realiza cediéndole la ejecución tal como está, con la MPT vieja, por lo que pueden aparecer inconsistencias en caso de haber formateado el disto después de realizar el backup. Partición tipo Windows marcada como activa (para entender por qué se pide que esté marcada como activa, ver sección Pendientes:Reconocer Windows sin que la partición esté marcada como activa) Como se ve, el BUM no permite que una partición tipo Linux sea ejecutable. Para entender el motivo, dirigirse a la sección Pendientes:Booteo directo de Linux. Sin embargo, se permite bootear Linux (o cualquier otro sistema operativo que haya estado instalado y booteando en la maquina al momento de la instalación del BUM, a través del backup del MBR). 12/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM Gestor de particiones Finalmente, mencionar que la consola provee una serie de facilidades, entre las que se encuentra un gestor de particiones que permite crear y borrar particiones primerias y lógicas. La explicación de su funciónamiento merecería un capítulo aparte. Confiamos que el código se encuentra lo suficientemente documentado (a través de doxygen) y autodocumentado como para permitir su comprensión. Pidiendo disculpas por el capítulo que vamos a deber y con el objetivo de alivianarlas un poco, comentamos rápidamente algunos detalles que creemos que pueden ayudar a su comprensión: Para su funciónamiento, copia la tabla de particiones creada para manipularla sin riesgo de afectar la actividad normal de BUM. El disco se puede ver como una tira de sectores. Las particiones son un invento de los programas/SOs. Ellos las crean y sólo ellos las entienden; por lo tanto, lo único que se hace es seguir la forma que implementó DOS originalmente (por cuestiones de compatibilidad) con todos sus aciertos y errores. La manipulación de particiones (crear, borrar, mover, etc) sólo consiste en escribir el número adecuado en el sector correcto siguiendo la estructura apropiada. El puntero a sí mismo del EBR está dado de forma relativa al comienzo de la partición lógica (o sea, el sector que nos encontramos leyendo). En cambio, el puntero a la partición siguiente se encuentra dado en forma relativa al comienzo de la partición extendida. A continuación de cada EBR se repite la región de compatibilidad de DOS que se observa a continuación del MBR (no se usa ningún sector hasta la siguiente pista). Para crear una partición, debe existir un espacio libre en el disco. Para su cálculo se buscan sectores libres (que superen un mínimo especificado) entre el fin y el inicio de particiones consecutivas y entre el fin e inicio del disco. Esto se realiza teniendo en cuenta las siguientes consideraciones: o Tanto las entradas de la MPT las particiones lógicas no tienen que estar en orden (por ejemplo, la primer entrada de la MPT puede apuntar a una partición posterior a la segunda así como una partición lógica puede encontrarse seguida de otra que se comienza en un sector menor). Es por esto que la tabla de particiones se ordena por sector de comienzo (ignorando las particiones extendidas). o El primer/último sector disponible de la primer/última partición lógica es el primer/último sector de la partición extendida en donde se encuentra. o El primer/último sector disponible de la primer/última partición primaria o extendida es el primer/último sector del disco rígido. Para ejemplificar este punto y el anterior, se incluye el siguiente gráfico. 13/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM o Los últimos 5104 sectores del disco no se utilizaron ya que DOS no los utiliza (y no reconoce bien las particiones creadas y se tienen en cuenta). Con el GParted se observó una limitación semejante, pero de menor cantidad de sectores. No se incluyó la posibilidad de redimensionar por el peligro que supone cambiar el tamaño de la partición sin conocer el sistema de archivos (se desconoce el último sector utilizado). Se permite elegir el tamaño de la partición a crear, pero siempre empezará al principio del “hueco” encontrado, dejando el espacio restante al final. Esperemos que con estas pequeñas consideraciones sea suficiente para “echar un poco de luz” sobre esta funciónalidad del BUM. Volvemos a pedir disculpas por la falta de una explicación más profunda. Restricciones Para la instalación del MBUM es necesario contar con las extensiones del BIOS, las cuales se utilizarán para leer y escribir en disco. Se agregó una validación que avisa de la imposibilidad de utilizar el bootloader en caso de no tenerlas. Conclusiones Una vez desarrollado el mBum y viéndolo funciónar, observamos que hemos llegado a una forma sencilla de instalar un multibootloader capaz de reconocer, por defecto, SODIUM sin necesidad de realizar modificaciones al SO. Permite la carga de varios Sistemas Operativos facilitando de esta manera la tarea de prueba de SODIUM en entornos reales mientras se sigue desarrollando, dejando a la PC completamente utilizable para realizar otras tareas. El hecho de que gran parte este programado en C va a facilitar futuras modificaciones. Además durante el desarrollo se crearon varias estructuras y funciones para manejo de disco que pueden ser fácilmente aplicadas a SODIUM, un ejemplo de ello es el comando fdisk que se implementó. Pendientes: Booteo directo de Linux. En este momento, el BUM no es capaz de bootear de forma directa a Linux debido a ciertas particularidades del mismo que obligan a añadir inteligencia al bootloader. Tanto en Windows como en SODIUM, el BUM carga en 0x0000:0x7C00 el primer sector de la partición donde se encuentran instalados y le cede la ejecución. Esto no es posible en Linux. En este sistema operativo debemos buscar al kernel en el sistema de archivos para poder cargarlo en memoria y cederle la ejecución. Para esto es necesario, minimamente, ser capaces de identificar el sistema de archivos (información disponible en el byte de tipo de la entrada correspondiente en el MBR o EBR, según sea primaria o lógica) y, en función del mismo, buscar los archivos necesarios para cargar el sistema operativo. Basicamente, para que el BUM pueda bootear Linux en forma directa es necesario desarrollar funciones para leer y buscar dentro del árbol de subdirectorios para cada uno de los file system que puede utilizar Linux para su instalación. Entre los file system más comunes de Linux se encuentran ext2, ext3 y ext4 entre muchos otros. Cabe destacar que todas estas funciones deben realizarse utilizando los servicios de la BIOS ya que el BUM se ejecuta en modo real. 14/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM También es necesario investigar si existen diferencias para bootear las distintas distribuciones de Linux, el nombre cada archivo, etc. Reconocimiento de varios discos. Esta versión del BUM sólo trabaja con el disco configurado como primario en el BIOS. Se podría modificar para que sea capaz de leer y trabajar con todos los discos permitiendo tanto la instalación del BUM (aunque después sea necesario marcarlo como primario para que arranque una vez instalado) como el booteo de un sistema operativo en cualquiera de ellos. La modificación para realizar esta tarea no es excesivamente compleja, aunque requiere modificar muchas líneas de código. Reconocer Windows sin que la partición este marcada como activa. Básicamente, la pregunta podría generalizarse de la siguiente manera: “¿En una partición dada, hay un sistema operativo instalado?”. Algo que parece tan sencillo, no lo es. Esto se debe a que la única información que poseemos acerca del contenido de una partición (sin verificar dentro de ella, ya que esto depende de lo que haya ahí) es el byte de tipo de la entrada del MBR o EBR. Sin embargo, el valor es totalmente arbitrario y cada uno lo usa como quiere (no está regulada una correspondencia entre números y sistemas de archivos, sólo se “saben” usos conocidos de ciertos números (ver http://www.win.tue.nl/~aeb/partitions/partition_types-1.html)). Además, el tipo sólo identifica el sistema de archivos, pero no da información alguna sobre la existencia de un sistema operativo dentro. Por ejemplo: es habitual que todos tengamos una partición para Windows y otra para nuestros datos. En el caso de que ambas estén formateadas en NTFS, tendrán los mismos números (aunque en una haya un SO instalado y en la otra no). Como resumen, para identificar si existe un SO (tanto Windows como Linux) se debe buscar algún patrón que nos dé una pista sobre ello. En el caso de Windows se puede buscar algún archivo característico (si se sabe leer el sistema de archivos) o algún patrón que se repita en los primeros sectores. Por ejemplo, nosotros encontramos que los primeros caracteres del segundo sector de la partición donde se encuentra un gestor de arranque de Windows (que, en definitiva, es lo que nos interesa) corresponden al nombre del gestor correspondiente (NTLDR, BOOTMGR, etc). Sin embargo, esto no fue investigado lo suficiente como para asegurar que sea siempre así. En el caso de Linux, basta con buscar la existencia de un kernel (pero para esto debemos ser capaces de leer el sistema de archivos, al igual que para bootearlo). File system para la partición del BUM. Actualmente el BUM se instala en una partición de tipo BUM (0x12), la cual no tiene un file system. Los archivos que componen el BUM se copian en sectores definidos arbitrariamente por nosotros (como se mostró en la sección Estructura de la partición tipo BUM). Si bien esto no produce grandes inconvenientes, la existencia de un file system para esta partición le daría al BUM un grado mayor de flexibilidad. Además, permitiría cambiar el archivo de configuración actual del BUM por un archivo de texto plano que contenga la configuración para el BUM y que pueda ser modificado desde cualquier SO que pueda leer el file system del BUM, de manera similar al archivo menu.lst que posee el GRUB. Para poder implementar este cambio es necesario desarrollar un PBR para el BUM que pueda leer el file system elegido y funciones para el BUM que permitan leer y escribir en dicho file system. 15/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM Booteo desde pendrive. La idea principal de esta mejora es cambiar el dispositivo desde el que bootea el BUM. Como todos sabemos hace años que los disketes son obsoletos debido a su limitada capacidad de almacenamiento y a su corta vida útil. Hoy en día, la mayoría de las maquinas permiten bootear desde un pendrive y cada vez son menos las maquinas que cuentan con disquetera. Aún más, cada vez son menos los SO que dan soporte a ese medio de almacenamiento. Mientras se estaba desarrollando el BUM, otro de los proyectos en desarrollo consistía en investigar e implementar el booteo desde pendrive para SODIUM. El proceso para poder bootear el BUM debería ser muy similar y gran parte de lo desarrollado para el SODIUM debería poder utilizarse en el BUM sin grandes dificultades. 16/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM APENDICE A Organización de archivos El BUM se encuentra desarrollado por dos ramas diferentes. Por un lado la del BUM propiamente dicho (bajo el directorio bum) y por otro, una biblioteca de funciones (bajo el directorio libinit16) que proveen una API basada en los servicios del BIOS para realizar acciones como escribir en pantalla, leer del teclado, etc. Ambos proyectos son, a pesar de lo que pueda parecer, independientes. Se busca que la libinit16 provea una serie de servicios que sean utilizados por el BUM o cualquier otro proyecto que los necesite con sólo incluir la biblioteca compilada. Estructuras de datos utilizadas: stuCHS stuCHSExt stuDiskAddressPacket stuEntradaTablaParticion stuPartitionBootRecord stuComando stuEncabezadoConfig stuEntradaConfig Estructura que contiene la geometria del disco, si no estan las extensiones de la int 13h StuCHSExt Estructura que contiene la geometria del disco, que se utiliza con las extensiones de la int 13h Estructura utilizada para leer el disco utilizando las extensiones del BIOS Entrada Tabla Particion Estructura del MBR Estructura referente a la linea de comando StuEncabezadoConfig Estructura que constituye el encabezado del arch de config StuEntradaConfig Estructura que constituye una entrada en el arch de config stuCHS: unsigned char H (8 bits de H) unsigned char C_S (2 ultimos bits de C y los 6 de S) unsigned char C (Primeros 8 bits de C) stuDiskAddressPacket unsigned char Size unsigned char SinUso1 unsigned char CantidadSectores unsigned char SinUso2 unsigned int SegmentOffsetBuffer unsigned int SectorLBALow unsigned int SectorLBAHigh 17/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM stuPartitionBootRecord unsigned char BootFlag stuCHS SectorInicialParticionCHS unsigned char TipoParticion stuCHS UltimoSectorParticionCHS unsigned int SectorInicialParticionLBA unsigned int LongitudParticionLBA stuComando char comando [LONG_CMD_MAX] void(* ayuda )() void(* func )(int) Descripción del contenido de los subdirectorios del proyecto. A continuación se listan los subdirectorios con una breve descripción de cada uno. ./bum Se encuentran los archivos que implementan las funciónalidades del MBUM. . /bum/bs_instalador boot sector disquete para ejecutar el modo live . /bum/include/multiboot Contien las funciones principales, así como también, constantes y variables referentes al funciónamiento de la consola. Se encuentran los headers que declaran las distintas estructuras y funciónalidades provistas por el mbum. ./bum/mbr_hdd MBR que irá en el disco cuando se instale el MBUM. ./bum/pbr_hdd PBR que irá en el disco cuando se instale el MBUM. ./libInit16 Se encuentran distintas estructuras y funciónalidades provistas para el manejo de servicios del BIOS. Variables, constantes y funciones definidas en algunos de los archivos intervinientes A continuación se listan los archivos con sus correspondientes variables, constantes y funciones significativas con una breve descripción de cada uno. Directorio /bum/ Archivo: bum.c 18/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM Contiene el proceso principal del MBUM. Se cargan las tablas de comandos, se crea la lista de particiones ejecutables y se inicializa el archivo de configuración. Dependencia entre archivos: Relación entre funciones: Funciones: vfnInicializarTodo: En esta función se encuentran las inicializaciones de todas las variables globales. vfnCrearTablaDeParticiones: Crea la tabla de particiones ejecutables. Archivo: bum.h Contiene las constantes, variables globales, estructuras y funciones principales. Archivo: config.c Contiene el codigo de las funciones declaradas en bum.h Se compila en 16 bits (modo real) Relación de archivos: Relación de funciones: 19/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM Funciones: ifnLeerArchivoConfig: Función que provee la funciónalidad de hacer lectura de la entrada del archivo de configuración. Parámetros de entrada: o int iPos o stuEntradaConfig *pstuEntrada Devuelve: Int ifnLeerEncabezado: Función que provee la funciónalidad de hacer LECTURA del encabezado del archivo de configuración Parámetros de entrada: o stuEncabezadoConfig *pstuEncabezado Devuelve: Int ifnEscribirEncabezado : Función que provee la funciónalidad de hacer la escritura del encabezado del archivo de configuración Parámetros de entrada: o stuEncabezadoConfig *pstuEncabezado Devuelve: Int fnEscribirArchivoConfig : Función que provee la funciónalidad de hacer LECTURA del encabezado del archivo de configuración Parámetros de entrada: o int iPos o stuEntradaConfig *pstuEntrada Devuelve: Int Archivo: comandos.c Contiene los comandos que permite ejecutar el MBUM. Dependencia entre archivos: Dependencia entre funciones: 20/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM 21/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM 22/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM 23/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM 24/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM Funciones: vfnComandosCls: Función que limpia la pantalla. vfnLlenarTablasComandos: Función que Obtiene el parámetro cNumParam-esimo que se encuentra en el comando ejecutado Se asume que el primer parámetro es el parámetro. vfnAyudaArchc: Función que lista la ayuda. vfnAyudaComs: Función que llama a la ayuda del comando ingresado por pantalla. vfnComandoComs: Función que llama al comando ingresado por pantalla. vfnAyudaEjecutar: Función que lista la ayuda del comando Ejecutar. vfnAyudaListar: Función que lista la ayuda del comando Listar. vfnAyudaCls: Función que lista la ayuda del comando cls. vfnAyudaInstalar: Función que lista la ayuda del comando instalar. vfnAyudaDesinstalar: Función que lista la ayuda del comando Desinstalar. vfnAyudaRepararMBR: Función que lista la ayuda del comando repararmbr. vfnAyudaGestorParticiones: Función que lista la ayuda sobre el comando de particiones. vfnComandoAyuda: Función que lista la ayuda. vfnComandoAyuda: Función que Intenta ejecutar el comando escrito por el usuario. cfnComandoEjecutar: Función que Ejecuta la partición pasada como parámetro. Devuelve: Char vfnComandoArchc: Función destinada para el arch de config. vfnComandoListar: Función que Lista y muestra en pantalla la particiones ejecutables encontradas. vfnComandoInstalar: Función que Ejecuta el instalador del BUM. vfnComandoDesinstalar: Función que Ejecuta el Desinstalador del BUM. vfnComandoRepararMBR: Función que copia el archivo binario del MBR del disket en el MBR del disco. 25/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM vfnObtenerParamNum: Función que Obtiene el parámetro cNumParam-esimo que se encuentra en el comando ejecutado Se asume que el primer parámetro es el parámetro 0. Parámetros de entrada o cNumParam variable que contiene el comando ejecutado o iValor variable puentero al comando ejecutado Devuelve: 0 si encuentra el espacio que buscaba, de lo contrario devuelve 1 vfnObtenerNombreComando: Función que obtiene el nombre del comando que se desea ejecutar Se asume que el nombre del comando es la cadena que termina con el primer espacio en blanco. Parámetros de entrada: o strResultado contiene la cadena de la linea de comandos Devuelve: Devuelve 1 por defecto cfnObtenerParamStr: Función que el parámetro cNumParam-esimo que se encuentra en el comando ejecutado Se asume que el primer parámetro es el parámetro 0. Parámetros de entrada: o cNumParam parámetro asociado al comando ejecutado o strResultado contiene la cadena de la linea de comandos Devuelve: Char vfnComandoGestorParticiones: Administrador de particiones. cPedirConfirmacion: Pide confirmación para realizar una acción mostrando la leyenda pasada por parámetro. Parámetros de entrada: o char *leyenda (leyenda a ser mostrada.) Devuelve: Char (1 si en caso de aceptar, 0 si no acepto.) Archivo: consola.c Contiene las funciones que manejan la consola del MBUM. Relación entre archivos: Relación entre funciones: 26/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM Funciones: cfnMostrarMenu: Función que muestra el menú, con las particiones ubicadas en el disco. Parámetros de entrada: o ucTipoPart indica el tipo de partición o strEtiqueta indica si existe alguna partición o ucTimeout timeout de respuesta Devuelve: Char Directorio / libInit16/ Archivo: bios.c 27/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM Relación entre archivos: Relación entre funciones: 28/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM 29/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM Funciones ifnLeerSectorLBA : Si están las extensiones se leen con LBA, si no están, lee con CHS. Parámetros de entrada: o buf es una region de 512 bytes para guardar el sector buscado o uiLBA es el numero LBA del sector a leer Devuelve: Si pudo leer devuelve un 1, si no pudo un 0 ifnLeerSectorCHS : Lee un sector con la direccion CHS. Parámetros de entrada: o char * buf, es una region de 512 bytes para guardar el sector buscado o stuCHS * stu_CHS, es la direccion CHS del sector a leer Devuelve: Si pudo leer devuelve un 1, si no pudo un 0 ifnEscribirSectorLBA : Escribe en un sector 512 bytes. Parámetros de entrada: o char *buf, unsigned int uiLBA Devuelve: Int vfnInicializarInt13 : Verifica que estén disponibles las extensiones y obtiene la geometría del disco. vfnVerificarExtensionesInt13 : variable global cExtPresentes. vfnObtenerGeometriaCHS : Si están las extensiones la guarda en la variable global stuCHSGeomtriaDiscoExt. Si no están las extensiones la guarda en la variable global stuCHSGeomtriaDisco. Se utiliza para funciónar con LBA Pone el resultado en la Parámetros de entrada: o cEexten dice si estan o no las extensiones Devuelve: Si estan vale 1, si no vale 0 ifnConvertirCHSALBAExt : Convierte una direccion CHS a una LBA. Parámetros de entrada: o *puiLBADestino es la direccion en donde se guardara la direccion LBA o *pstuCHSExtOrigen es la direccion CHS Devuelve: 1 si pudo realizar la conversion y 0 si no pudo 30/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM ifnConvertirLBAACHS : Esta función convierte de LBA a CHS, por si las extensiones del BIOS no se encuentran presentes. Parámetros de entrada: o *pstuCHSDestino es la stuCHS en donde se va guardar el resultado, si se pudo hacer la conversion o uiLBAOrigen es la direccion LBA origen. Devuelve: 1 si pudo hacer la conversion y 0 si no pudo cfnDelay : Función que define el delay utilizado. Parámetros de entrada: o iSegs parámetro que define la cantidad de segundos del delay Devuelve: Si pudo leer el cTiempo, devuelve 1, sino, devuelve 0. Tambien devuelve 0 si iSegs esta mal (<0) Archivo: consola.c Relación entre archivos: Relación entre funciones: 31/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM 32/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM 33/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM 34/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM Funciones vfnImprimirAVentana : Función que posee la misma funciónalidad que 'printf', en el sentido en que usa las coordenadas actuales para imprimir el string. Parámetros de entrada: o *str es la cadena a imprimir o cCarNum variable que indica si lo que se imprime es caracter o numero vfnImprimirStr : La función imprime un Str en la iFila y iCol especificada. Si paso -1 a iFila y columna, imprime según las coords actuales. Se imprimirá el Str mientras no se encuentre un o mientras la cantidad de caracteres impresos sea menor a lo especificado en el parámetro siCant. Parámetros de entrada: 35/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM o *str cadena a imprimir o iFila fila a imprimir o iCol columna a imprimir o cCarNum Imprime el string en forma de caracteres o numeros hexadecimales segun se setee 1 o 0 en cCarNum, respectivamente. o siCant cantidad maxima de caracteres a imprimir vfnEscribirCar: Función que permite escribir los caracteres en la línea de comandos. Parámetros de entrada: o iCar se pasa por parámetro para definir el caracter que quiero imprimir o iPos se pasa por parámetro para indicar la posición en la pantalla vfnEscribirCarColor: Función que permite escribir los caracteres en la línea de comandos. Parámetros de entrada: o iCar se pasa por parámetro para definir el caracter que quiero imprimir o iPos se pasa por parámetro para indicar la posición en la pantalla o cColor se pasa por parámetro para indicar el color a imprimir en la pantalla cfnLeerMemVideo: Función que permite leer la memoria del video. Parámetros de entrada: o uiOffset es el parámetro que se pasa a la función para indicar el desplazamiento de acceso a la posición de memoria Devuelve: Char cfnEscribirMemVideo: Función que permite escribir la memoria del video. Parámetros de entrada: o cByte el byte a escribir o uiOffset es el parámetro que se pasa a la función para indicar el desplazamiento de acceso a la posición de memoria cfnHexToChar: Función que traduce un Hexa a Char. Parámetros de entrada: o cNum parámetro a traducir Devuelve: Char cfnCls:Función que limpia la pantalla. Devuelve: Char vfnSubirFila: Función que sube una iFila lo que hay en pantalla. cfnTeclaPresionada: Función que me indica si se presiona una tecla. Devuelve: Char cfnLeerTecla: Función que me permite leer la cTecla que se presiono. Devuelve: Char cfnImprimirTecla: Función que me permite Imprimir lo que haya ingresado el usuario. Parámetros de entrada: o cModo es un parámetro que responde al modo de impresion de la tecla 36/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM o cTeclaP tecla a imprimir, si se pasa 0 se lee la tecla del bufer. Devuelve: Char (la tecla que imprimio.) vfnBorrarCaracter: Función que me permite borrar los caracteres de la línea de comandos, retrocediendo las coordenadas; si las mismas valen cero, no se borra nada. Solo se permite borrar hasta que se llega al prompt. vfnNuevaLinea: Función que me permite obtener una nueva línea. vfnTabulador: Función que provee la funciónalidad de un tabulador que permite avanzar hasta el siguiente tab stop. vfnActualizarCoords: Función que actualiza las coordenadas. vfnActualizarCursor: Función que actualiza las coordenadas del cursor. cfnSetPromptPos: Función que permite setear la posición del prompt. Parámetros de entrada: o iFila parámetro correspondiente a la fila de la coordenada o Columna parámetro correspondiente a la columna de la coordenada Devuelve: si se le pasa un cualquiera devuelve cero, de lo contrario uno vfnImpNum : Función que imprime un numera en la ubicación correspondiente. Parámetros de entrada: o unsigned long int uliDir o int iFila o int iCol ifnLeerStr : Función que lee un string desde el teclado mientras lo ingresado sea menor a iTamMax y mientras no se encuentre un caracter igual a cStop. Parámetros de entrada: o *strDestino variable puntero que o iTamMaxtamanio maximo del caracter ingresado o cStop indica el tamanio que puedo ingresar como comando Devuelve: Devuelve cero si el tamanio maximo es menor a cero, de lo contrario devuelve iCont, que es el tamnio del string ingresado Archivo: floppy.c Relación entre archivos: Relación entre funciones: 37/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM Funciones ifnLeerDeDiskette : lee n sectores del disket Parámetros de entrada: o cantSect cantidad de sectores a leer o sectInicial sector del diskete apartir del cual se comienza a leer o *buf region de memoria donde se almacenan los sectores leidos Devuelve: 0 si puedo leer, 1 si ocurrio algun error ifnCargarDirRaiz : lee el directorio raíz y lo guarda en la variable pasada por parameto Devuelve: Int - 0 si pudo leer, 1 si ocurrio algun error. ifnCargarFatDiskette : carga la posición en pcCargaFat Devuelve: Int - 0 si pudo leer, 1 si ocurrio algun error. ifnGrabarArchivoADisco : lee "archivo" del disket y lo graba en el disco Parámetros de entrada: 38/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM o entrada nombre del archivo a copiar en formato 8+3 (8 caracteres para el nombre y 3 de extencion) ejemplo (BUM BIN) o sectorInicial sector del disco en LBa a partir del cual de quiere grabar el archivo. Devuelve: 1 si no ocurre ningun error, -1 si no encuentra el archivo o no puede leerlo, -2 si no puede grabarlo. uifnCalcularSecSig : busca en al fat el siguiente sector Parámetros de entrada: o sector actual Devuelve: unsigned int (siguiente sector a leer o finDeArchivo (0x0FFF).) ifnBuscarEntradaDirRaiz : busca una entrada en el directorio Raíz Parámetros de entrada: o entrada nombre del archivo buscado en formato 8+3 Devuelve: int - nro de entrada si la encuentra o -1 si no la encuentra uifnBuscarPrimerSector : busca en la entrada del directorio raíz el primer sector del archivo Parámetros de entrada: o nroEntrada entrada en el directorio raiz correspondiente al archivo que se quiere leer Devuelve: unsigned int (sector inicial del archivo) Archivo: mem.c Relación entre archivos: Relación entre funciones: 39/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM Funciones ifnDireccionAbsoluta : Calcula la direccion absoluta (esto es, adicionarle el DS) del puntero que se le pasa como parámetro. Parámetros de entrada: o *pvVariable variable de la que quiero averiguar su direccion absoluta Devuelve: unsigned int (Direccion absoluta de la variable que se pasa por parámetro) ifnCopiarADirAbs: Esta función copia memoria. Parámetros de entrada: o *ucpDestino puntero al destino dirDestino Direccion absoluta de memoria uiTamanio cantidad de bytes a copiar Devuelve: int (Siempre 1) Archivo: part.c Relación entre archivos: Relación entre funciones: 40/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM 41/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM 42/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM Funciones pstufnNuevaParticion : Función que me permite alocar memoria para el array particiones. Devuelve: Devuelve un puntero a la nueva entrada. 0 si no hay mas lugar. pstufnNuevaParticionEjec : Función que me permite alocar memoria para el array de particiones ejecutables. Devuelve: Devuelve un puntero a la nueva entrada. 0 si no hay mas lugar. cfnTodosLosCamposEnCero : Verifica si una entrada de la tabla tiene todos los campos en cero. Parámetros de entrada: o *entrada entrada a analizar Devuelve: Si esta toda en cero: 1, si no: 0 vfnPonerTodosLosCamposEnCero : pone todos los campos de una entrada de la tabla en cero. Parámetros de entrada: o *entrada entrada a limpiar vfnCederEjecucion : Cede la ejecución al PBR apuntado por el parámetro pstuEntrada. Parámetros de entrada: o *entrada que contiene la direccion del PBR al que se le cedera la ejecucion ifnExplorarExtendida : Explora la partición extendida recibida por parámetro en busca de particiones lógicas y las agrega a la tabla de particiones. Parámetros de entrada: 43/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM o *pstuEntrada es la entrada de la particion extendida. Devuelve: int (1 si fue exitoso, 0 si hubo error (de lectura de disco o EBRs no firmados)) vfnHacerSalto : vfnCopiarPartTable : Copia la tabla de particiones del MBR origen al MBR destino. Hace un salto a 0x0000:0x7C00. Parámetros de entrada: o stuPartitionBootRecord * MBR original stuPartitionBootRecord * MBR destido vfnCrearTablaDeParticiones : Genera la tabla de particiones del sistema. Guarda las entradas de todas las particiones primarias y lógicas en la tabla de particiones. La tabla de particiones tiene cCantParticiones Particiones y es apuntada por la Var. gloabal astuTablaParticiones. vfnListarTablaDeParticiones : Función que recorre las cCantParticiones (Var. global) de la tabla de particiones apuntada por la Var. global astuTablaParticiones y la lista por pantalla. Muestra el tipo de partición y su tamaño. cfnCalcularEspacioNoUsado : crea una tabla de espacios no asignado en el disco de tamaño mayor a una constante definida en la función. Parámetros de entrada: o pstuTablaHuecos puntero donde se almacenara la tabla de espacios libres. Devuelve: char (devuelve la cantidad de espacios libres encontrados (cantidad de entradas en la tabla).) vfnCrearParticionPrimaria : crea una partición Parámetros de entrada: o particion es un puntero a una estructura que contiene los datos de la particion a crear. vfnCrearParticionLogica : crea una partición lógica Parámetros de entrada: o particion es un puntero a una estructura que contiene los datos de la particion a crear. o numExtendida es la entrada en la tabla de particiones que corresponde a la particion extendida dentro de la cual se creara la nueva particion logica. *pstuExtendida vfnBorrarParticionPrimaria: borra una partición Parámetros de entrada: o stuParticionABorrar entrada de la tabla astuTablaParticiones a borrar. vfnBorrarParticionLogica : borra una partición lógica Parámetros de entrada: o stuParticionABorrar entrada de la tabla astuTablaParticiones a borrar pcfnObtenerDescTipoParticion : devuelve una descripción relacionada al tipo de partición. Parámetros de entrada: o tipo numero que identifica el tipo de particion. Devuelve: puntero a un string que contiene la descripcion del tipo. 44/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM ifnSonEntradasIguales : verifica si 2 entradas son iguales. Compara campo por campo y verifica que sean iguales, si algún campo es distinto las entradas son distintas Parámetros de entrada: o punteros a la entradas a comparar Devuelve: int (1 si son iguales, 0 si son distintas) Archivo: puertos.c Relación entre funciones: Funciones outb: función que escribe un cByte en un puerto determinado (implementada en assembler) Parámetros de entrada: o iValor parámetro a escribir en el puerto puerto donde escribir Archivo: string.c Relación entre archivos: Relación entre funciones: 45/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM Funciones ifnCopiarMemoria : Esta función copia memoria. Parámetros de entrada: o *ucpDestino puntero al destino o *ucpOrigen puntero al origen o uiTamanio cantidad de bytes a copiar Devuelve: int (Siempre 1) ifnAtoI : Convierte un string ASCII a Integer. Parámetros de entrada: o char *strA o int iBase Devuelve: Devuelve el entero correspondiente cfnStrCat : Concatena el origen con destino y el resultado queda en destino. Parámetros de entrada: o *dest cadena destino o *org cadena origen Devuelve: char (siempre 1) ifnStrLen : Devuelve la longitud de un string. Parámetros de entrada: o *str,es el string que se va a analizar Devuelve: int (Longitud del string que se mando por parámetro) cfnStrIguales: Verifica la igualdad de dos strings. Parámetros de entrada: o *a string 1 o *b string 2 Devuelve: Si son iguales: 1, si son distintos: 0 pcFnIntToString : Convierte un entero a string en la base especificada. Parámetros de entrada: o iNum el numero a convertir o pcStr puntero a char que apunta a la region de memoria donde se guardara el numero convertido. IMPORTANTE: el usuario de la función se debe encargar de la reserva de memoria necesaria para convertir el numero. o iBase base del numero convertido. Debe estar entre 2 y 16 (inclusive). La función NO verifica limites. Devuelve: char * (puntero al string convertido. Tiene el mismo valor que pcStr.) 46/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM Glosario BIOS: Basic Input Output System BUM: ver MBUM CHS: Cilinder-Head-Sector EBR: Extended Boot Record GRUB: GRand Unified Bootloader LBA: Logical Bolck Address MBC: Master Boot Code MBR: Master Boot Record MBUM: MultiBootloader de la Universidad de La Matanza MPT: Master Partition Table PBR: Partition Boot Record SO: Sistema Operativo SODIUM: Sistema Operativo del Departamento de Ingeniería de la Universidad de La Matanza 47/48 SISTEMAS OPERATIVOS-UNLAM 2010 – DOCUMENTACIÓN DEL MBUM Bibliografía: [01] Bootloaders – an introduction Barry Nauta. December 3, 2008. [02] the GNU GRUB manual Version 0.97. May 8, 2005 Internet [03] Details of GRUB on the PC (2005) http://www.pixelbeat.org/docs/disk/ [04] SUSE Documentación de LINUX. Capítulo 29. Cargador de arranque / 29.3. Arranque con GRUB (Novell Inc.) http://www.mafuso.net/susemanual//index.html [05] Sitio Oficial de Grub, http://www.gnu.org/software/grub/ [06] Manual de Grub desde GNU, http://www.gnu.org/software/grub/manual/html_node/ [07] http://www.zator.com/Hardware/H8_1_2c.htm [08] http://mirror.href.com/thestarman/asm/mbr/index.html 48/48