operating system - Para kernel/OS es C todavía lo es?
operating-system osdev (17)
Me gustan los sistemas operativos y eventualmente me gustaría convertirme en un desarrollador de sistemas operativos que trabaje principalmente en núcleos. En el futuro, ¿seguirá siendo C el idioma de elección y qué más debería intentar aprender?
¡Definitivamente! También debe aprender al menos un lenguaje ensamblador / arquitectura de hardware.
Actualmente, hay bastante espacio en el núcleo de un sistema operativo moderno para el código C ++. Acabo de mirar y el árbol del núcleo de Win7 tiene un poco de código C ++. Tenga en cuenta que muchos subsistemas permanecen en C simple. Hay algunas razones para esto
- C es el idioma original del sistema operativo basado en NT
- C es muy, muy bien entendido por personas clave
- Bien escrito C puede ser el código más sencillo de depurar, especialmente en el modo de núcleo.
Dicho esto, muchos equipos y personas han encontrado que C ++ bien escrito es una herramienta eficaz para el trabajo del SO central.
No hay nada acerca de C ++ que evite que se use para escribir código de administración de recursos centrales como un programador, un administrador de memoria, un subsistema de E / S, un subsistema de gráficos, etc.
Como han señalado otros, cualquier trabajo del núcleo siempre requerirá un poco de lenguaje ensamblador.
Bueno, en la comunidad osdev, C se llama generalmente lenguaje de alto nivel. Y el lenguaje más "de bajo nivel" sería el ensamblaje (se ve obligado a usar ASM al inicio de su kernel, así que tiene que usar ASM pero no tiene que usar C).
C ++ es compatible con el desarrollo en modo kernel en Windows, pero no puede usar excepciones y RTTI fácilmente. Creo que no hay razón para escribir código en C hoy, ya que la sobrecarga de C ++ es despreciable (cualquier infraestructura de seguimiento / depuración será mucho más costosa que la desreferencia adicional para la llamada de función virtual). De hecho, la mayoría del DDK de Windows implementa patrones orientados a objetos con C, lo cual es un inconveniente en comparación con C ++.
Si decide utilizar C ++ para el desarrollo en modo kernel, deberá anular al nuevo operador para elegir si asignar una clase en la memoria paginable o no paginable. Algunas macros bonitas pueden ser útiles allí.
C es bastante, con una buena cantidad de ensamblador. Los temas importantes para el trabajo del núcleo del sistema operativo incluyen:
- Principios de caché y gestión de caché.
- Memoria virtual, gestión de TLB
- CPU y arquitectura del sistema
- Jerarquías de almacenamiento
- Técnicas de programación concurrente (exclusión mutua, bloqueo, ...)
- Algoritmos y estructuras de datos.
Cody no quería que se molestara en contestar esto, así que estoy pasando esto en su nombre. :-P Para algunos ejemplos de sistemas operativos escritos en lenguajes administrados, a diferencia de C o ensamblaje, consulte:
Por supuesto, Cody tampoco quiso mencionar esto:
Creo que es seguro decir que las partes de bajo nivel de los sistemas operativos (por ejemplo, el kernel) continuarán escritas en C debido a su velocidad. Como se mencionó en otra parte, deberá conocer el ensamblador para ciertas partes del kernel (algo debe cargar el kernel en la memoria). Pero puede trabajar en el núcleo con poco o ningún conocimiento de ensamblaje. Un buen ejemplo sería si está implementando un sistema de archivos.
No se preocupe por el idioma en el que se implementa el sistema operativo. Lo importante es cómo se utilizan los sistemas operativos y qué se puede hacer para mejorarlos. Un buen ejemplo es cuando salió Unix por primera vez. El sistema de archivos tenía los inodos en la parte frontal del disco y los datos en el espacio restante. Esto no funcionó muy bien ya que buscaba diferentes partes del disco para todos los archivos. Luego, el sistema de archivos rápido de Berkeley se creó para crear un sistema de archivos compatible con el disco. Esto significa tener inodos cerca de sus datos correspondientes. Estoy dejando de lado muchos detalles, pero espero que esto ilustre que es más importante pensar en cómo se puede mejorar un sistema operativo en lugar de en qué idioma se programará.
Algunas tendencias recientes en los sistemas operativos son la virtualización y la computación distribuida (consulte el documento de Google en MapReduce ). Los sistemas de archivos, la seguridad, la programación (especialmente con procesadores de múltiples núcleos), etc. son áreas de interés continuo, aunque estos problemas no sean nuevos.
Aquí hay algunos recursos si desea obtener más información sobre el desarrollo del kernel:
- Linux Kernel Newbies : recurso para aquellos que desean comenzar a modificar el kernel de Linux.
- Fuente xv6 : puerto x86 de Unix versión 6. Utilizado por MIT para enseñar una clase de sistemas operativos. Simple, y fácil de extender ( más información ).
- Linux Kernel Map - Cadena de llamadas de llamadas al sistema en Linux. Útil para visualizar lo que hace una llamada de sistema.
Conclusión: comience a familiarizarse con el kernel y lea artículos sobre lo que escriben los investigadores (para esto es útil el USENIX ). Este conocimiento es mucho más valioso que aprender un nuevo idioma, ya que la mayoría de los conceptos de un idioma pueden transferirse fácilmente a otro si se produce un cambio en lo que están escritos los sistemas operativos. ¡Espero que esto ayude!
Creo que es una apuesta bastante segura que el desarrollo serio (no experimental) del sistema operativo se mantendrá en C (y ensamblaje) en el futuro inmediato.
La prueba que presento es Ada. Puede ser tan simple como C, proporciona un mejor control sobre la ubicación de los datos y tiene un comportamiento predeterminado más seguro para casi todo (por ejemplo: verificación de límites de matriz). Desde el punto de vista de un desarrollador de sistemas operativos, es igual o superior a C en cualquier parámetro técnico que pueda imaginar. Ha estado disponible por más de 20 años (ok ... a un precio razonable para quizás solo 15).
Entonces, si las personas estuvieran buscando un lenguaje técnicamente superior a C, deberías ver los sistemas operativos en todo el lugar escritos en Ada, ¿no? Lo que realmente veo es un sistema operativo serio implementado en Ada. Ya no se admite a favor de una reimplementación en C.
Las barreras a otros idiomas en el desarrollo de sistemas operativos no son ni han sido nunca técnicas. No veo que los beneficios no técnicos de C desaparezcan pronto, y nadie los superará simplemente diseñando un lenguaje mejor.
Definitivamente debes ser fluido en C.
Como han señalado otros, no hay razón para que un sistema operativo tenga que estar escrito en C, y hay mucho que ganar utilizando lenguajes más sofisticados. Pero si va a trabajar en sistemas operativos en el mundo real (es decir, no en la academia o en un laboratorio de investigación) hay un par de realidades con las que tiene que vivir:
- Los sistemas operativos existentes son enormes, a menudo muchos millones de líneas de código, y están escritos en derivados C o C, como Objective-C o C ++.
- Los nuevos sistemas operativos requieren cientos de años de ingeniería (y muchos años calendario) para alcanzar y combinar la funcionalidad y la solidez de los sistemas operativos existentes.
Como resultado, es difícil para mí ver cómo y cuándo el mundo se alejará de los núcleos de sistemas operativos basados en C. Sí, es técnicamente posible. Pero el costo puede ser demasiado alto. En todo caso, la tendencia parece ser hacia la consolidación en un pequeño número de familias de sistemas operativos (Windows, Linux y BSD), todas basadas en C.
Sería interesante saber qué investigaciones se han realizado, o qué herramientas y técnicas podrían estar disponibles para hacer evolucionar una base de código existente (como Linux) a un lenguaje mejor. Creo que este sería un enfoque mucho más viable que lograr que el mundo adopte un sistema operativo completamente nuevo.
Entre la multitud de investigadores, hay mucho interés en usar tecnología basada en el lenguaje para garantizar que el núcleo no pueda portarse mal. Algunas personas han mencionado el proyecto Singularity , que actualmente tiene un perfil (merecidamente) alto. ¿Por qué es interesante la singularidad?
El lenguaje incluye un modelo de estado finito para el uso adecuado de los bloqueos. El compilador puede verificar el código del modelo con el modelo para asegurarse de que no se produzca un interbloqueo .
Los controladores de terceros tienen una interfaz limitada con el sistema. La comprobación realizada por el compilador garantiza que un controlador defectuoso no puede eliminar el sistema ; lo peor que puede hacer es eliminar su propio dispositivo.
La singularidad utiliza la tecnología de compilación, no la tecnología OS / MMU, para aislar un "proceso" de otro. Repetir de repente un nuevo "proceso" (en realidad un nuevo tipo de dominio de protección ) es muy barato, y esto permite nuevos diseños.
Singularity es solo lo último en una larga lista de proyectos que han usado lenguaje y tecnología de compilación para resolver problemas del sistema operativo. Uno de mis favoritos fue el kernel SPIN de la Universidad de Washington, que permitió que las aplicaciones extendieran el kernel de forma segura y se escribió en Modula-3.
Esta área de investigación aún está muy abierta, y aún no se sabe realmente qué conjunto de características de lenguaje o compilador es un "punto óptimo" para resolver problemas de SO. Así que para responder a su pregunta:
En los sistemas de producción actuales , C sigue siendo "eso".
Para los sistemas operativos del futuro , C es casi seguro que no es "eso", sabemos que es posible hacerlo mucho mejor, pero la naturaleza exacta del nuevo "esto" sigue siendo una cuestión muy abierta.
Es posible que desee echar un vistazo al proyecto Singularity de Microsoft (también en Wikipedia ):
Singularity es un sistema operativo experimental construido por Microsoft Research desde 2003. Está pensado como un sistema operativo altamente confiable en el que el kernel, los controladores de dispositivos y las aplicaciones están escritos en código administrado.
Solo una parte extremadamente pequeña de este sistema operativo está realmente escrita en C, y el resto está escrito en lenguajes de nivel superior (Sing #, una extensión de C #). En el futuro, creo que puede esperar ver mucho más de este tipo de cosas disponibles.
He realizado una extensa programación tanto en el Windows NT como en el Kernel de Linux. Y puedo asegurarles que siempre que estos 2 sistemas operativos estén alrededor de C, se utilizarán en el núcleo. Creo que es una multitud de razones, pero la respuesta más fácil es el tiempo. Como mencionaron los carteles anteriores, la cantidad de tiempo que tomaría reescribir el Kernel en un idioma diferente no vale la pena. Y no sería simplemente portar el código. El núcleo necesitaría algunas modificaciones serias de diseño. Personalmente creo que C es el lenguaje más adecuado para un Kernel. Ser capaz de administrar su memoria abierta y asignar dinámicamente y liberar su propia memoria es crucial cuando está trabajando en el kernel. Especialmente si está trabajando con memoria paginada. El tamaño de pila que se le asigna en el modo Kernel también es generalmente más pequeño que el modo de usuario, por lo que, de nuevo, la eficiencia de la memoria es crucial. C también permite a los programadores crear estructuras de datos hermosas que no contengan toda la sobrecarga que los lenguajes administrados tienen. En mi opinión, una estructura también se puede usar con la misma eficacia que un Objeto, pero nuevamente sin toda la sobrecarga. Los lenguajes administrados también necesitan ser "manejados". En el Kernel no tienes nada que limpie tus líos. No me malinterpretes, me encanta C # y creo que el framework .NET es hermoso, pero si estás en el núcleo C es y seguirá siéndolo.
Microsoft está en el proceso de reescribir algunos de Windows en .NET, sin embargo, dudo que mucho del núcleo se toque.
Sin embargo, hay proyectos como Cosmos ( http://www.gocosmos.org/index.en.aspx ) que nos dan esperanza.
Muy a menudo, puedes escuchar algunas palabras: el lenguaje C es sinónimo de velocidad y Ada, no. Eso no es cierto. Ada agrega algunas verificaciones que ralentizan la ejecución. Eso es cierto, pero con fines de depuración o seguridad. Por lo tanto, se pueden eliminar mediante configuración en tiempo de compilación. Por lo tanto, puede generar programas ADa sin sobrecarga. Por otro lado, tenga en cuenta que el compilador gnu traduce Ada y C en el mismo código intermedio. Como resultado, obtienes el mismo código ejecutable al final. Leí aquí que Ada no se puede usar para desarrollar controladores. Eso es falso Ada tiene la misma capacidad que el lenguaje C. Más, evita muchos errores. Puedes ver que existe un sistema operativo en tiempo real, MarteOS, totalmente escrito en Ada.
La razón principal por la que Ada no se usa para programar un kernel de SO es que el lenguaje C es el lenguaje usado para Unix. Es una norma POSIX a la que la API de llamada de sistema se expresa con prototipos C. Todos los fragmentos de sistema operativo ya están escritos en C. Y, el lenguaje C representa el 17% del software desarrollado en el mundo.
Finalmente, Ada es estricta y muchas personas no les gusta esto. Prefieren desarrollar software con vulnerabilidades y dedicar más tiempo a la depuración.
No, no es "eso". Los núcleos generalmente se escriben en C con un poco de ensamblador rociado. Pero el sistema operativo está escrito en todo tipo de lenguaje. Pero incluso allí, C ++ puede usarse sin demasiados problemas. Así pueden hacerlo muchos otros idiomas. Linux está escrito por fanáticos de C que temen y detestan todo lo demás, que es su problema. Windows está escrito en una gran mezcla de C y C ++, y probablemente también con algunos bits del código antiguo de Pascal. Y en estos días, también están apareciendo trozos de .NET. OS X usa Objective-C para gran parte del código del sistema operativo.
El mismo consejo se aplica como en todas las otras áreas de programación:
- Saber tus cosas
- No te limites a la única lengua verdadera.
El núcleo es la única área donde se aplican reglas "especiales". Pero el núcleo es pequeño . La gran mayoría de los sistemas operativos pueden estar escritos en cualquier idioma.
Ciertamente, necesitarás saber C, sí, pero saber que C no está lo suficientemente cerca.
Si está hablando del kernel, entonces necesita aprender un idioma que permita un acceso más fácil al hardware subyacente, más rápido. Solo puedo pensar en
- Lenguaje C y
- Montaje
AFAIK, algunas partes del cargador de arranque se escribirán en ensamblaje, y de ahí en adelante, C. Hay muchos sistemas operativos de código abierto fáciles de entender disponibles, como por ejemplo los últimos TOPPERS. Trate de investigarlo.
Supongo que, como desarrollador del kernel del sistema operativo , se preocupará más por las formas de acceder de manera eficiente al hardware subyacente (como el procesador y la memoria) en lugar de la elección del idioma. Apuesto, la mayoría de las veces, estaremos tentados a usar el ensamblaje.
Señalo el lenguaje de programación Oberon y el sistema operativo Oberon del autor del lenguaje Pascal, Niklaus Wirth . El proyecto Niklaus Wirth también tiene un sitio para fans .
Si comprendo correctamente la función Андрей Николаевич Терехов , Ada tiene la ventaja de que las verificaciones de acceso a la memoria se pueden mover del hardware de la CPU al nivel del compilador, lo que reduce la cantidad de compuertas lógicas en la CPU, lo que a su vez es beneficioso desde el punto de consumo de energía de ver. Cuantas menos puertas lógicas necesite una CPU, más núcleos se pueden crear a partir de la misma cantidad de puertas lógicas. Desde ese punto de vista, las CPU-s que se adaptan específicamente a un idioma, donde el compilador reemplaza partes de hardware, tienen una ventaja fundamental en términos de número de operaciones por vatio.