Trab 8

Share Embed Donate


Short Description

Download Trab 8...

Description

Instituto Tecnológico de Las Américas (ITLA)

Oscar Javier Marte Gómez (2013-1760)

Sistema operativo I

José Doñe

C-2

TRABAJO NO. 8 (COMO CREAR UN SISTEMA OPERATIVO)

TRABAJO NO. 8 (COMO CREAR UN SISTEMA OPERATIVO) INVESTIGAR Y PREPARAR UN TRABAJO TR ABAJO DE COMO SE CREA UN SISTEMA OPERATIVO, TODOS LOS PASOS P ASOS NECESARIOS PARA LA CREACION DE UN SISEMA SISEM A OPERATIVO DESDE CERO.

El primer paso para la l a creación de un Sistema Operativo, desde hace bastante tiempo, consiste, en los mejores casos, en buscar una implementación (kernel) de Linux o similares. En muchas ocasiones, simplemente se modifican se modifican distribuciones (como Ubuntu) modificando los paquetes que incluyen. Aun con este panorama tan desalentador, quedan por la red muchos artículos sobre Cómo sobre  Cómo hacer un Sistema Operativo desde cero (en inglés) usando lenguaje ensamblador y diversas convenciones. Si bien esa última opción es la de más bajo nivel, consiste en asumir muchas cosas que van a pasar factura tarde o temprano en elSistema el Sistema Operativo: instrucciones no disponibles en algunos al gunos microprocesadores, microprocesadores, mapeos en diferentes direcciones de memoria, o incluso, diferentes salidas dependiendo del fabricante del dispositivo, y sin duda un largo etcétera. Por eso, mi idea es utilizar una arquitectura sencilla, abierta, y estándar. La que mejor se ajusta a estas condiciones es, sin duda, la Arquitectura la Arquitectura eWa, que eWa, que permite ejecutarse en dispositivos nativos o virtuales como Sistemas Operativos o páginas web. Se trata de un diseño minimalista de un Sistema Informático. En su núcleo hay tan solo tres unidades: una CPU, unaABU, una MMU y una bujía. Aunque estos nombres recuerdan a unidades existentes en otras arquitecturas, en el caso de laArquitectura eWa son unas unidades, a su vez, muy sencillas. El núcleo está conectado a un Espacio de Direccionesdonde se encuentran los distintos dispositivos y controladores. Los dispositivos son componentes que proveen de memoria (de escritura y/o lectura constante) el Espacio de Direcciones; mientras que los controladores son componentesque conectan con el Sistema al través del Espacio de Direcciones. La CPU (Unidad de Procesamiento Central) tiene un cometido muy reducido en La CPU comparación con la complejidad habitual de otros microprocesadores. En ésta se encuentran sólo cuatro grupos de registros: el K (1bit), el GHIJ (4bits), el ZUVW(4bits) y el 0123456789A 0123456789ABCDEF BCDEF (16bits). Implementa dos funciones internas, la de lectura y la de escritura; la primera realiza la escritura del valor de 1 bit correspondiente al registro seleccionado del grupo 0123456789ABCDEF 0123456789ABCDEF en el registroK, mientras que la segunda lo hace de K a 0123456789AB 0123456789ABCDEF. CDEF. Las funciones externas que realiza están relacionadas con la obtención de las

instrucciones (escribiendo cada instrucción, de 4 bits cada una -tiene por tanto 16 instrucciones-, en el grupo GHIJ) por medio de la MMU, y de comunicación con laABU. La ABU (Unidad Básica de Aritmética) tiene el cometido más sencillo de las La ABU tres unidades junto a la bujía. Básicamente lo que hace es realizar operaciones lógicas básicas (unarias y binarias): or, nor; nxor, nand; not; y xor, and. Tiene tres grupos de registros (MN, OP y XY) de 2 bit s cada uno. Los primeros corresponden a los valores de entrada, los siguientes indican la operación a ejecutar, y en los dos últimos se pondrán los valores de salida. Por lo tanto, es capaz de hacer hasta 16 (2*8) operaciones diferentes, aunque ciertamente sólo distingue las siete anteriores. Esta unidad conecta exclusivamente con la CPU. La MMU (Unidad de Mapeo de Memoria) es quizás la más complicada de las La MMU unidades del núcleo del Sistema Informático. Es la puerta de acceso al Espacio de Direcciones. Los registros de la MMU se llaman punteros, y hay tres tipos. El puntero PC (o PCero, ya que es el puntero 0, aunque éste no está visible para el programador) es el encargado de apuntar al comienzo de la siguiente instrucción a ejecutar por la CPU. Por otra parte están cuatro punteros básicos llamadoswitQ, witR, witS y witT que permiten al programador tener apuntadas diferentes direcciones del Espacio de Direcciones. Y por último, están los punteros L, que son un número pseudodeterminado (generalmente tres u ocho) de punteros iguales que sirven para apuntar distintas direcciones, así como para también guardar datos. Esta unidad también tiene dos tipos de funciones. El primer tipo sirve para acceder al Espacio de Direcciones, copiando al registro K de la CPU al registro del Espacio de Direcciones que apunte el puntero actual, o viceversa. El segundo tipo sirve para administrar los punteros y páginas de la propia MMU dependiendo del grupo de registros ZUVW de la CPU. La bujía es una unidad "de arranque y recuperación" y es la encargada de arrancar el sistema, al igual que una bujía arranca el motor de un coche. Os recomiendo seguir los links de las tres unidades, ya que en la documentación se pueden encontrar tablas y más información sobre cada una de ellas que comento en la entrada de hoy de forma breve.

0. Resumen: El microprocesador controla el equipo. Al iniciar la computadora, el microprocesador trabaja como un 8086. A pesar de que usted pueda tener un nuevo, de marca Pentium, sólo tendrá la capacidad de un 8086. Desde este punto, podemos utilizar algún software del procesador y cambiar al modo protegido infame. Sólo entonces podremos utilizar la potencia máxima del procesador. 0.1 Nuestro objetivo Inicialmente, el control está en manos de la BIOS. Esto no es sino una colección de programas que se almacenan en la memoria m emoria ROM. BIOS realiza el POST (Power On Self Test). Esto comprueba la integridad de la computadora (si los periféricos funcionan correctamente, si el teclado está conectado, etc.) Esto es cuando usted oye los sonidos de la computadora (si es nueva la computadora, hará menos ruido, aún así l o hace). Si todo está bien, la BIOS selecciona un dispositivo de arranque. Se copia el primer sector (sector de arranque) del dispositivo, para hacer frente fr ente a la ubicación 0x7C00. El control se transfiere a esta ubicación. El dispositivo de arranque puede ser un disquete, CD-ROM, disco duro u otro dispositivo de su elección. Aquí tomaremos un disquete como el dispositivo de arranque. Si hubiéramos escrito algo de código en el sector de arranque del disquete, nuestro código sería ejecutado ahora. Nuestro papel es claro: sólo escribiremos algunos programas para el sector de arranque del disquete. 0.2 El Plan Primero escribe un pequeño programa en 8086 de montaje (no se asusten, yo le enseñaré cómo escribirlo), y copiarlo en el sector de arranque del disquete. Para copiarlo, vamos a utilizar un código de un programa de C. Inicie el equipo con ese disquete, y luego, a disfrutar. Lo probaremos en una máquina virtual, ya que algunas computadoras o portátiles no tienen dis quetera. Si tiene disquetera y un disquet, lo puede probar en su computadora.

0.3 Cosas que usted debe tener as86 Este es un ensamblador (compilador). El código de ensamblador se escribe, después se convierte en un archivo/objeto con esta herramienta/aplicación. ld86 Este es el vinculador. El código objeto generado por AS86 se convierte en verdadero código de lenguaje de máquina gracias esta herramienta. El lenguaje de máquina será la forma que entiende 8086. gcc El compilador de C. De momento tenemos que escribir un programa en C para transferir nuestro sistema operativo en el disquete. Linux: cualquier distribución Linux. Para instalar estos paquetes debe de saber instalar paquetes desde los repositorios oficiales de su distribución. Normalmente estos paquetes ya están incluidos en la distribución. Otros: un disquete formateado (utilizaremos una imagen .img para usarlo en la máquina virtual) Un disquete se utiliza para almacenar a lmacenar el sistema operativo (sus archivos). Esto también es nuestro dispositivo de arranque. Máquina virtual o computadora con disquetera. Los puntos 0.X eran importante leerlos. Aunque no os interesen si los leen ahorraremos problemas. Empecemos

1. Empecemos 1.1 El sector de arranque

Inicie su editor favorito y escriba o copie estas líneas. entry start start: mov ax,#0xb800 mov es,ax seg es mov [0],#0x41 seg es mov #0x1f loop1: jmp loop1 Este es un programa en lenguaje ensamblador AS86 que va a entender. La primera declaración especifica el punto de entrada donde el control debe entrar en el programa. Estamos diciendo que el control debe ir inicialmente para comenzar la etiqueta. La línea 2 muestra la ubicación de la etiqueta de inicio (no se olvide de poner ":" después de la salida). La primera instrucción que se ejecutará en este programa es la declaración que acaba después de la puesta. 0xb800 es la dirección de la memoria de vídeo. El # es para representar un valor inmediato. Después de la ejecución de mov ax, # 0xb800 El registro ax contendrá el valor 0xb800, es decir, la dirección de la memoria de vídeo. Ahora trasladamos este valor, es el registro. es representa el registro de segmento extra. Recuerde que 8086 tiene una arquitectura segmentada. Cuenta con segmentos como segmentos de código, segmentos de datos, segmentos extras, etc., por lo tanto los registros de segmento CS, DS, ES. En realidad, hemos hecho la memoria de vídeo nuestro segmento extra, así que cualquier cosa escrita al segmento extra irá a la memoria de vídeo. Para mostrar cualquier carácter en la pantalla, tiene que escribir dos bytes en la memoria de vídeo. El primero es el valor ASCII que va a mostrar. El segundo es el atributo del carácter. El atributo tiene que ver con el color que debe utilizarse como el primer plano, que para el fondo, debe abrir y cerrar char y así sucesivamente. seg es en realidad es un prefijo que indica que la enseñanza se va a ejecutar junto con la referencia a la serie de sesiones es. Por lo tanto, nos movemos a 0x41 valor, que es el valor ASCII del carácter A, en el primer byte de la memoria de vídeo. Lo siguiente que necesitamos para mover el

atributo del carácter a la siguiente byte. Aquí entramos en 0x1f, que es el valor de representar a un personaje blanco sobre fondo azul. Así que si ejecutamos este programa, tenemos una A blanca sobre un fondo azul. Por último, existe el bucle. Tenemos que detener la ejecución después de la presentación del personaje, o tenemos un lazo que los bucles tienen para siempre. Guarde el archivo como boot.s. La idea de la memoria de vídeo puede no ser muy clara, así que permítanme explicar con más detalle. Supongamos que asumimos que la pantalla consta de 80 columnas y 25 filas. Así que para cada línea tenemos 160 bytes, uno para cada personaje y una para el atributo de cada personaje. Si tenemos que escribir algunos carácteres para la columna 3, entonces tenemos que saltar los bytes 0 y 1, ya que están en la columna 1, 2 y 3 como lo son para la columna 2, y luego escribir nuestro valor ASCII para el 4 º byte y at ribuyen a la ubicación de 5 º en la memoria de vídeo. 1.2 Escribiendo el sector de arranque para el disquete Tenemos que escribir un programa en C que copie nuestro código (código del sistema operativo) para el primer sector del disquete. Aquí está: #include /* unistd.h necesita esto */ #include /* contiene lectura/escritura */ #include int main() { char boot_buf[512]; int floppy_desc, file_desc;

file_desc = open("./boot", O_RDONLY); read(file_desc, boot_buf, 510); close(file_desc); boot_buf[510] = 0x55; boot_buf[511] = 0xaa; floppy_desc = open("/dev/fd0", O_RDWR); lseek(floppy_desc, 0, SEEK_CUR); write(floppy_desc, boot_buf, 512); close(floppy_desc); }

Lo primero es abrir el archivo de arranque en modo de sólo lectura, y copiar el archivo descripter del expediente abierto a file_desc variable. Leer el archivo de 510 caracteres o hasta que el archivo termine. Aquí el código es pequeño, así que el último caso se produce. Es digno; cierre el archivo. Las últimas cuatro líneas de código abierto el dispositivo de disco (que en su mayoría sería / dev/fd0). Lleva la cabeza hasta el comienzo de un archivo usando lseek, a continuación, escribe los 512 bytes del búfer al disquete. Las páginas de manual de lectura, escritura, abierta y lseek (se refieren al hombre 2) le dan suficiente información sobre lo que los demás parámetros de esas funciones son y cómo usarlos. Hay dos líneas en el medio, que puede ser un poco misterioso. Las líneas: boot_buf[510] = 0x55; boot_buf[511] = 0xaa; Esta información es para la BIOS. Si el BIOS es el de r econocer un dispositivo como un dispositivo de arranque, el dispositivo debe tener los valores y 0x55 0xAA en la 510 ª y 511 ª ubicación. Ahora hemos terminado. El programa lee el archivo de arranque a un buffer llamado boot_buf. Hace que los cambios requeridos para 510 ª y 511 ª bytes y luego escribe boot_buf en un disquete. Si ejecutamos el código, los primeros 512 bytes del disco contendrá nuestro código de arranque. Guarde el archivo como write.c. 1.3 Vamos a compilar Para hacer los ejecutables, usted tiene que iniciar el shell de Linux y ejecutar estos comandos: as86 boot.s -o boot.o ld86 -d boot.o -o boot cc write.c -o write 1.4 A ejecutarlo  Ahora copiamos los archivos archivos creados a un disquete disquete formateado y ejecuta el ordenador desde desde el disquet. disquet. Iniciará el sistema sistema operativo 2. Ejecutar el sistema operativo en máquina virtual.

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF