Vous êtes sur la page 1sur 9

Como crear un sistema operativo

1. Fondo 1.1 El Vestido De fantasa El microprocesador controla el ordenador. En el arranque, cada microprocesador es solamente otros 8086. Incluso aunque usted pueda tener un nuevo Pentium, esto slo tendr las capacidades de los 8086. De este punto, podemos usar algn software y cambiar el procesador al modo infame protegido. Slo entonces podemos nosotros utilizar el poder lleno del procesador. 1.2 Nuestro Papel Al principio, el control est en las manos del BIOS. Esto es nada ms que una coleccin de los programas que son almacenados en la memoria slo de lectura. El BIOS realiza el POSTE (el Poder Sobre M la Prueba). Esto comprueba la integridad del ordenador (si los perifrico trabajan correctamente, si el teclado es unido, etc.). Esto es cuando usted oye aquellos pitidos del ordenador. Si todo es bien, el BIOS selecciona un dispositivo de bota. Esto copia el sector primario (el sector de bota) del dispositivo, dirigir la posicin 0x7C00. El control entonces es transferido a esta posicin. El dispositivo de bota puede ser una disquete, el CD-ROM, el disco duro o algn dispositivo de su opcin. Aqu tomaremos el dispositivo de bota para ser una disquete. Si nosotros hubiramos escrito algn cdigo en el sector de bota del disquete, nuestro cdigo sera ejecutado ahora. Nuestro papel es claro: solamente escriba algunos programas al sector de bota del disquete. 1.3 El Plan Primero escriba un pequeo programa en 8086 asamblea (no est asustado; Le ensear como escribirlo), y lo copiar al sector de bota del disquete. Para copiar, cifraremos un programa C. Eche el ordenador con aquel disquete, y luego disfrute. 2. Cosas Usted Deberan Tener As86 Esto es un ensamblador. El cdigo de asamblea que escribimos es convertido a un archivo de objeto por este instrumento. Ld86 Esto es el enlazador. El cdigo de objeto generado por as86 es convertido al cdigo de lenguaje mquina real por este instrumento. El lenguaje mquina estar en una forma que 8086 entiende. gcc El recopilador C. Por ahora tenemos que escribir un programa C para transferir nuestro OS al disquete. Un disquete libre Un disquete ser usado almacenar nuestro sistema operativo. Esto tambin es nuestro dispositivo de bota. Viejos Buenos Linux caja Usted sabe para qu esto es. As86 y ld86 estar en la mayor parte de las distribuciones estndar. Si no, usted siempre puede conseguirlos del sitiohttp: // www.cix.co.uk / ~ seal de socorro/. Ambos son incluidos en el paquete solo, bin86. La documentacin buena est disponible enWww.linux.org/docs/ldp/howto/AssemblyHOWTO/as86.html. 3. 1, 2, 3, Principio! 3.1 El Sector de Bota Agarre a su redactor favorito y teclee estas pocas lneas. principio de principio de entrada: mov hacha, *0xb800 mov es, hacha seg es mov [0], *0x41 seg es mov , *0x1f loop1: jmp loop1 Esto es un lenguaje ensamblador que as86 entender. La primera declaracin especifica el punto de entrada donde el control debera entrar en el programa. Declaramos que el control al principio debera ir a

etiquetarprincipio. La 2a lnea representa la posicin de la etiquetaprincipio ( no olvide de poner ":" despus del principio). La primera declaracin que ser ejecutada en este programa es la declaracin solamente despus del principio. 0xb800 es la direccin de la memoria de vdeo. El * es para representar un valor inmediato. Despus de la ejecucin mov hacha, *0xb800 el hacha de registro contendr el valor 0xb800, es decir la direccin de la memoria de vdeo. Ahora movemos este valor a el esregistro. es significa el registro de segmento suplementario. Recuerde que 8086 tiene una arquitectura segmentada. Esto tiene segmentos como segmentos de cdigo, segmentos de datos, extra segmenta, etc. - de ah el segmento registra cs, ds, es. En realidad, hemos hecho la memoria de vdeo nuestro segmento suplementario, entonces algo escrito para extra segmentar ira a la memoria de vdeo. Para mostrar cualquier carcter sobre la pantalla, usted tiene que escribir dos octetos a la memoria de vdeo. El primero es el valor de ascii que usted va a mostrar. El segundo es el atributo del carcter. El atributo tiene que ver con que el color debera ser usado como el primer plano, que para el fondo, debe el parpadeo de trabajo por horas etctera. seg eses en realidad un prefijo que cuenta al cual la instruccin debe ser ejecutada despus con la referencia es segmento. Tan, movemos el valor 0x41, que es el valor de ascii de carcter A, en el primer octeto de la memoria de vdeo. Despus tenemos que mover el atributo del carcter al siguiente octeto. Aqu entramos en 0x1f, que es el valor para representar un carcter blanco sobre un fondo azul. Tan si ejecutamos este programa, nos hacemos unos blancos un sobre un fondo azul. Finalmente, hay lazo. Tenemos que parar la ejecucin despus de la demostracin del carcter, o tenemos un lazo esto lazos siempre. Salve el archivo como boot.s. La idea de memoria de vdeo no puede ser muy clara, tan djeme explicar ms lejos. Suponga asumimos que la pantalla consiste en 80 columnas y 25 filas. Tan para cada lnea necesitamos 160 octetos, un para cada carcter y un para el atributo de cada carcter. Si nosotros tengamos que escribir algn carcter a la columna 3 entonces tenemos que saltar octetos 0 y 1 como ellos son para la 1a columna; 2 y 3 como ellos son para la 2a columna; y luego escriba nuestro valor de ascii al 4o octeto y su atributo a la 5a posicin en la memoria de vdeo. 3.2 Escritura de Sector de Bota a Disquete Tenemos que escribir un programa C que copia nuestro cdigo (OS el cdigo) al sector primario de la disquete. Aqu es: *include /* unistd.h necesita que este */*include /* contenga leen/escriben */*include int principal () {trabajo por horas boot_buf [512]; int floppy_desc, file_desc; file_desc = abierto (" ."/bota, O_RDONLY); lea (file_desc, boot_buf, 510); cerca (file_desc); boot_buf [510] = 0x55; boot_buf [511] = 0xaa; floppy_desc = abierto ("/dev/fd0", O_RDWR); lseek (floppy_desc, 0, SEEK_CUR); escriba (floppy_desc, boot_buf, 512); cerca (floppy_desc); } Primero, abrimos el archivo bota en modo slo para leer, y copia el archivo descripter del archivo abierto a variablefile_desc. Leer del archivo 510 carcteres o hasta los finales de archivo. Aqu el cdigo es pequeo, entonces el caso ltimo ocurre. Est decente; cierre el archivo. Las cuatro ltimas lneas de cdigo abren el dispositivo de disquete (que sobre todo sera/dev/fd0). Esto trae la cabeza al principio de la utilizacin de archivolseek, entonces escribe 512 octetos del parachoques al disquete. Las pginas de hombre de los ledo, escriba, abierto y lseek (refirase al hombre 2) le dara bastante informacin sobre lo que otros parmetros de aquellas funciones son y como usarlos. Hay dos lneas en medio, que pueden ser ligeramente misteriosas. Las lneas: boot_buf [510] = 0x55; boot_buf [511] = 0xaa;

Esta informacin es para el BIOS. Si el BIOS debe reconocer un dispositivo como un dispositivo bootable, entonces el dispositivo debera tener los valores 0x55 y 0xaa en la 510 y 511 posicin. Ahora somos hechos. El programa lee el archivo bota a un parachoques llam boot_buf. Esto hace los cambios requeridos a 510 y 511 octetos y luego escribe boot_buf a la disquete. Si ejecutamos el cdigo, primeros 512 octetos de la disquete contendrn nuestro cdigo de bota. Salve el archivo comowrite.c. 3.3 Ir a Hacerlo Todo Para hacer executables de este archivo usted tiene que escribir lo siguiente en el golpe de Linux sin falta. As86 boot.s-o boot.o Ld86-d boot.o-o bota cc write.c-o escriben Primero, nos reunimos el boot.s formar un archivo de objeto boot.o. Entonces unimos este archivo para conseguir el archivo final bota. El -d para ld86 es para quitar todos los jefes y producir el binario puro. La lectura del hombre pagina para as86 y ld86 se despejar alguno duda. Entonces compilamos el programa C para formarnos un ejecutable llamado escribir. Inserte un disquete en blanco en la unidad de disco flexible y el tipo ./escribir Reinicialice la mquina. Entre en el sistema de BIOS y haga el disquete el primer dispositivo de bota. Ponga el disquete en el paseo y mire la bota de ordenador de su disquete de bota. Entonces usted ver 'Un' un (con el color de primer plano blanco sobre un fondo azul). Esto quiere decir que el sistema ha echado del disquete de bota hemos hecho y luego hemos ejecutado el programa de sector de bota que escribimos. Es ahora en el lazo infinito que nosotros habamos escrito al final de nuestro sector de bota. Ahora debemos reanudar el ordenador y quitar nuestro disquete de bota para echar en Linux. De aqu, querremos insertar ms cdigo en nuestro programa de sector de bota, hacerlo hacer cosas ms complejas (como la utilizacin del BIOS interrumpen, la conmutacin de proteger-modo, etc.). 1. Teora 1.1 Por qu BIOS? El BIOS hace el copiar del sector de bota a la RAM y la ejecucin de cdigo all. Adems de esto hay parte de cosas que el BIOS hace. Cuando un sistema operativo echa encima de esto no tiene un conductor de vdeo o un conductor flojo o ningn otro conductor como tal. Incluir a cualquier tal conductor en el sector de bota es casi imposible. Entonces algn otro camino debera estar all. El BIOS viene a nuestra ayuda aqu. El BIOS contiene varias rutinas que podemos usar. Por ejemplo hay rutinas listas hechas disponibles para varios objetivos como, comprobando los equipos instalados, controlando la impresora, averiguando el tamao de memoria etc. Estas rutinas son lo que llamamos el BIOS interrumpe. 1.2 Cmo invocamos el BIOS interrumpe? En lenguajes de programacin ordinarios invocamos una rutina por haciendo una llamada a la rutina. Por ejemplo en un programa C, si hay una rutina de nombre demostracin teniendo parmetros noofchar nmero de carcteres para ser mostrados, attr - el atributo de carcteres mostrados debe a solamente llamar la rutina que es solamente escriben el nombre de la rutina. Aqu aprovechamos de interrumpe. Es aprovechamos de la instruccin de asamblea int. Por ejemplo para imprimir algo sobre la pantalla llamamos la funcin de C como esto: demostracin (noofchar, attr); El equivalente con esto, cuando usamos el BIOS, nosotros escribe: int 0x10 1.3 Ahora, cmo pasamos los parmetros? Antes de la llamada del BIOS interrumpen, tenemos que cargar ciertos valores en el formato preespecificado en los registros. Suponga usamos el BIOS interrumpen 13o, que es para transferir los datos del disquete a la memoria. Antes de que la llamada interrumpa 13o tenemos que especificar la direccin de segmento que a la cual los datos seran copiados. Tambin tenemos que pasar como

parmetros el nmero de paseo, el nmero de pista, el nmero de sector, el nmero de sectores para ser transferidos etc. Esto nosotros hace por cargando los registros preespecificados con los valores necesarios. La idea ser clara despus de que usted lee la explicacin sobre el sector de bota vamos a construir. Una cosa importante consiste en que el mismo interrumpen puede ser usado para una variedad de objetivos. El objetivo para el cual un particular interrumpen es usado depende del nmero de funcin seleccionado. La opcin de la funcin es hecha dependiendo el presente de valor en el ah registro. Por ejemplo interrumpa 13o puede ser usado para mostrar una cuerda as como para conseguir la posicin de cursor. Si movemos el valor 3 registrarse ah entonces el nmero de funcin 3 es seleccionado que es la funcin usada para conseguir la posicin de cursor. Para mostrar la cuerda nos movemos 13o registrarse ah que corresponde a la demostracin de una cuerda sobre la pantalla. 2. Qu vamos a hacer? Esta vez nuestro cdigo original consiste en dos programas de lenguaje ensamblador y un programa C. El primer archivo de asamblea es el cdigo de sector de bota. En el sector de bota hemos escrito el cdigo para copiar el sector secundario del disquete al segmento de memoria 0x500 ( la posicin de direccin es 0x5000). Esto hacemos el BIOS de utilizacin interrumpe 13o. El cdigo en el sector de bota entonces transfiere el control para compensar 0 de segmento 0x500. El cdigo en el segundo archivo de asamblea es para mostrar un mensaje sobre la pantalla que usa el BIOS interrumpen 10o. El programa C es para transferir el cdigo ejecutable producido del archivo de asamblea 1 para echar el sector y el cdigo ejecutable producido del archivo de asamblea 2 al sector secundario del disquete. 3. El sector de bota La utilizacin interrumpe 13o, el sector de bota carga el sector secundario del disquete en la posicin de memoria 0x5000 (el segmento dirige 0x500). Dado debajo es el cdigo original usado por esta razn. Salve el cdigo al archivo bsect.s. LOC1=0x500 principio de principio de entrada: mov hacha, *LOC1 mov es, hacha mov bx, *0 mov dl, *0 mov dh, *0 mov ch, *0 mov cl, *2 mov Al-, *1 mov ah, *2 int 0x13 jmpi 0, *LOC1 La primera lnea es similar a un macro. Las dos siguientes declaraciones podran ser familiares a usted por ahora. Entonces cargamos el valor 0x500 en el es registro. Esto es la posicin de direccin a la cual el cdigo en el sector secundario del disquete (el sector primario es el sector de bota) es movido a. Ahora especificamos la compensacin dentro del segmento como el cero. Despus cargamos el nmero de paseo en dl registro, nmero delantero en dh el registro, la pista numera en ch el registro, el sector numera en cl regstrese y el nmero de sectores para ser transferidos para registrarseAl-. Entonces vamos a cargar el sector 2, del nmero 0 de pista, el nmero 0 de paseo para segmentar 0x500. Todo esto corresponde a 1.44Mb el disquete. Movimiento de valor 2 en registro ah es corresponde al escogimiento de un nmero de funcin. Esto debe escoger de las funciones proporcionadas por el interrumpir 13o. Escogemos la funcin el nmero 2 que es la funcin usada para transferir datos del disquete. Ahora nos llamamos interrumpen 13o y finalmente saltan a la 0a compensacin en el segmento 0x500. 4. El sector secundario El cdigo en el sector secundario va a como dado debajo: principio de principio de entrada: mov ah, *0x03 xor bh, bh int 0x10 mov cx, *26 mov bx, *0x0007 mov bp, *mymsg mov hacha, *0x1301 int 0x10

Loop1: jmp loop1 mymsg: .byte 13,10 .ascii " el BIOS que se Maneja interrumpe " Este cdigo ser cargado para segmentar 0x500 y ejecutado. El cdigo aqu usa interrumpen 10o conseguir la posicin de cursor corriente y luego imprimir un mensaje. Las tres primeras lneas de cdigo (comenzando de la 3a lnea) son usadas para conseguir la posicin de cursor corriente. Aqu funcione el nmero 3 de interrumpen 13o es seleccionado. Entonces limpiamos el valor en bh registro. Movemos el nmero de carcteres en la cuerda para registrarnos ch. bx movemos el nmero de pgina y el atributo que debe ser puesto mostrando. Aqu planificamos mostrar carcteres blancos sobre el fondo negro. Entonces direccin del mensaje para ser ser imprimido en movido registrarse bp. El mensaje consiste en dos octetos que tienen valores 13 y 10 que corresponde a un entrar que est el Retorno de carro (CR) y la Lnea de alimentacin (LF) juntos. Entonces hay una 24 cadena de caracteres. Entonces seleccionamos la funcin que corresponde a la impresin de la cuerda y luego el movimiento del cursor. Entonces viene la llamada de interrumpir. Al final viene el lazo habitual. 5. El programa C Dan al cdigo original del programa C debajo. Slvelo en el archivo write.c. *include /* unistd.h necesita que este */*include /* contenga leen/escriben */*include int principal () {trabajo por horas boot_buf [512]; int floppy_desc, file_desc; file_desc = abierto ("./bsect", O_RDONLY); lea (file_desc, boot_buf, 510); cerca (file_desc); boot_buf [510] = 0x55; boot_buf [511] = 0xaa; floppy_desc = abierto ("/dev/fd0", O_RDWR); lseek (floppy_desc, 0, SEEK_SET); escriba (floppy_desc, boot_buf, 512); file_desc = abierto ("./sect2", O_RDONLY); lea (file_desc, boot_buf, 512); cerca (file_desc); lseek (floppy_desc, 512, SEEK_SET); escriba (floppy_desc, boot_buf, 512); cerca (floppy_desc); } En parte yo de este artculo yo haba dado la descripcin sobre la fabricacin del disquete de bota. Aqu hay diferencias leves. Primero copiamos el archivo bsect, el cdigo ejecutable producido bsect.s al sector de bota. Entonces copiamos el Sect2 el ejecutable correspondiente Sect2.s el sector secundario del disquete. Tambin los cambios para ser hechos para hacer el disquete bootable tambin han sido realizados.

7. Y ahora qu? Despus de la echada con el disquete usted puede ver la cuerda siendo mostrada. As habremos usado el BIOS interrumpe. En la siguiente parte de esta serie espero escribir sobre como podemos cambiar el procesador al modo protegido. 1. Que es Modo Protegido ? Los 80386 + proporcionan muchos nuevos rasgos para vencer las carencias de 8086 que no tiene casi ningn apoyo a la proteccin de memoria, la memoria virtual, la multiasignacin, o la memoria encima de

640 kilobyte - y en ninguna parte permanecer compatible con la 8086 familia. Los 386 tienen todos los rasgos de los 8086 y 286, con muchos realces ms. Como en los procesadores ms tempranos, hay verdadero modo. Como los 286, los 386 pueden funcionar en el modo protegido. Sin embargo, el modo protegido sobre 386 es infinitamente diferente internamente. Modo protegido sobre las 386 ofertas el programador mejor proteccin y ms memoria que sobre los 286. El objetivo de modo protegido no es para proteger su programa. El objetivo es de proteger a todos los dems (incluyendo el sistema operativo) de su programa. 1.1 Modo Protegido contra Verdadero Modo El modo superficialmente protegido y el verdadero modo no parecen ser muy diferentes. Tanto use la segmentacin memeory, interrumpe como conductores de dispositivo para manejar el hardware. Pero hay diferencias que justifican la existencia de dos modos separados. En el verdadero modo, podemos ver la memoria como 64 kilobyte segmenta atleast 16bytes aparte. La segmentacin es manejada por el empleo de un mecanismo interno en la conjuncin con registros de segmento. El contenido de estos registros de segmento (CS, DS, SS ...) forma la parte de la direccin fsica que la CPU coloca sobre el autobs de direcciones. La direccin fsica es generada por multiplicando el registro de segmento por 16 y luego aadiendo una compensacin de 16 bit. Esto es esta compensacin de 16 bit que nos limita con segmentos de 64 kilobyte. el higo 1: Verdadera Direccin de Modo

En el modo protegido, la segmentacin es definida va un juego de mesas mesas llamadas descriptivas. Los registros de segmento contienen indicadores en estas mesas. Hay dos tipos de mesas sola definir la segmentacin de memoria: La Mesa Global Descriptiva y la Mesa Local Descriptiva. El GDT contiene los descriptores bsicos a los cuales todos los usos pueden tener acceso. En el verdadero modo un segmento es 64 kilobyte grande seguido del siguiente en una distancia de 16 octetos. En el modo protegido podemos tener un segmento tan grande como 4Gb y podemos se exprimi en cualquier parte donde nosotros queramos. El LDT contiene la informacin de segmentacin especfica a una tarea o el programa. Un OS por ejemplo podra establecer un GDT con sus descriptores de sistema y para cada tarea un LDT con descriptores apropiados. Cada descriptor es 8 octetos de largo. Dan al formato debajo (del higo 3). Cada vez un registro de segmento es cargado, la direccin base es trada de la entrada de mesa apropiada. El contenido del descriptor es almacenado en un programador el registro invisible registros llamados de la sombra de modo que futuras referencias al mismo segmento puedan usar esta informacin en vez de referirse la mesa cada vez. La direccin fsica es formada por aadiendo los 16 o la compensacin de 32 bit a la direccin base en el registro de la sombra. Estas diferencias son aclaradas en figuras 1 y 2. el higo 2: Direccin de Modo Protegida

el higo 3: Segmente Formato Descriptivo

Tenemos an otra mesa llam la mesa interrumpir descriptiva o el IDT. EL IDT contiene los descriptores interrumpirs. Estos son usados para decir al procesador donde encontrar a los tratantes interrumpirs. Esto contiene una entrada por interrumpen, justo como en el Verdadero Modo, pero el formato de estas entradas es totalmente diferente. No usamos el IDT en nuestro cdigo para cambiar al modo protegido entonces no dan a remotos detalles. 2. Entrada en Modo Protegido Los 386 tienen cuatro registros de control de 32 bit llam CR0, CR1, CR2 Y CR3. CR1 es reservado para futuros procesadores, y es indefinido para los 386. CR0 contiene los aicos que permiten e incapacitan la paginacin y la proteccin y los aicos que controlan la operacin del coprocesador de punto flotante. CR2 y CR3 son usado por el mecanismo de paginacin. Estamos preocupados con el bit 0 del registro de CR0 o el bit de PE o la proteccin permite el bit. Cuando PE = 1, el procesador, como se dice, funcionar en el modo protegido con el mecanismo de segmentacin describimos antes. Si PE = 0, el procesador funciona en el verdadero modo. Los 386 tambin tienen los registros de base de mesa de segmentacin como GDTR, LDTR y los segmentos de direccin de registros de IDTR.THESE que contienen las mesas descriptivas. El GDTR indica el GDT. 48 bit GDTR definen la base y el lmite del GDT directamente con una direccin lineal de 32 bit y un lmite de 16 bit. La conmutacin al modo protegido esencialmente implica que ponemos el bit de PE. Pero hay unas otras cosas que debemos hacer. El programa debe inicializar los segmentos de sistema y registros de control. Inmediatamente despus del ajuste del PE muerden a 1 tenemos que ejecutar un salto la instruccin para enrojecer la tubera de ejecucin de cualquier instruccin que puede haber sido trada en el verdadero modo. Este salto es tpicamente a la siguiente instruccin. Los pasos para cambiar al modo protegido entonces reducen a lo siguiente: Construya el GDT. Permita el modo protegido por poniendo el bit de PE en CR0. Salto para limpiar la coleta de pretrada. Ahora daremos el cdigo para realizar esta conmutacin. 3. Lo que necesitamos un disquete en blanco NASM ensamblador Chasquido aqu descargar el cdigo. Teclee el cdigo a un archivo de nombre abc.asm. Mntelo por escribiendo a mquina el mando nasm abc.asm. Esto producir un archivo el abec llamado. Entonces inserte el disquete y escriba el mando siguiente dd if=abc de =/dev/fd0.Este mando escribir el abec de archivo al sector primario del disquete. Entonces reanude el sistema. Usted debera ver la secuencia siguiente de mensajes. Nuestro os que echa ........................ Un (color Marrn) Conmutacin a modo protegido.... Un (color Blanco) 4. El Cdigo que hace todo! Primero daremos el cdigo para realizar la conmutacin. Es seguido de una explicacin detallada. Como mencionado en el artculo anterior (la Parte 1) el BIOS selecciona el dispositivo de bota y coloca el sector primario en la direccin 0x7c00. As comenzamos writung nuestro cdigo en 0x7c00. Esto es que es implicado segn la directiva org. FUNCIONES USADAS print_mesg: Esta rutina usa la subfuncin 13a de BIOS interrumpen 10o para escribir una cuerda a la pantalla. Los atributos son especificados por colocando valores apropiados en varios registros. Interrumpa 10o es usado para varias manipulaciones de cuerda. Almacenamos el nmero 13o subfn en

ah que especifica que deseamos imprimir una cuerda. Muerda 0 del registro Al-determina la siguiente posicin de cursor; si es 0 volvemos al principio de la siguiente lnea despus de la llamada de funcin, si es 1 el cursor es colocado inmediatamente despus del ltimo carcter impreso. La memoria de vdeo es dividida en varias pginas pginas de demostracin llamadas de vdeo. Slo una pgina puede ser mostrada a la vez (Para remotos detalles contra la memoria de vdeo mandan la Parte 1) .The el contenido de bh indica el nmero de pgina, bl especifica el color del carcter para ser imprimido. cx sostiene la longitud de la cuerda ser imprimida. El registro dx especifica la posicin de cursor. Una vez que todos los atributos han sido inicializados nos llamamos el BIOS interrumpe 10o. get_key: Usamos el BIOS interrumpen 16o cuya funcin de sub 00o es usada conseguir el siguiente carcter de la pantalla. El registro ah sostiene el nmero de subfn. clrscr: Esta funcin usa an otro subfn de int 10o es decir 06o para limpiar la pantalla antes de la impresin de una cuerda. Para indicar esto inicializamos Al-a 0. Registra cx y dx especifica el tamao de ventana para ser limpiado; en este caso esto es la pantalla entera. El registro bh indica el color del cual la pantalla tiene que estar llena; en este caso es negro. Dnde todo comienza!! La primera declaracin de lenguaje ensamblador es un salto corto al cdigo de begin_boot. Tenemos la intencin de imprimir un marrn ' A'in el modo verdadero, establecer un GDT, el interruptor al modo protegido e imprimir un blanco ' un '.Both estos modos usan sus propios mtodos de direccin. En Modo verdadero : Usamos el segmento registran gs para indicar la memoria de vdeo. Usamos un adaptador CGA (la direccin base de falta 0xb8000) .But eh! tenemos una omisin 0 en el cdigo. Bien la unidad de segmentacin de Modo verdadero proporciona 0 adicional. Esto es una materia de conveniencia, como los 8086 por lo general hacen un 20bit la manipulacin de direccin. Esto ha sido transferido en la direccin de modo verdadero de los 386. El valor de ascii para un es 0x41; 0x06 especifica que necesitamos un marrn el carcter coloreado. Las permanencias de demostracin antes de que presionamos una llave. Despus djenos mostrar un mensaje sobre la pantalla que nos dice van al mundo de modo protegido. Tan djenos sealar el bp (el registro de indicador bajo al mensaje para ser imprimido). Launchpad al modo protegido : No necesitamos que alguno interrumpa el molestar nosotros, mientras en el modo protegido hacen nosotros? Entonces deja los incapacitan (interrumpe lo que es) .That es lo que cli hace. Les permitiremos ms tarde. Entonces deja al principio por estableciendo el GDT.WE inicializan 4 descriptores en nuestra tentativa de cambiar al modo protegido. Estos descriptores inicializan nuestro segmento de cdigo (code_gdt), datos y apilan segmentos (data_gdt) y el segmento de vdeo para tener acceso a la memoria de vdeo. Un descriptor de maniqu tambin es inicializado aunque nunca sea usado excepto si usted quiere triplicar el defecto desde luego. Esto es un descriptor nulo. Djenos examinar algunos campos de descriptor de segmento. La primera palabra sostiene el lmite del segmento, que para la simplicidad es asignado el mximo de FFFF (4G). Para el segmento de vdeo ponemos un valor predefinido de 3999 (80 cols * 25 filas * 2bytes 1). La direccin base del cdigo y segmentos de datos es puesta a 0x0000. Para el segmento de vdeo esto es 0xb8000 (la direccin base de Memoria De vdeo). La direccin base GDT tiene que ser cargada en el registro de sistema GDTR. El segmento de gdtr es cargado por el tamao del GDT en la primera palabra y la direccin base en siguiente dword. La instruccin lgdt entonces carga el segmento de gdt en el registro de GDTR. Ahora estamos listos a en realidad cambiar a pmode. Comenzamos por poniendo el bit menos significativo de CR0 a 1 (esto es el bit de PE) .We no es an en el modo lleno protegido! La seccin 10.3 de INTEL los estados de 1986 de MANUAL DE REFERENCIA del 80386 PROGRAMADOR: Inmediatamente despus del ajuste de la bandera de PE, el cdigo de inicializacin debe enrojecer la coleta de pretrada de instruccin del procesador por ejecutando una instruccin JMP. Las 80386 tradas y descifran instrucciones y direcciones antes de que ellos sean usados; sin embargo, despus de un cambio en el modo protegido, la informacin de instruccin pretrada (que pertenece al modo de direccin verdadera) es caducada. Un JMP fuerza el procesador a desechar la informacin invlida.

Estamos en el modo protegido ahora. Quiera comprobarlo? Vaya a conseguir nuestro un impreso en blanco. Para esto inicializamos los datos y extra segmenta con los datos segmentan al selector (datasel). Inicialice gs con el selector de segmento de vdeo (videosel). Para mostrar un blanco un movimiento una palabra que contiene el ascii valora y el atributo a la posicin [gs:0000] esto es b8000: 0000. El lazo de vuelta conserva el texto sobre la pantalla hasta que el sistema sea reanudado. La instruccin de veces es usada llenarse en 0s en los octetos restantes no usados del sector. Para indicar que esto es un sector bootable escribimos AA55 en octetos 511,512. Esto es sobre todo.

Vous aimerez peut-être aussi