2012-04-29 16 views
14

Escribo un kernel pequeño solo para hurgar un poco en las cosas de bajo nivel. En este momento, arranca en Virtual Box y puedo mostrar texto en la pantalla, asignar algo de memoria y otras cosas realmente básicas. Está escrito en C++ y tiene un pequeño asm.(Escribiendo kernel) ¿Cómo modifico la tabla de descriptores de interrupción?

Una de las cosas que quería explorar era el mecanismo detrás de la multitarea. Como lo entiendo, que es algo como esto:

  1. El kernel inicializa la tabla de interrupciones Descriptor de manera que una interrupción se emite periódicamente (por ejemplo, un milisegundo) y llama a una rutina definida en el kernel.
  2. Cuando se llama a la rutina, puede decidir establecer los segmentos de código/datos y apilar el puntero a los del contexto de otro programa, un "cambio de contexto".

Por lo tanto, parecía simple en concepto, pero sabía que los detalles iban a ser mucho más peludos. He encontrado algunas cosas en línea, pero la terminología varía mucho, y los ejemplos parecen ser de contextos que no tengo (como desde dentro del kernel de Linux).

Sin embargo, la forma de establecer las tablas de descriptores parece ser así:

  1. enviar datos al PIC (outb y qué-no) para inicializarlo.
  2. Prepare una tabla de interrupción en la memoria, con punteros de función para las rutinas que desee, teniendo cuidado de que las funciones puedan ser manipuladores de señal.
  3. Cargue la tabla con lidt.

Sin embargo, no puedo encontrar mucho en específicamente hacer estas cosas, o si esto es incluso correcto. ¿Alguien tiene recursos para un escritor de kernel desconcertado?

+0

Interesante pregunta, aquí hay una buena comunidad: http://www.osdever.net/ No es que responda su pregunta directamente, pero hay información útil allí. –

+0

Sin embargo, se puede encontrar una mejor comunidad (con foro y wiki, así como clase de canal irc asociado - #osdev @ irc.freenode.net) en osdev.org. – Griwes

Respuesta

6

Cuando su PC arranca, el BIOS programa el PIC de tal manera que IRQ0 a IRQ15 están vinculados a int 8 a int 0Fh y int 70h a int 77h. Esto está bien para el modo de dirección real, en el que funciona el BIOS y funciona MSDOS.

Pero necesita cambiar esta asignación al cambiar al modo protegido porque algunas excepciones importantes están en int 8 a int 0Fh (más notablemente, #GP, #SS, #PF). Desea eso porque desea poder distinguir fácilmente entre estas excepciones y las interrupciones de hardware provenientes del temporizador y el reloj en tiempo real, el teclado y el mouse, los discos y puertos de E/S (en serie y en paralelo).

Este es probablemente el primer paso que ha descrito. Por lo tanto, busque en línea "reasignación de interrupción PIC" o algo por el estilo. Además, descargue algunas especificaciones para el chip 8259 (el PIC) para tener una mejor idea de lo que está haciendo y cómo funciona realmente. "HelpPC" es una buena referencia antigua que contiene parte de la información sobre el hardware de varias PC.

También hay "PCGPE" (PC Game Programming Encyclopedia) y "RBIL" (Lista de Interrupción de Ralf Brown) que pueden ayudar mucho.

La configuración IVT/IDT se describe en la documentación de la CPU Intel y AMD. Está todo allí. No es la lectura más agradable, pero la más detallada y autorizada.

Hay muchos sitios web de aficionados a los sistemas operativos hogareños y similares, donde puede encontrar más detalles y fragmentos de código.

+0

Ví un código de reasignación flotando antes. Por lo tanto, es posible que esté malinterpretando un detalle en modo protegido y real, pero, según tengo entendido, el kernel se ejecuta en modo real, pero puede cambiar al modo protegido cuando se ejecuta un programa de usuario. Sin embargo, ¿no cambia al modo real en un cambio de contexto? Eso es hecho por la interrupción, ¿verdad? ¿Las interrupciones deben ser reasignadas solo una vez antes de que se ejecute un programa protegido? – rovaughn

+0

Normalmente, si hay algún cambio, es de verdadero a protegido y se realiza solo una vez, muy temprano, cuando se inicia el kernel. –

6

La respuesta a esta pregunta es demasiado grande para caber aquí. Voy a sugerir dos recursos que le dará los conocimientos necesarios:

  • JamesM's kernel development tutorial le guiará a través del desarrollo de un núcleo muy básico que cubre este. Deberá prestar especial atención a los capítulos 4 y 5. Viene con código completo.
  • OSDev.org Material de referencia. Contiene toda la información técnica que necesitas. Más detallado y preciso que el tutorial.

Si realmente quiere entender esto, le sugiero que lea los artículos en OSDev para tratar de escribir todo usted mismo. Comience con el inicio, la salida de pantalla, la imagen y el manejo de irq. Usa el tutorial si estás atascado.

+0

El tutorial de James Molloy es realmente bueno, pero no debe recomendarse a los recién llegados, ya que da demasiado código para ser simplemente copiado, sin mucha explicación; tal vez cambie cuando JamesM publique una nueva versión de la serie. Para los recién llegados, los tutoriales en www.brokenthorn.com son mucho mejores. – Griwes

Cuestiones relacionadas