Que Hay Dentro De Las Cosas-Como hacer tu propio sistema operativo

Crea tu Sistema Operativo desde cero original. No es un Windows Desatendido ni un *NIX modificado.

Copyright (C) 2002 Krishnakumar R.

Traducido y adaptado por mí (no Repost) esto es lo más básico en otro post agregaré más cosas.

Este artículo es un tutorial práctico para la construcción de un pequeño sector de arranque. La primera sección contiene la teoría de lo que ocurre en el momento que se enciende el ordenador. También explica nuestro plan. La segunda sección le dice todas las cosas que usted debe tener a mano antes de seguir adelante, y la tercera sección se ocupa de los programas. (Estas dos secciones comentadas, la segunda y tercera se publicarán en otro post) Nuestro programa de inicio, en realidad, no va a arrancar Linux, pero mostrará algo en la pantalla.

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 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í 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 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 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 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 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],#0×41
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 0×41 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 atribuyen 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 <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] = 0×55;
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] = 0×55;
boot_buf[511] = 0xaa;

Esta información 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 0×55 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 creados a un disquete formateado y ejecuta el ordenador desde el disquet. Iniciará el sistema operativo

2. Ejecutar el sistema operativo en máquina virtual

En construcción

About these ads

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s