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:
- 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.
- 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í:
- enviar datos al PIC (
outb
y qué-no) para inicializarlo. - 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.
- 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?
Interesante pregunta, aquí hay una buena comunidad: http://www.osdever.net/ No es que responda su pregunta directamente, pero hay información útil allí. –
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