Propuesta TFG (No oficial)

Texto que escribí como propuesta de TFG

1. Sistema Operativo para x86 de 64 bits con arranque UEFI en C/C++

1.1. Descripción

El proyecto trata de programar un sistema operativo simple/académico de 64 bits que sea capaz de correr en máquinas x8664 que dispongan de UEFI. Para cargar el sistema operativo es necesario un bootloader que también será programado (no se hará uso de GRUB o similares).

Enfocar el sistema a 64 bits, UEFI y C++ tiene como fin probar a desarrollar el sistema con tecnologías modernas, evitando enfoques más antiguos como arrancar desde la BIOS, pasar por modo 16 bits real, etc.

La ejecución del sistema operativo se realizaría sobre qemu con el firmware UEFI de edk2 compilado desde los fuentes. Ejecutar en qemu es por comodidad, no debería de haber gran problema en migrar a hardware real para probarlo, pero no es el objetivo.

El proyecto no está centrado en que el sistema sea usable o de utilidad (se iría de complejidad), se centra en entender y explicar los conceptos “técnicos”. Es un sistema “académico”.

1.2. Viabilidad

Antes de escribir la propuesta empecé a trabajar en el proyecto para ver si la idea era viable para un TFG y “si se podía hacer”.

Llevo aproximadamente desde que acabaron las clases este verano trabajando en el proyecto, he hecho algunos avances (comentados en “Trabajo Realizado”) y considero que el proyecto es viable para un TFG.

Me siento cómodo trabajando en ello, creo que los avances que ya tengo podrían explicarse de forma profunda en un TFG y la idea sería seguir implementando cosas nuevas.

1.3. Objetivos de Aprendizaje

Procedo a comentar algunos aspectos que se trabajan con este proyecto:

  • Programación en C/C+ a bajo nivel
    • C++ Freestanding
    • GCC compilado con modificaciones
    • gdb remoto sobre TCP
  • Programación en ensamblador
    • nasm
    • __asm__
  • Comprender mecanismos internos de la CPU
    • Segmentación
    • Paginación
  • Programar con los servicios de UEFI
    • posix-uefi
    • gnu-efi
  • Trabajar con formatos de ficheros
    • ELF
    • PSF
  • Gestión de proyectos con Git + Github
  • Automatización con make
  • Lectura de documentación técnica
    • Intel x86 manual
    • UEFI Specification
    • wiki.osdev.org

El proyecto tiene relación con las siguientes asignaturas:

  • Programación I
  • Programación II
  • Sistemas Operativos
  • Estructura de los Computadores
  • Arquitectura de los Computadores
  • Desarrollo Colaborativo de Aplicaciones
  • Herramientas Avanzadas para el Desarrollo de Software

1.4. Trabajo Futuro

Por ahora no tengo nada preestablecido por hacer, tampoco un “objetivo límite”. No hay nada que “completar” ni “acabar”, es ir aprendiendo y añadiendo cosas para extender el funcionamiento.

Ideas futuras:

  • ventanas (sub framebuffer)
  • interfaz simple
    • árbol, double buffer, etc.
  • entrada por teclado
  • soporte para ratón

1.5. Trabajo Realizado

Como ya he comentado anteriormente, para ver si el proyecto era viable empecé a trabajar en ello, estas son algunas de las cosas que he realizado desde que empecé al acabar las clases. No van en un orden concreto:

  • repositorio git con las dependencias como submódulos
  • makefile para compilar edk2, binutils-gdb, gcc y posix-uefi
  • script UEFI para cargar el bootloader
  • bootloader
    • logs
    • cargar el kernel (ELF) en memoria
    • obtener el GOP (Graphics Output Protocol) de UEFI
    • crear un framebuffer a partir del GO
    • cargar el mapa de memoria de UEFI en una estructura
    • cargar una fuente PSF1
    • salir de los servicios de UEFI
    • saltar al kernel pasando argumentos
  • kernel
    • linker script
    • renderer
      • dibujar píxeles
      • imprimir carácteres con una fuente
      • funciones puts, print, println…
      • seleccionar colores
    • paginación
      • page frame allocator
        • TAD bitset
        • obtener información global sobre la memoria
        • reservar, bloquear, solicitar páginas de memoria…
      • page table manager
        • árbol K-ario
        • mapeo de memoria virtual – física
        • cambio a direcciones virtuales
    • segmentación
      • cargar el Global Descriptor Table (GDT)
    • funciones
      • itoa, memset, pow, abs…

1.6. Capturas

DjCgYg.png

mdj4XJ.png

iRMF0p.png

reYc5O.png

FABOys.png