Вы находитесь на странице: 1из 8

Instituto Tecnolgico de Las Amricas

(ITLA)

Oscar Javier Marte Gmez
(2013-1760)

Sistema operativo I

Jos Doe

C-2
TRABAJO NO. 8 (COMO CREAR UN SISTEMA OPERATIVO)



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


El primer paso para la creacin de un Sistema Operativo, desde hace bastante
tiempo, consiste, en los mejores casos, en buscar una implementacin (kernel)
de Linux o similares. En muchas ocasiones, simplemente se modifican
distribuciones (como Ubuntu) modificando los paquetes que incluyen. Aun con
este panorama tan desalentador, quedan por la red muchos artculos
sobre Cmo hacer un Sistema Operativo desde cero (en ingls) usando
lenguaje ensamblador y diversas convenciones.

Si bien esa ltima opcin es la de ms bajo nivel, consiste en asumir muchas
cosas que van a pasar factura tarde o temprano en elSistema Operativo:
instrucciones no disponibles en algunos microprocesadores, mapeos en
diferentes direcciones de memoria, o incluso, diferentes salidas dependiendo
del fabricante del dispositivo, y sin duda un largo etctera.

Por eso, mi idea es utilizar una arquitectura sencilla, abierta, y estndar. La que
mejor se ajusta a estas condiciones es, sin duda, la Arquitectura eWa, que
permite ejecutarse en dispositivos nativos o virtuales como Sistemas
Operativos o pginas web.

Se trata de un diseo minimalista de un Sistema Informtico. En su ncleo hay
tan solo tres unidades: una CPU, unaABU, una MMU y una buja. 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 ncleo 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 travs del Espacio de Direcciones.

La CPU (Unidad de Procesamiento Central) tiene un cometido muy reducido en
comparacin con la complejidad habitual de otros microprocesadores. En sta
se encuentran slo cuatro grupos de registros: el K (1bit), el GHIJ (4bits),
el ZUVW(4bits) y el 0123456789ABCDEF (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 en el registroK, mientras que la segunda lo hace
de K a 0123456789ABCDEF.
Las funciones externas que realiza estn relacionadas con la obtencin de las
instrucciones (escribiendo cada instruccin, de 4 bits cada una -tiene por tanto
16 instrucciones-, en el grupo GHIJ) por medio de la MMU, y de comunicacin
con laABU.

La ABU (Unidad Bsica de Aritmtica) tiene el cometido ms sencillo de las
tres unidades junto a la buja. Bsicamente lo que hace es realizar operaciones
lgicas bsicas (unarias y binarias): or, nor; nxor, nand; not; y xor, and. Tiene
tres grupos de registros (MN, OP y XY) de 2 bits cada uno. Los primeros
corresponden a los valores de entrada, los siguientes indican la operacin a
ejecutar, y en los dos ltimos se pondrn los valores de salida. Por lo tanto, es
capaz de hacer hasta 16 (2*8) operaciones diferentes, aunque ciertamente slo
distingue las siete anteriores.
Esta unidad conecta exclusivamente con la CPU.

La MMU (Unidad de Mapeo de Memoria) es quizs la ms complicada de las
unidades del ncleo del Sistema Informtico. 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
instruccin a ejecutar por la CPU. Por otra parte estn cuatro punteros bsicos
llamadoswitQ, witR, witS y witT que permiten al programador tener apuntadas
diferentes direcciones del Espacio de Direcciones. Y por ltimo, estn
los punteros L, que son un nmero pseudo-
determinado (generalmente tres u ocho) de punteros iguales que sirven para
apuntar distintas direcciones, as como para tambin guardar datos.
Esta unidad tambin 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 pginas de la
propia MMU dependiendo del grupo de registros ZUVW de la CPU.

La buja es una unidad "de arranque y recuperacin" y es la encargada
de arrancar el sistema, al igual que una buja arranca el motor de un coche.

Os recomiendo seguir los links de las tres unidades, ya que en la
documentacin se pueden encontrar tablas y ms informacin 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, slo tendr la capacidad de un 8086. Desde este
punto, podemos utilizar algn software del procesador y cambiar al modo
protegido infame. Slo entonces podremos utilizar la potencia mxima del
procesador.

0.1 Nuestro objetivo

Inicialmente, el control est en manos de la BIOS. Esto no es sino una
coleccin de programas que se almacenan en la memoria ROM. BIOS realiza
el POST (Power On Self Test). Esto comprueba la integridad de la
computadora (si los perifricos 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, an as lo 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 a la ubicacin 0x7C00. El control
se transfiere a esta ubicacin. El dispositivo de arranque puede ser un
disquete, CD-ROM, disco duro u otro dispositivo de su eleccin. Aqu
tomaremos un disquete como el dispositivo de arranque. Si hubiramos escrito
algo de cdigo en el sector de arranque del disquete, nuestro cdigo sera
ejecutado ahora. Nuestro papel es claro: slo escribiremos algunos programas
para el sector de arranque del disquete.

0.2 El Plan

Primero escribe un pequeo programa en 8086 de montaje (no se asusten, yo
le ensear cmo escribirlo), y copiarlo en el sector de arranque del disquete.
Para copiarlo, vamos a utilizar un cdigo de un programa de C. Inicie el equipo
con ese disquete, y luego, a disfrutar. Lo probaremos en una mquina virtual,
ya que algunas computadoras o porttiles no tienen disquetera. 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 cdigo de ensamblador se escribe,
despus se convierte en un archivo/objeto con esta herramienta/aplicacin.

ld86

Este es el vinculador. El cdigo objeto generado por AS86 se convierte en
verdadero cdigo de lenguaje de mquina gracias esta herramienta. El
lenguaje de mquina 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 distribucin Linux. Para instalar estos paquetes debe de saber
instalar paquetes desde los repositorios oficiales de su distribucin.
Normalmente estos paquetes ya estn incluidos en la distribucin.

Otros: un disquete formateado (utilizaremos una imagen .img para usarlo en la
mquina virtual)

Un disquete se utiliza para almacenar el sistema operativo (sus archivos). Esto
tambin es nuestro dispositivo de arranque.

Mquina 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 lneas.

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 declaracin 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 lnea 2 muestra la ubicacin de la etiqueta de inicio
(no se olvide de poner ":" despus de la salida). La primera instruccin que se
ejecutar en este programa es la declaracin que acaba despus de la puesta.
0xb800 es la direccin de la memoria de vdeo. El # es para representar un
valor inmediato. Despus de la ejecucin de

mov ax, # 0xb800

El registro ax contendr el valor 0xb800, es decir, la direccin de la memoria de
vdeo. 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 cdigo, segmentos de datos,
segmentos extras, etc., por lo tanto los registros de segmento CS, DS, ES. En
realidad, hemos hecho la memoria de vdeo nuestro segmento extra, as que
cualquier cosa escrita al segmento extra ir a la memoria de vdeo.

Para mostrar cualquier carcter en la pantalla, tiene que escribir dos bytes en la
memoria de vdeo. El primero es el valor ASCII que va a mostrar. El segundo
es el atributo del carcter. 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 enseanza
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 carcter A, en el primer
byte de la memoria de vdeo. Lo siguiente que necesitamos para mover el
atributo del carcter 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 ejecucin despus de la presentacin del
personaje, o tenemos un lazo que los bucles tienen para siempre. Guarde el
archivo como boot.s.

La idea de la memoria de vdeo puede no ser muy clara, as que permtanme
explicar con ms detalle. Supongamos que asumimos que la pantalla consta de
80 columnas y 25 filas. As que para cada lnea tenemos 160 bytes, uno para
cada personaje y una para el atributo de cada personaje. Si tenemos que
escribir algunos carcteres para la columna 3, entonces tenemos que saltar los
bytes 0 y 1, ya que estn 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 atribuyen a la ubicacin
de 5 en la memoria de vdeo.

1.2 Escribiendo el sector de arranque para el disquete

Tenemos que escribir un programa en C que copie nuestro cdigo (cdigo del
sistema operativo) para el primer sector del disquete. Aqu est:

#include <sys/types.h> /* unistd.h necesita esto */
#include <unistd.h> /* contiene lectura/escritura */
#include <fcntl.h>

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 slo 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 cdigo es pequeo, as
que el ltimo caso se produce. Es digno; cierre el archivo.

Las ltimas cuatro lneas de cdigo abierto el dispositivo de disco (que en su
mayora sera / dev/fd0). Lleva la cabeza hasta el comienzo de un archivo
usando lseek, a continuacin, escribe los 512 bytes del bfer al disquete.

Las pginas de manual de lectura, escritura, abierta y lseek (se refieren al
hombre 2) le dan suficiente informacin sobre lo que los dems parmetros de
esas funciones son y cmo usarlos. Hay dos lneas en el medio, que puede ser
un poco misterioso. Las lneas:

boot_buf[510] = 0x55;
boot_buf[511] = 0xaa;

Esta informacin es para la BIOS. Si el BIOS es el de reconocer un dispositivo
como un dispositivo de arranque, el dispositivo debe tener los valores y 0x55
0xAA en la 510 y 511 ubicacin. 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 cdigo, los primeros 512 bytes del disco contendr nuestro
cdigo 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 creados a un disquete formateado y ejecuta el
ordenador desde el disquet. Iniciar el sistema operativo

2. Ejecutar el sistema operativo en mquina virtual.