Empezando
On octubre 2, 2021 by adminEn primer lugar, desarrollar un sistema operativo es probablemente una de las cosas más desafiantes que puedes hacer en un ordenador (junto a matar al jefe final de Doom en el nivel de dificultad Pesadilla). Componer un sistema operativo requiere muchos conocimientos sobre varias áreas complejas dentro de la informática. Tienes que entender cómo funciona el hardware y ser capaz de leer y escribir el complejo lenguaje ensamblador, así como un lenguaje de nivel superior (como C, C++ o Pascal). Tu mente tiene que ser capaz de envolver la teoría abstracta y sostener una miríada de pensamientos. ¿Ya te sientes desanimado? No temas. Porque todas estas cosas son también las que hacen que la programación de SO sea divertida y entretenida.
No hay nada como la sensación de logro cuando, finalmente, después de horas de lucha, resuelves el problema. Y después de un tiempo eres capaz de mirar atrás y ver todo lo que has creado desde cero. Tu sistema escrito a mano es capaz de arrancar, hace magia con el hardware y ofrece al usuario una interfaz de usuario y programas con los que jugar.
No hay un camino absoluto que tengas que seguir al crear un SO. Una vez que se pone en marcha el sistema inicial (y esto se hace encontrando tutoriales apropiados), se elige el camino que se quiere tomar a continuación. Tu sistema operativo es exactamente eso: tuyo. Tienes el control definitivo, ¡y el cielo es el límite!
Contenidos
- 1 La dura verdad
- 2 Responsabilidad
- 3 Conocimientos necesarios
- 4 Organiza tus planes
- 5 Elegir tu entorno de desarrollo
- 5.1 GNU/Linux
- 5.2 Windows
- 5.3 MacOS
- 6 Probando su sistema operativo
- 7 Protegiendo su código
- 8 Puntos de partida comunes
- 9 Obteniendo más conocimientos
- 10 Vea también
- 10.1 Artículos
- 10.2 Hilos
- 10.3 Enlaces externos
La dura verdad
Es de esperar que el hecho básico de que el desarrollo de sistemas operativos es un proceso complicado y continuo no te desanime. La verdad es que el desarrollo de sistemas operativos es realmente incomparable, ya que requiere la mayor cantidad de paciencia y un diseño de código cuidadoso, y devuelve muy poco o ninguna «gratificación instantánea» que se obtiene del desarrollo de cosas como juegos y scripts basados en la web.
Has sido bastante advertido del duro trabajo que te espera, pero si todavía estás interesado, entonces sigue adelante en el reino del programador de sistemas operativos. Prepárate para ocasionales episodios de confusión, desánimo, y para algunos de nosotros… locura temporal. Con el tiempo, y con suficiente dedicación, te encontrarás entre la élite de los pocos que han contribuido a un sistema operativo que funciona. Si te desanimas por el camino, refréscate con el contenido de este libro. Con suerte, te recordará por qué empezaste un viaje tan loco en primer lugar.
En esta etapa, también valdría la pena leer la página de Errores de los Principiantes. Los usuarios del foro han notado que muchos de estos errores se repiten con el tiempo, y evitarlos es una gran manera de no hacer el ridículo.
Responsabilidad
La gente tiende a afirmar que está bien escribir software ineficiente, afirmando que los sistemas informáticos son tan rápidos hoy en día, que no se verá el impacto. Este tipo de mentalidad es peligrosa en el diseño de sistemas operativos. Puede estar bien escribir código descuidado cuando se hace una aplicación sencilla, pero cuando se trata de código crítico que puede ser llamado miles de veces por segundo, hay que eliminar toda la sobrecarga que se pueda. El sistema operativo debería suministrar el ordenador como un recurso básico a las aplicaciones que se ejecutan, con la menor complicación, abstracción y sobrecarga posible.
Las personas que diseñan sistemas operativos en esta época tienden a tener la mentalidad de «todo menos el fregadero de la cocina». Se encargan de tener en cuenta todo, lo que por supuesto es bueno, pero no debería hacerse a expensas de permitir que florezcan los programas mal escritos. Hay muchas cosas que ocurren «bajo el capó» cuando se producen errores en los programas. Los programas mal escritos cuestan un tiempo de ejecución precioso e implican interrupciones de tareas que son caras tanto en memoria como en frecuencia. Le animamos a que desaconseje el software mal escrito.
Conocimientos necesarios
Artículo principal: Conocimientos necesarios
Si crees que puedes saltarte esto, es sólo para ti.
Esta sección se ha movido a una página aparte porque se hace referencia a ella muy a menudo en las discusiones del foro.
Organiza tus planes
Antes de proceder, considera qué es lo que quieres conseguir al escribir un sistema operativo. ¿Cuáles son sus motivaciones para emprender este proyecto? Hay muchas razones posibles para emprender un proyecto de SO como hobby, y la mayoría de los os-devers tienen más de una. Incluso decir «sólo quiero» puede ser suficiente, aunque cuanto más consideres y aclares tus objetivos y motivos, más podrás centrarte en lo que realmente quieres.
Sé honesto contigo mismo, también. No hay que avergonzarse de tener grandes ambiciones para su proyecto, incluso (o especialmente) si no son el objetivo principal. Intenta reconocer todos tus objetivos, no sólo el que crees que es tu propósito principal.
Trata de establecer qué aspectos del diseño del SO te interesan más o ves la necesidad de trabajar en ellos. La mayor parte de lo que se dedica al desarrollo de sistemas operativos, especialmente al principio, es el diseño y el desarrollo del kernel, pero el kernel en sí mismo es sólo una pequeña parte de la mayoría de los sistemas operativos; si tu interés principal es la experiencia del usuario, o las redes, o la programación de controladores, deberías pensar si realmente necesitas (ahora o en el futuro) escribir tu propio sistema operativo o si estarías igual de satisfecho desarrollando esas cosas en un kernel existente. Más de una persona ha entrado en el desarrollo del SO cuando realmente quería diseñar un entorno de escritorio, así que esta es una pregunta muy importante que debes hacerte.
Trata de pensar en cualquier proyecto no relacionado con el SO que puedas querer emprender primero, o al mismo tiempo, especialmente aquellos que puedan servir como práctica o preparación para el proyecto del SO. Por lo general, no hay necesidad de trabajar en el proyecto del sistema operativo en este momento, y cuanto más se haya preparado con antelación, mejor será (hasta cierto punto, por lo menos – la preparación es una cosa, la dilación es otra).
Del mismo modo, si usted tiene la intención de trabajar en la bifurcación de un diseño existente para experimentar, o para modificar para algún propósito específico, se centran en eso en lugar de cuestiones de desarrollo general. Considere qué parte de la base de código existente necesitará, y cuáles quiere cambiar.
Intente elaborar algunos de los objetivos específicos de su proyecto, y prepárese para planificar proyectos separados si le ayuda a hacerlo. Si su intención es simplemente dar vueltas y ver a dónde le lleva, está bien; si su intención es derrocar a Microsoft, también está bien (aunque probablemente no sea realista). Una vez que sepas lo que quieres hacer, puedes desglosar los detalles en objetivos específicos y calcular lo que se necesita para alcanzarlos. No intentes forzar demasiados objetivos divergentes en un solo proyecto–si tienes diferentes cosas que quieres probar con objetivos contradictorios, divídelos en diferentes proyectos.
Puede ayudar si escribes una visión general de tu diseño de SO planeado, con cualquier requisito específico o detalle que consideres notable o que pueda aclarar con qué necesitas ayuda, y añádelo a tu repositorio público si puedes. Esto no sólo facilitará que otros te ayuden, sino que ayudará a organizar y estabilizar tus planes, de forma parecida a como se escribe un esquema para una historia o un trabajo. Prepárese para mantenerlo a medida que cambien sus objetivos y planes, pero conserve una copia de las versiones anteriores (o mejor aún, mantenga el documento bajo control de versiones) para poder ver cómo evoluciona su trabajo con el tiempo.
Por último, revise el tiempo y los recursos que requerirá el proyecto, y decida si son factibles. Si sabe que sólo tiene una cierta cantidad de tiempo para dedicar al proyecto, téngalo en cuenta, y haga lo que haga, no se comprometa con una fecha límite externa, incluso si está seguro de que puede alcanzarla. El desarrollo del sistema operativo lleva tiempo -mucho tiempo- y tratar de terminar un proyecto completo de sistema operativo en un semestre no es realista.
Elegir su entorno de desarrollo
Necesita una plataforma para desarrollar su nuevo sistema. Siguiendo las tendencias de la informática general, la más popular es GNU/Linux, pero muchos utilizan también Windows. Los desarrolladores que utilizan un sistema GNU/Linux tienen una ligera ventaja en cuanto a la disponibilidad de herramientas, pero esto se puede solucionar en Windows utilizando un sistema como Cygwin o MinGW.
- Binutils: Herramientas fundamentales para la manipulación de archivos de objetos.
- GCC: La colección de compiladores de GNU. GCC contiene compiladores para C, C++, Fortran y Ada, entre otros.
- Make: Para automatizar el proceso de construcción, que se vuelve realmente útil una vez que tienes más de un puñado de archivos.
- Grep y sed: Para hacer búsquedas más potentes y buscar y reemplazar (útil cuando se rellenan tablas con datos).
- Diffutils: Increíblemente útil para mostrar las diferencias entre dos archivos.
- Perl o Python: Uno de estos dos lenguajes de scripting debería estar instalado. Útil para la manipulación de cadenas, entre otras cosas. Perl solía ser la recomendación, pero Python está ahora bastante maduro y es posiblemente más fácil de aprender. Ambos tienen cientos de paquetes/módulos disponibles para realizar diversas tareas.
- Un ensamblador: Por ejemplo NASM o GAS. Esto varía dependiendo de la arquitectura de su CPU.
- Un editor: Para escribir sus archivos en ensamblador, C y otros (códigos).
Es posible que no utilice todas estas herramientas, pero es mejor tenerlas a mano «por si acaso», y saber cómo utilizarlas, incluso a un nivel básico. Pero si usted decidió usar otro lenguaje, entonces las herramientas dependen mayormente de usted y tal vez la lista anterior no le ayude de ninguna manera. A continuación se presenta la información relacionada principalmente con los desarrolladores de C/C++ o Ensamblador.
GNU/Linux
El sistema más recomendado para el desarrollo de SO es GNU/Linux. Cuando se utiliza GNU/Linux, la mayoría de las herramientas de desarrollo de GNU probablemente ya están presentes. Si no es así, utilice las herramientas de gestión de paquetes de su distribución (APT, RPM, Portage, Pacman, Apk, etc.) para instalarlas según sea necesario. De nuevo, es necesario hacer un compilador cruzado, para no enlazar en los archivos de tiempo de ejecución del sistema de desarrollo.
Los editores comunes son Vim, Emacs, KDevelop, Komodo Edit, etc. Algunos prefieren editores ligeros en lugar de un IDE, como gedit, Geany y SciTE. A muchos les gusta Midnight Commander, que tiene una interfaz de usuario de texto y un editor incorporado (mcedit) y, por lo tanto, es extremadamente ligero y rápido como un rayo.
Acerca de qué distribuciones debe usar, consulte la lista de distribuciones de Linux. Las hay de todas las formas y tamaños, y no todas son adecuadas para el desarrollo del kernel. No utilice una distro que tenga un objetivo específico, como seguridad (Kali, Qubes, BackTrack, Parrot etc.), aplicaciones científicas (ej. Scientific), cortafuegos y enrutamiento (ej. DD-WRT), recuperación de sistemas o entornos embebidos (Knoppix, Rescatux, TinyCore) o específicamente dirigida a principiantes (como Linux Mint, Nitrux etc.) Aunque un Linux amigable para principiantes podría servir, elija una que sea una distro de propósito general. Además, utiliza una distro que tenga los paquetes actualizados, lo mejor es elegir una que utilice rolling-release. Debian es fácil de usar, pero a menudo envía versiones antiguas y parcheadas (las herramientas pueden no comportarse como se describe). A muchos principiantes les gusta Ubuntu, lo cual está bien, pero se dice que tiene problemas con algunas cadenas de herramientas y entornos de compilación (si compilas tu propio compilador cruzado en lugar de usar uno instalado, esto no es un problema).
Las mejores distros para el desarrollo del kernel son (pero ten en cuenta que esto también es una cuestión de gusto personal, por lo que estas distros no son obligatorias sino sugeridas, y normalmente requieren algo de experiencia): Arch, Gentoo, Solus, Slackware, void etc. incluso Puppy.
Si no estás seguro, prueba con Ubuntu o Manjaro.
Windows
Para conseguir las herramientas necesarias, debes instalar el entorno Cygwin. MinGW o DJGPP son alternativas, pero se sugiere encarecidamente MSYS2 ya que es el entorno más completo y compatible, y además incluye un gestor de paquetes para instalar librerías y herramientas.
Microsoft ha lanzado recientemente (en el momento de escribir este artículo) el Subsistema de Windows para Linux como una característica opcional para Windows 10. Es básicamente una verdadera distribución de línea de comandos de Ubuntu que se ejecuta encima de Windows SIN el uso de una VM. Las últimas versiones de GCC y Binutils (6.1.0 y 2.27) compilan y funcionan correctamente en este entorno. Usando el shell Bash, puedes acceder a tus discos duros de Windows a través de /mnt/<letra de unidad>. La ventaja de esta solución es que puedes trabajar con cualquier herramienta de Windows o Linux que necesites, sin tener que averiguar si funcionan en Cygwin. Muchas de las herramientas necesarias pueden ser instaladas usando «apt-get».
Para todo lo anterior, se sugiere fuertemente construir un compilador cruzado, no sólo porque los compiladores por defecto apuntan a diferentes formatos ejecutables, sino porque generalmente es una buena idea. Consulte la página de GCC Cross-Compiler para obtener detalles e instrucciones.
También necesitará un editor. Usar el Bloc de notas funcionará, pero es más fácil si tienes un editor más completo. Por ejemplo, Notepad++ o Notepad2 son utilizados por mucha gente. Si te sientes cómodo con los editores de Unix, puedes elegir uno de la selección que ofrece Cygwin (que incluye, por ejemplo, Vim y Emacs, a los que hay que acostumbrarse, pero que son muy potentes).
También es posible utilizar Visual Studio, o la edición Express de Visual C++ que se puede descargar gratuitamente, para escribir y compilar tu sistema operativo. Necesitarás un archivo de configuración especial, y seguramente estarás en minoría, pero funciona bastante bien. Incluso puedes instalar el SDK de Windows encima, permitiendo el desarrollo en 64 bits. La única pega es que no soporta Inline Assembly.
También se pueden utilizar otras herramientas como Watcom o Borland, pero cada una de ellas tiene requisitos específicos propios, y no son muy utilizadas para este tipo de trabajo.
MacOS
Debido a que bajo el capó utiliza el userland de FreeBSD, es totalmente compatible con POSIX. Todas las herramientas habituales están disponibles (vi, bash, dd, cat, sed, tar, cpio, etc.). Las herramientas que faltan son en su mayoría relacionadas con el sistema de archivos: no hay dispositivo de bucle, ni fdisk, ni mkfs.vfat ni mtools. Pero puedes usar diskutil para estos propósitos, o usar brew o macports para instalar esas herramientas que faltan.
Para obtener gcc, solías tener un mpkg en el segundo DVD de instalación para las versiones más antiguas. Las versiones más recientes de MacOS (10.13 y superiores) pueden instalar XCode por línea de comandos (no el IDE, sólo la cadena de herramientas) ejecutando «xcode-select –install» desde un Terminal. Esto instalará gcc, binutils y make. Este gcc es en realidad un CLang mascarado, pero con las características suficientes para construir su propio compilador cruzado sin problemas. Es preferible usar el compilador oficial para arrancar gcc que instalar uno desde brew o macports.
Probando su sistema operativo
Artículo principal: Probando
El artículo anterior profundiza mucho en la elección de cómo probar tu sistema operativo y cómo integrarlo en tu proceso de desarrollo. Se discuten tanto los entornos de prueba físicos como los emulados.
Protegiendo tu código
Durante la construcción de tu código escribirás cientos, incluso miles, de líneas de código. Pasarás un número innombrable de horas, y te sentarás hasta altas horas de la noche codificando cuando realmente deberías irte a la cama. Lo último que necesitas es un fallo de disco o un comando ‘rm’ o ‘format’ mal escrito que eche por tierra todo tu trabajo.
Lo que necesitas es un sistema de control de versiones. CVS se ha utilizado durante varios años, pero últimamente ha recibido mucha competencia de Subversion, Bazaar, Mercurial y Git. Si puedes, deberías configurar un ordenador o servidor remoto como servidor de control de versiones, pero si no tienes esa máquina disponible también puedes alojar el sistema de control de versiones en tu ordenador de desarrollo local. Sólo recuerde hacer una copia de seguridad de su código en un CD o FTP de vez en cuando.
No podemos insistir lo suficiente en este punto: si no está utilizando ya el control de fuentes, debería empezar a hacerlo inmediatamente. Sólo necesita cometer un error grave en su código una vez para darse cuenta de la importancia de tener su código versionado de forma segura y fácilmente recuperable. Aunque puede parecer una exageración para un pequeño proyecto privado de hobby, una vez que te acostumbres a usar el control de revisiones, te preguntarás cómo has podido prescindir de él.
Para Git puedes crear tu proyecto en GitHub. Bitbucket también es una buena alternativa ya que soporta tanto Git como Mercurial. Ambos vienen con repositorios gratuitos y privados.
Una ventaja adicional de usar el control de versiones en un repositorio accesible por la red es que hace mucho más fácil colaborar y obtener ayuda de otros. Esto puede ser bastante útil, especialmente en los foros, ya que puede evitar la necesidad de publicar constantemente versiones actualizadas de su código en un hilo de mensajes–usted simplemente apunta la conversación hacia su repositorio, y los otros en el hilo tendrán acceso directo a sus cambios más actuales. También es crucial si, a medida que el proyecto crece, comienzas a trabajar con otros desarrolladores en el proyecto (sólo que no esperes que eso ocurra de la noche a la mañana).
Puntos de partida comunes
La forma más fácil de poner en marcha un núcleo «hola mundo» es el tutorial Bare Bones. Un enfoque diferente sería aprender cómo se inicia el propio ordenador, en la página de la secuencia de arranque.
Hay muchos otros tutoriales disponibles, también.
Obtención de más conocimientos
Hay una increíble cantidad de conocimientos sobre el desarrollo de sistemas operativos disponibles en Internet hoy en día. Sólo es cuestión de encontrarlo. En primer lugar, está esta misma wiki. Entre otros, tenemos un montón de tutoriales. Como estás aquí, probablemente ya lo has encontrado. También en este sitio está el foro, donde muchos desarrolladores pasan el rato y pueden ayudarte (pero asegúrate de leer cómo hacer preguntas primero). Se han escrito bastantes libros sobre desarrollo de sistemas operativos. Algunos de ellos aparecen en nuestra página de Libros, y otros en osdever.net también.
Deja una respuesta