Hola!
No se muy bien que es lo que pretendes, ni que nivel de conocimientos tienes, así que voy a intentar darte una mini explicación de lo que supone escribir el kernel de un sistema operativo.
Simplificando mucho un computador se compone de memoria y un procesador.
En la memoria se almacenan datos y programas (Modelo Von Neumann)
El procesador toma una instrucción de la memoria, la ejecuta y guarda los datos en alguna otra posición.
El procesador tiene una lista de códigos llamados códigos de operación (OPCODES), que le indican que operación realizar. Por ejemplo el código 0 es sumar, el 1 restar, el 2 saltar a tal posición de memoria y el 3 copiar un dato de una posicion a otra.
Esos opcodes tienen una traducción directa por medio de tablas a una palabra clave del lenguaje ensamblador. Te pongo otro ejemplo:
Imaginate un procesador de 8 bits que me acabo de inventar. Las instrucciones de ese procesador (datos que recibe el procesador) están estructuradas así:
los 4 primeros bits son el opcode
los dos siguientes, si procede, son la dirección de memoria de la cual tomar el primer dato y los dos ultimos donde dejarlo
un dump de la memoria principal de nuestro pc es este
DIRECCIÓN DATO
0000 0011 01 10
0001 0000 11 11
0010 0000 00 00
Cuando la bios empieza a cargar la memoria principal el IP (instruction pointer, puntero que dice en que posicion de la memoria estamos) apunta a la primera dirección, la 0000 en este caso. Por tanto le pasa al ordenador la instrucción 00110110 que es: 0011 opcode 3, copiar datos de una direccion a otra, 01 copiar los datos de esa dirección 10 a esta dirección.
Así que despues de ejecutar el programa la ram quedaría así
DIRECCIÓN DATO
0000 0011 01 10
0001 0000 11 11
0010 0000 11 11
Esta ha sido una mini clase de arquitectura de ordenadores que creo que te va a venir guay.
Ahora el ensamblador:
El ensamblador es una traducción directa de esos OPcodes a reglas mnemotécnicas escritas con letras. Osea que en vez de 00110110 vamos a decir que el opcode 0011 es CPY (por copy) 01 es 0x1 (porque solemos trabajar en hexadecimal) y 10 es 0x2 (por lo mismo), añadimos algo de sintaxis y nuestro programa se convierte en:
CPY 0x1, 0x2
Volvamos ahora a tu kernel.
Ya hemos dicho que cada procesador tiene una lista de opcodes. Y que tu puedes hacerte tus programitas muy básicos en ensamblador. Ahora bien,
Un programa tipo hola mundo en ensamblador son 20 lineas mas o menos (Bastante coñazo programar un sistema operativo de esa manera). Así que en vez de hacerlo todo a mano, un enfoque mas práctico es hacer un montón de programitas de uso común y llamarlos pasandoles parámetros por la pila (que es un conjunto de datos que no me voy a poner a explicar porque no acabo) cada vez que los necesites saltando a la dirección de memoria en la que están.
Ese conjunto de programas que son específicos del hardware para el que los escribas son una parte del kernel. Serían la librería de operaciones con la que luego programarías el sistema operativo.
Una vez tengas eso te quedan 3 cosas por entender. Interrupciones, manejo de memoria y lectura/escritura en discos pero casi mejor que eso lo busques en google que para eso vivimos en el 2018
Interrupciones son una lista de códigos específicos de la BIOS que permiten acceder a ciertos elementos de hardware diferentes al procesador (como la pantalla, los discos, el audio, etc)
La lectura y escritura de discos funciona dependiendo también del modelo específico del disco pero suele funcionar de la siguiente manera: Tu le dices en que dirección empieza la lista de 0s y 1s que quieras leer, como de larga es y a partir de que dirección de la memoria quieres empezar a copiar.
Es importante porque tu sistema operativo empieza en un disco ROM que no se borra al cortar la corriente y tienes que cargarlo accediendo al disco con este sistema que te cuento.
Por último te había dicho que para acceder a cada programa de la librería una vez cargada en memoria necesitas saltar a la dirección en la que empieza cada programa. Pues para saber donde está cada uno, y evitar que se solapen los datos del programa, o que algún dato sobreescriba alguna instrucción (overflow) necesitas un administrador de memoria.
Si consigues escribirte tu pequelibrería, tu administrador y tu sistema de lectura/escritura de discos, se podría decir que tienes un kernel básico. A partir de ahí puedes programar sobre la librería que te hayas hecho.
Es una tarea bastante tediosa pero muy agradecida. Al final tienes algo 100% tuyo y si eres capaz de hacerlo podrás decir que sabes como funciona un ordenador a la perfección. O al nivel de un ingeniero por lo menos.
Como último detalle te dejo un bootloader para x86 que escribí hace un tiempo. Es el primer componente del kernel y es lo que te permite (con alguna modificación) cargar código desde los discos ROM y ponerlo todo a andar. Lo tienes aquí:
https://github.com/TretornESP/bootable-x86-asm/blob/master/bootable.asmSi tienes alguna otra duda mándame un issue en github mejor que por el foro no ando mucho.
Espero que el tostón técnico te haya servido. Sin mas, un saludo!!