escribiendo kernel,

Iniciado por e, 27 Julio 2018, 22:05 PM

0 Miembros y 1 Visitante están viendo este tema.

e

¡Hola!,  :D
Bueno, vengo buscando que alguien me deje el kernel más sencillo posible y como compilarlo y bootearlo.
Se que es muchísimo pedir, pero quiero tener los ejemplos y así analizarlos, y hacer un OS en base a eso.
Estoy pensando en escribirlo en C.
Gracias,
e

PalitroqueZ

"La Economía planificada lleva de un modo gradual pero seguro a la economía dirigida, a la economía autoritaria y al totalitarismo" Ludwig Erhard


animanegra

Yo te recomendaria pillar MINIX. Es un nucleo muy sencillo dirigido a enseñanza.

42
No contesto mensajes por privado, si tienes alguna pregunta, consulta o petición plantéala en el foro para que se aproveche toda la comunidad.

warcry.

@fox459 ¿tienes algun problema de comprension lectora o de expresion escrita?

¿o simplemente tu mente no da mas de si?

el titulo del tema

"Escribiendo kernel desde cero"

¿tiene algo que ver con lo que preguntas?

Cita de: fox459 en 27 Julio 2018, 22:05 PM
¡Hola!,  :D
Bueno, vengo buscando que alguien me deje el kernel más sencillo posible y como compilarlo y bootearlo.

que tiene que ver eso con escribir un kernel ¿eres analfabeto o que?
HE SIDO BANEADO --- UN PLACER ---- SALUDOS

e

#5
Cita de: warcry. en 29 Julio 2018, 13:19 PM
¿tiene algo que ver con lo que preguntas?
Sí, para tener algún ejemplo.  >:(
e

DameBanda

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  ;D

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.asm

Si 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!!
"Amarillo, pensó" Douglas Adams




[img]http:/

warcry.

 ;-) ;-) ;-)

Muy bueno el post

Le acabas de hundir en la miseria al colega que inició el tema.  :xD

@fox459 ¿ves lo que pasa cuando pones mal el título?

pues que te contestan acorde al título y eso no es lo que quieres.

tu quieres coger un kernel ya hecho, compilarlo y decir que guay soy que tengo mi propio linux  ;)
HE SIDO BANEADO --- UN PLACER ---- SALUDOS