Soy un estudiante universitario muy ambicioso que desea aprender casi todo lo que hay que saber sobre las computadoras (bésame si quieres, me encanta aprender). Recientemente pensé que sería un proyecto divertido (aunque largo) diseñar y construir mi propio núcleo.
Obtuve información básica y me di cuenta de que necesito dominar Assembly y C / C ++ para que realmente funcione. Mientras estoy trabajando en eso, me gustaría aprender CÓMO funciona realmente un núcleo desde una perspectiva de programación. He pasado horas explorando el código del kernel de Linux, pero eso solo puede llevarlo hasta ahora.
¿Cuáles son los pasos básicos para construir un núcleo? ¿Cosas que necesitas abordar? ¿Ordenar o hacer cosas? Sé que estoy mordiendo mucho, pero estoy lo suficientemente decidido como para manejarlo.
Respuestas:
Lo que debe hacer es diseñar el sistema operativo. Incluso si, por ejemplo, decide que debería ser un sistema similar a UNIX, todavía hay muchas decisiones que tomar. ¿Qué tanto quieres que sea UNIX? ¿Qué partes de UNIX te gustan y cuáles crees que necesitan mejorarse?
Si no está decidido a que sea similar a UNIX, terminará con aún más preguntas por responder: ¿deberían los procesos formar un árbol o son "planos"? ¿Qué tipo de comunicación entre procesos desea apoyar? ¿Desea que sea multiusuario, o simplemente multitarea (o posiblemente una sola tarea)? ¿Quieres que sea un sistema en tiempo real? ¿Qué grado de aislamiento desea proporcionar entre tareas? ¿Dónde quieres que caiga en la escala monolítica vs. micro-kernel? ¿En qué medida (si corresponde) desea que sea compatible con la operación distribuida?
En general, aconsejaría no estudiar el kernel de Linux como inspiración. Eso no es nada en contra del kernel de Linux en sí mismo, sino un simple hecho de que Linux está destinado principalmente para uso de producción, no para educación. Tiene mucha optimización, trucos de compatibilidad con versiones anteriores, etc., que son extremadamente útiles para la producción pero es más probable que distraigan que eduquen.
Si puede encontrarlo, una copia del libro de Lion ( Comentario de los Leones sobre la 6ta edición de UNIX , con código fuente , de John Lions) es un punto de partida mucho más fácil. La sexta edición de UNIX todavía era lo suficientemente pequeña y simple como para leerla y comprenderla con bastante rapidez, sin ser un sistema de juguete demasiado simplificado.
Si planea apuntar al x86 (al menos principalmente), es posible que también desee mirar MMURTL V 1.0 de Richard Burgess. Esto presenta un sistema para el x86 que utiliza el hardware x86 mucho más de lo que los diseñadores de la CPU pretendían originalmente, algo que la mayoría de los sistemas reales evitan a favor de la portabilidad a otras CPU. Como puede suponer, esto tiende a orientarse mucho más hacia el final del hardware. Las copias impresas parecen ser caras y difíciles de encontrar, pero puede descargar el texto y el código de forma gratuita.
Afortunadamente, también hay muchas más posibilidades: diseño e implementación del sistema operativo , por Andrew Tanenbaum y Albert Woodhull, por ejemplo.
fuente
Sugeriría comenzar con una tarea pequeña y altamente enfocada: usar el ensamblaje, escribir un programa de arranque de juguete. No tiene que hacer mucho. Solo desea que la computadora cargue automáticamente el programa cuando se inicie, imprima un mensaje que confirme que se está ejecutando, lea algunas entradas del teclado, imprima otro mensaje y luego apague la computadora.
Esto tendría varios beneficios:
Una vez que pueda hacer esto, tendrá una idea mucho mejor de en qué se está metiendo.
fuente
Aprender a programar en ensamblador es un buen primer comienzo y hacerlo desde MSDOS 6.0 también podría ser útil debido a la falta de funciones integradas.
Leer un buen libro como Conceptos del sistema operativo sería un buen comienzo para diseñar su propio núcleo. Tendrá que manejar la carga de arranque, la administración del controlador del dispositivo, la interfaz con el BIOS, la creación y administración del sistema de archivos, la programación del programa, la carga y descarga del programa, implementar al menos algún tipo de shell (mucho más fácil que construir un sistema de ventanas).
C / C ++ solo funcionará si su núcleo es compatible con las bibliotecas estándar para estos idiomas, de lo contrario, también necesitará escribir una copia de estas bibliotecas.
Eso ni siquiera comienza a pensar en subprocesos múltiples, seguridad del sistema, redes.
fuente
Minix es un buen clon de Unix (que inspiró Linux) que fue escrito para la enseñanza.
Andrew S. Tannenbaum es un excelente escritor y maestro y ha escrito un libro completo sobre los sistemas operativos que usan Minix como ejemplo (e incluye el código fuente que se debe seguir): http://en.wikipedia.org/wiki/Operating_Systems:_Design_and_Implementation
Personalmente, creo que es un escritor mejor que programador, por lo que algunas cosas no son tan claras como me gustaría personalmente, pero, ¡oye, funciona!
Puedo recomendar encarecidamente que analice esto como un recurso de aprendizaje. También le dará una idea de la cantidad de trabajo necesario para producir algo que realmente pueda ser útil.
fuente
Lo he estado aprendiendo también. Puedes consultar estos recursos. ¡Ellos son muy buenos!
http://www.osdever.net/tutorials/index
http://kernelnewbies.org/
Diviértete en el camino!
fuente