Mi kernel

Bueno, para los más frikis, aquí lo teneis para vuestro disfrute y deleite: el kernel que he programado como parte de la asignatura de Sistemas Operativos aquí en la Universidad de Chicago. ¡Ojo! Como el kernel podría ser de gran utilidad para alumnos que hagan la asignatura el año que viene, hace falta nombre de usuario y contraseña para acceder a la URL donde está colgado el kernel. Como me imagino que principalmente interesará a los frikis de ESIDE, la contraseña la podrá deducir facilmente cualquier persona que haya estudiado en ESIDE. Si no has estudiado en ESIDE, mandame un mail y te mando la contraseña.

Nombre de usuario: borjanet
Contraseña: «Número del aula de programación» (3 dígitos) + «Nombre de cierta profesora de programación con risa muy contagiosa» (en minúsculas) + «Piso de los profesores» (un dígito)

En cuanto al kernel, lo primero que tengo que decir es que no lo he programado yo solito, sino en colaboración con Mike Rainey, estimado compañero y excepcional friki. Luego, en vez de cascar un rollo macabeo sobre el kernel, me parece que lo mejor es dar un pequeño resumen y si alguien se pone a mirar el codigo fuente y no entiende algo, que lo plantee en los comentarios.

El kernel está escrito para una arquitectura simplificada llamada Yalnix. Hace falta un emulador para ejecutar el kernel, y por mucho que busco y rebusco, no lo encuentro por ningún lado en la web. Podría pasaros el binario que hemos utilizado nosotros, pero sólo funciona bajo Solaris… En fin, la arquitectura Yalnix es parecida a la que podriamos encontrarnos en un dispositivo movil tipo PDA (de hecho, el emulador de Yalnix te muestra una pantalla tipo PDA e incluye un dispositivo «lapiz» como el que tienen los PDAs). Por lo tanto, implementar un kernel resulta bastante más sencillo que en una arquitectura i386, aunque no por ello deja de ser complicado. A saber, nuestro kernel implementa la siguiente funcionalidad:

  • Gestión de la memoria física (utilizando un algoritmo First-Fit).
  • Gestión de memoria virtual (First-Fit) pero sin swapping al disco. El malloc interno del kernel utiliza un Buddy algorithm (que resulta que es un algoritmo pesimo para reservas de bloques pequeños de memoria, pero que es bastante rapido, y por lo tanto adecuado para una PDA)
  • Gestión de procesos (exec, fork, wait, getpid, delay, yield, …). El scheduler utiliza un algoritmo round robin.

Debo enfatizar que todo esto funciona. Es decir, cuando ejecutamos el kernel en el emulador podemos cargar programas, crear nuevos procesos, y ver como interactuan y se pelean por la CPU. No os podeis imaginar la cara de felicidad que se me puso cuando conseguí que el «Proceso A» y el «Proceso B» conmutasen sin problemas… Trabajar en este proyecto ha sido sinceramente muy revelador. Una cosa es estudiar el funcionamiento de (por ejemplo) la memoria virtual sobre el papel, y otra cosa muy distinta es pelearte tu mismo con la implementación desde cero de un gestor de memoria virtual donde el más mínimo fallo provoca un kernel panic.

En la segunda parte del proyecto (la que entregamos este viernes), tenemos que añadir lo siguiente al kernel:

  • Gestión de E/S a bajo nivel (llamadas del sistema para interactuar directamente con los dispositivos fisicos). Esto supone escribir código bastante obfuscado para gestionar (entre otras cosas) un puerto serie.
  • Gestión de E/S a alto nivel, tipo UNIX. Es decir, interactuar con los dispositivos de bajo nivel a través de ficheros como «/dev/serial», «/dev/display», etc. y con las llamadas típicas de UNIX (open, close, read, write, pipe, etc.)
  • Exclusión mutua mediante semáforos.

La segunda parte ya la tenemos 99.9% terminada (hemos llegado al punto en que nuestra principal preocupación es conseguir que los comentarios queden bonitos…). De la segunda parte me ha encantado implementar todo el sistema de pipes. Escribir el caracter de la barra vertical en la shell nunca volverá a ser lo mismo…

En fin, ahi lo teneis. Si os sentís especialmente frikis hoy, bajaros el kernel y echadle un vistazo (os sugiero que empeceis por kernel.c). Si teneis preguntas, planteadlas en los comentarios. ¡Ah! E intentaré colgar el segundo kernel la semana que viene.

P.D.- El kernel incluye varios comentarios en plan de cachondeo. A ver si podeis encontrarlos todos…

7 comentarios sobre “Mi kernel

  1. Joer tio, que envidia me da eso de programar un kernel pequeñito. Lo que no has dicho es el nombre que le has puesto. ¿Borjix? ¿Sotomayorux?, ¿Asuracenturix?. Ningún kernel esta terminado si no tiene un nombre absurdo y si es posible recursivo.

    Me gusta

  2. Pues el kernel se llama Pimpbot («Proxeneta robotico»), un nombre que se le ocurrió a mi compañero Mike. Pimpbot 5000 es un personaje que aparece de vez en cuando en el show de Conan O’Brien. Aunque el nombre «pimpbot» suene soso y poco inspirado en España, la verdad es que cada vez que decimos que nuestro kernel se llama «pimpbot» aquí en EEUU todo el mundo se descojona.

    Hombre, yo personalmente habría preferido haberlo llamado Ghostix o algo así… aunque ahora que lo dices, no entiendo como a nadie se le ha ocurrido utilizar el nombre Asuracenturix para un kernel xDDD

    Me gusta

  3. Deseo descargar el kernel, pero no estudio en el ESIDE, dejo mi direccion de correo para que me mandes la clave, por que no encuentro tu direccion de e-mail, muchas gracias.

    Me gusta

  4. God Dag!

    Saludos desde Panama City…

    Muy interesante el artículo, aunque no descargué el kernel…pues me gustaría descargarlo y entenderlo, con el proposito de que eso me sirve para hacer mi propio OS (quizás suena algo loco, pero estoy muy interesado de hacer uno, desde 0).

    Saludos…Saellvertu!!:)

    Pd.: espero su respuesta en el correo.

    Me gusta

Deja un comentario