Este es un pequeño experimento en el que estoy trabajando donde trato de crear un kernel del sistema operativo en el lenguaje de programación GO.
El objetivo no es crear un sistema operativo funcional "completamente" (lo que sea que esto signifique), sino obtener más información sobre los sistemas operativos y cómo se hacen.
Originalmente planeaba implementar un sistema de archivos FAT32. Implementé uno una vez (en C) pero no puedo seguir trabajando en el proyecto debido a la falta de arware. Por supuesto, podría implementar fácilmente un sistema de archivos en Linux, pero eso es un poco aburrido.
Entonces, en cambio, comencé a escribir mi propio sistema operativo para este proyecto. También es una forma de comenzar a aprender Go. Bueno, al menos un poco.
Cuando tuve la idea de escribir un sistema operativo, sabía que no quiero usar C, ya que ya tenía algo de experiencia escribiendo un sistema operativo en C. Deliberé si usar óxido o ir a escribir mi sistema operativo. El factor decisivo en el final fue que GO sería el mayor desafío.
Ahora, podría pensar que no es tan buena idea usar, ir a escribir un núcleo, y estaría en lo cierto. El Runtime Go está diseñado para usarse en el espacio de usuario de un sistema operativo. Hay muchas suposiciones que esto implica, como la capacidad de invocar syscalls y el uso de la asignación de memoria dinámica. En un núcleo no puede confiar en un sistema operativo para manejar esto para usted, ya que usted es el sistema operativo. Sin embargo, con una programación cuidadosa y renunciando a ciertas características de Go, puede hacerlo, entonces, ¿por qué no? Es un desafío.
Un objetivo de este proyecto es lograr cosas rápidamente, por lo que no pasé tiempo diseñando el sistema operativo. Para acelerar todo el proceso, decidí usar la interfaz SYSCall de Linux. De esta manera, no tendría que escribir mis propias bibliotecas del espacio de usuario y podría usar cualquier lenguaje de programación que quisiera en mi espacio de usuario. Sin embargo, tiene bastantes inconvenientes. Si bien hago las syscalls de la misma manera que Linux, esto requiere que también use todos los supuestos de Linux. Por ejemplo, al comenzar un proceso me requerirá para configurar su espacio de memoria de la misma manera que lo haría Linux, las syscalls deben devolver los valores que se esperan en un núcleo de Linux y se supone que el diseño del núcleo es monolítico.
Todavía no estoy seguro de si me quedo con este diseño. Otra idea que tuve es escribir mi propio ABI, pero también escribir una biblioteca de envoltura de Linux-Syscall que interceptaría Syscalls de Linux y la traduciría a mi sistema operativo.