Consejos para un estudiante ambicioso en la construcción de su propio núcleo [cerrado]

18

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.

n0pe
fuente
12
No hay necesidad de criticarte por querer aprender todo. Pero si usted planea en realidad tratando, usted tiene una mejor vida útil prolongada, un cerebro sobrehumana y no hay otros planes para su vida;)
2
¡Espero tener todo eso! Sin embargo, en realidad no, solo tengo una urgencia abrumadora de aprender.
n0pe
@delnan Posible esquizofrenia paranoica también es una ventaja: templeos.org
DanteTheEgregore
@DanteTheEgregore ¿Qué?
Panzercrisis

Respuestas:

34

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.

Jerry Coffin
fuente
Guau, gracias por la buena respuesta. Examinaré todos esos libros.
n0pe
77
Agregué enlaces a archivos PDF del libro y la fuente. Lo sorprendente de la fuente para v6 UNIX es que tiene 100 páginas, con 100 líneas por página. Y en 10,000 líneas de código tiene un sistema operativo completo y multitarea . Si realmente puede entender el código que rodea el famoso comentario en la línea 2238, "No se espera que comprenda esto", puede darse una Estrella de Oro y un Maestro Honorario. ¡Disfrutar!
Peter Rowell
Gracias por los enlaces! Ahora tengo que averiguar dónde imprimir esto ....
n0pe
1
Minix (el libro de Tannenbaum) está diseñado para la educación y puede ser justo lo que se necesita aquí.
@PeterRowell, dmr declaró que era un error en cm.bell-labs.com/who/dmr/odd.html
12

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:

  1. Eventualmente necesitará un proceso de arranque para su núcleo, por lo que no será un ejercicio inútil.
  2. Le dará práctica en escritura en asamblea.
  3. Le dará su práctica en la escritura de rutinas IO de bajo nivel. ¿Cómo se escribe un mensaje en la pantalla o se lee una tecla cuando no hay un sistema operativo al que pueda llamar?
  4. Le dará experiencia investigando las minucias técnicas de la CPU y la placa base. (Primera pregunta: ¿cómo encuentra su placa base / CPU un programa de arranque cuando se inicia?)
  5. Escribir núcleos se ha convertido en una tarea muy sofisticada, con un montón de sutilezas. Esta tarea le dará algo para comenzar y tal vez evite que se pierda en la maleza incluso antes de comenzar.

Una vez que pueda hacer esto, tendrá una idea mucho mejor de en qué se está metiendo.

Charles E. Grant
fuente
Gracias por esto, creo que esto es exactamente lo que voy a intentar hacer. Más lectura en mi futuro.
n0pe
7

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.

Peter Smith
fuente
7

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
Recomiendo conseguir el libro físico. Más fácil de tomar notas.
Ahora que lo pienso, creo que vi el libro en Amazon a bajo precio. Podría conseguirlo allí. Gracias
n0pe
También tenga en cuenta que esta es la tercera edición. Creo que usamos la primera edición cuando tenía el curso.