Páginas

sábado, 24 de diciembre de 2011

Ho-Ho-Ho

Esto de estar de vacaciones es una maravilla, menuda semanita me estoy pegando... :-D Para empezar, estoy viendo a un monton de gente que hacia tiempo que no veia (ayer mismo a una antigua compañera de clase que resulta que tambien le gusta ir a las conferencias de Software Libre :-D ), los examenes no me han ido del todo mal (especialmente Sistemas Operativos, que por un error a la hora de corregir las practicas he pasado de un 3 a un 9.1 :-D ), y encima no solo le he estado dando caña al proyecto sino que cuando les pase a mis colegas de AlcorconWireless el enlace a mi anterior entrada al blog contando en que iba a consistir el proyecto el comentario que ha soltado uno es mitico:
Piraña se nos ha hecho mayor. Yo ya no me meto con él que me da sopas con honda XD
Respect!
Epic Win!!! :-D Y ademas, otro dice que se apunta, asi que podre acelerarlo un poco mas :-D Tambien me han dicho que se ve mal el texto con el fondo tan oscuro, a ver si cuando tenga tiempo lo arreglo...

Pero bueno, al turron (y no a las 4 tabletas que me he comprado esta tarde de oferta en el Dia :-P ): los cambios que le he metido a Gaia realmente han sido numerosos, y la verdad que esta quedando una base muy buena para continuar con el desarrollo mas adelante. Para empezar, he estado estandarizando muchas funciones y poniendolas en comun entre Gaia y Uranus, lo cual teniendo en cuenta que ahora se contruyen como dos librerias estaticas por separado (en prevision a que mas adelante Uranus sea un ejecutable independiente) me esta sirviendo para hacerme una stdlib bastante cuca y quizas tambien para en el futuro poder usar newlib, que siempre sera mejor que desarrollar mi propia libreria estandar (aunque no es tan dificil como parece...), y ademas todo apunta a que va a ser la unica manera que voy a tener para poder usar memoria dinamica, porque el tema de la paginacion se me resiente y parece que el tutorial que estaba siguiendo ya solo existe en la cache de Google... :-/ Lo cual no es malo, porque buscando alternativas he descubierto que aunque con no excesivo exito, si ha habido intentos (algunos incluso formales) de hacer una API estandar para drivers, lo cual me viene bastante interesante... :-) Tambien es cierto que lo estoy procrastinando bastante por el respeto que me impone, pero al menos me sirve para avanzar en otros aspectos :-)

Pero lo mas importante sin lugar a dudas, ¡los eventos ya funcionan! :-D Por el momento de forma muy rustica y simple por no tener memoria dinamica y estar corriendo todo en espacio de kernel, pero al menos demuestran que el concepto y la arquitectura funcionan. Ademas, el diccionario de tamaño estatico que me he hecho me ha quedado chulisimo, para que luego vayan y me suspendan Estructura de Datos por no saber Pascal... :-P Por el momento solo tengo un evento registrado, "putchar", que es llamado desde prinf(), pero lo registra y lo recoge el driver de la VGA sin problemas, pero teniendo en cuenta que printf() esta dentro de la stdlib por el momento vamos bien :-) Tambien he implementado un pequeño driver para el teclado, pero es mas bien simbolico ya que lo unico que hace es enviar lo que escribe a la pantalla enviando el evento de "putchar" igualmente, luego no se registra ni nada. Por el momento se estan registrando los IRQs directamente, asi que cuando ya haga que pasen por el gestor de eventos ya me pondre a hacer algo serio, ya que tambien tendre que definir el formato de los eventos y eso puede variar mucho, asi que prefiero no hacer demasiado que luego tenga que tirar a la basura.

Y luego por ultimo en el dia de hoy despues de la paliza que me pegue ayer a patear calles pues me he tirado todo el dia en casita limpiando y organizando el proyecto como dije antes, separando cada parte, unificando librerias... dejandolo preciosista :-D Tambien he estado experimentando ahora que se compilan Gaia y Uranus por separado en que la interfaz de las syscalls sea la misma que en nativo, pero el linker se ha quejado diciendo que los simbolos estan duplicados (lo cual es obvio, idiota de mi). Mañana vere si consigo hacer algo al respecto con algun flag al compilar o algo, que seguro que hay alguna solucion... ;-)

martes, 20 de diciembre de 2011

Übersecret

¿Y cual es ese nuevo proyecto en el que ando enfrascado tan secreto que a pesar de ser uno de mis proyectos "gordos" solo hay tres personas que conocen de su existencia y entre las tres apenas la entienden media? :-P Pues mi mayor sueño desde los 10 años, el cual ya intente anteriormente dos veces de forma infructuosa y como bien supuse, el desarrollo de PirannaFS me iba a dar la autoconfianza que necesitaba para desarrollarlo de forma definitiva: mi propio sistema operativo... o cuanto menos, mi propio kernel :-D

ChaOS (originariamente CaOS... cosas del marketing y la proyeccion internacional :-P ), el estado desorden primigenio que dio lugar a "el origen de todo", es un sistema operativo puramente orientado a objetos (al igual que el extinto BeOS o su sucesor Haiku) y a eventos (como los sistemas operativos en tiempo real), y diseñado por completo orientado a que sea facil de entender y de mantener. Bajo esta filosofia prescinde por completo de los IOCTLs y compañia: todo son objetos. En este aspecto es diametralmente opuesto a Plan 9, que aunque la idea de llevar Unix al extremo haciendo que "todo sean archivos" esta muy bien... realmente solo es practica para su uso desde la shell. No obstante, si se integrara con Python y potente introspeccion y sus tan extendidos "file-like objects" (acceder a cualquier objeto de forma estandar usando los metodos definidos para los archivos) se podria crear un sistema de programacion bastante versatil y poderoso (y de hecho incluso intente hacer recientemente que ChaOS estuviera escrito en Python para poder explotar esta idea), aunque claro, aqui hay un detalle importante... son objetos ;-)

Sin embargo, vamos a empezar por lo importante: el kernel. El kernel de ChaOS para aumentar su claridad, seguridad y versatilidad se divide (dividira, en realidad) en dos partes: un microkernel (Gaia, "la madre tierra") realmente minimo que corre en el anillo 0 que solo actua como envoltura del hardware para permitir un acceso mas homogeneo y controlado por parte del resto del software al estilo de los exokernels o los hipervisores (calculo que no deberia necesitar mas de 7 syscalls en total), y luego el kernel propiamente dicho (Uranus, "el padre del cielo"... e hijo y amante de Gaia :-P ) que corre puramente en espacio de usuario. Si, como un programa mas, ahi esta la gracia del asunto: al estar el kernel en espacio de usuario y no ejecutar codigo privilegiado se obtienen varias ventajas, como que el codigo privilegiado es mucho menor, es mas facil de programar y de depurar... e incluso estoy observando que no me costaria demasiado hacer que "cualquier" programa (notense las comillas, no obstante) se podria hacer que funcionara directamente sobre Gaia sin demasiado esfuerzo... o incluso hacer que Uranus corra como una aplicacion mas el cualquier otro sistema operativo o incluso propiamente dentro de ChaOS (el colmo de la recursion: un sistema operativo corriendo sobre si mismo sin maquinas virtuales. ¿Donde deja eso a jail? :-D ).

Por el momento, he conseguido que Gaia sea capaz de arrancar desde GRUB dentro de QEmu (ya es mas de lo que habia conseguido hasta ahora...) y tambien registra un pequeño driver en espacio para usuario para el PIT y estoy en proceso del driver de la tarjeta de video en lugar de acceder a ella directamente desde el modo kernel. Vale, lo reconozco, es mentira: todavia estoy ejecutandolo todo en espacio kernel, pero la paginacion me estaba dando problemas por lo que decidi adelantarme con la API, y actualmente ya estan funcionando correctamente a traves de las syscalls (de momento solo 3: in, out y register_interrupt_handler). Aparte el codigo es muy homogeneo y claro entre si, y aunque lo este haciendo en C ya que las otras veces que intente hacerlo en C++ fueron callejones sin salida, los namespaces son muy claros de seguir y no costaria demasiado hacer la conversion en el futuro. Vamos, una joyita de las que me gustan, codigo limpio y claro... :-D

Ahora que he terminado los examenes me pondre con el motor de eventos para asi poder aislar mas aun cada una de las dos partes (Gaia y Uranus) y que el driver de la VGA este completamente en el "pseudo" espacio de usuario. Despues ya continuare intentando la paginacion de memoria y la ejecucion en espacio de usuario de verdad, y luego ya creo me planteare si continuar con el desarrollo de Gaia como un cargador de kernels en espacio de usuario como habia pensado hasta ahora, o bien como libreria que añadir a aplicaciones estandar para que se ejecuten sin sistema operativo... o bien como las dos cosas :-D

P.D.: tengo que irme, el sistema de megafonia de la universidad avisa que tenemos que desalojar el edificio, dicen noseque de unos "egometros" que se han salido de su escala...

:-P

PirannaFS reloaded...

6 meses han pasado ya desde mi ultima entrada... y con razón. Los examenes me tuvieron al borde de un suspiro, y gracias al proyecto de Gameloft he sabido lo que es un trabajo de verano de 60 horas a la semana (y pensar que yo queria ser un pirata con sus 96 horas...). Luego llego el nuevo curso con un primer cuatrimestre supercargado y faltandome horas por todas partes, asi que dije BASTA: decidi centrarme en los estudios y luego ya veria que haria.

Eso es lo que decidi hacer... otra cosa es que eso fuese lo que hiciese :-D Que no tuviese tiempo para publicar nada no significa que no hiciese avances, y si hice: MUCHOS.
  • Para empezar consegui mezclar el codigo de las ramas de PyFilesystem con la de FUSE, con lo que ahora mismo ya tenemos (¡al fin! :-D ) un unico codigo base para las dos. Bien es cierto que la predominante es la de PyFilesystem, pero su orientacion a objetos es mucho mas potente y flexible. Aparte, tambien me va a servir de base para desarrollar las herramientas externas :-)
  • Por otra parte, tambien he conseguido avances para convertir los archivos y los directorios en plugins externos, aunque por alguna razon unittest no me funciona con Louie, el motor de eventos, por lo que tendre que mirarlo con mas calma.
  • No obstante, este paron forzoso me vino bien para darle vueltas al tema de hacer PirannaFS un sistema de archivos autocontenido, y creo que gracias los VFS de SQLite (y en concreto usando como base este ejemplo para funcionar directamente sin sistema de ficheros) voy a tener la papeleta resuelta, aunque probablemente tendria que sustituir el modulo pysqlite por APSW. APSW tiene la ventaja de que es un wrapper muy fino, siendo las funciones directas con las de SQLite con lo que es mucho mas rapido y ademas obtiene mas rapido todas las mejoras y nuevas funcionalidades de SQLite (incluido el soporte para VFSs) a diferencia de pysqlite, que intenta pythonizarlas. Aparte tambien esta el echo de que APSW no sigue el DB-API 2.0 (aunque su API si es muy parecida), pero al parecer el "anti-ORM" que me he desarrollado con PirannaFS puede resolver la papeleta (a la gente le encanta mi idea de desarrollar funciones y objetos Python a partir de codigo SQL :-D ) y probablemente hasta lo limpie y lo saque como modulo aparte. Luego estaria el tema de como hacer para poder acceder a los plugins, pero eso es otra historia...
  • Y aparte, tambien se me han ocurrido otras novedades como son las "extensiones", que basicamente son como los plugins pero a diferencia de estos, estan orientados a "extender" funcionalidad ya existente (en lugar de añadir nueva) y por lo tanto no necesitan tablas propias sino que modifican directamente las ya existentes, por lo que su acceso es mucho mas rapido (me ahorro hacer un join... :-D ).
Pero aunque PirannaFS sea mi niña mimada (al menos por ahora... :-P ) todo eso por el momento tendra que pasar a un segundo plano, puesto que oh, masoca que soy... me he vuelto a inscribir otra vez en el concurso de programacion, y esta vez voy a por todas. Solo espero que no haya suspendido ninguna este cuatrimestre y que empieza pueda tenerlo tan tranquilito como me imaginaba al principio... :-P