2010-10-19 7 views
5

Son núcleos de sistemas operativos (nivel de interacción del dispositivo) realmente escritos en C, o "escritos en C" significa que la mayor parte del sistema operativo está escrita en C y la interacción con los dispositivos está escrita en asm?¿Están los núcleos (nivel de abstracción del dispositivo) de los SO escritos completamente en C? (Como: "UNIX está escrito en C")

Por qué te pido que:

  1. Si el núcleo está escrito en ASM - no puede ser multiplataforma.
  2. Si está escrito es C - No me puedo imaginar cómo podría ser escrito en C

OK. ¿Y qué pasa con I \ O exactamente? No puedo imaginar cómo puede la interacción con el controlador HDD o el controlador USB u otras cosas reales que debemos enviar señales para que se escriban sin (o con una pequeña cantidad de) asm. Después de todo, gracias. Echaré un vistazo a algunas otras fuentes de la web.

PD (Flood) Es una pena que no tengamos un curso de OS en la universidad, a pesar de que MIPT es el hermano ruso del MIT, encontré que nadie escribe sistemas operativos como minix aquí.

+1

¿Qué quiere decir por # 3? –

+2

La mayoría de los sistemas operativos consideran que la programación de procesos, la administración de memoria y la interacción del sistema de archivos como núcleo, no la interacción del dispositivo – nos

Respuesta

3

Depende.

Un sistema operativo para un dispositivo pequeño, incrustado, con una CPU simple se puede escribir completamente en C (o en C++ para el caso).
Para OS-es más complicados, como Windows o Linux actuales, es muy probable que haya piezas pequeñas escritas en el ensamblaje. Los esperaría más en el programador de tareas, porque tiene algunos trucos complicados para hacer con los registros de CPU especiales y puede necesitar algunas instrucciones especiales que el compilador normalmente no genera.

Los controladores de dispositivos pueden, casi siempre, estar escritas íntegramente en C

+0

"puede escribirse completamente en C", porque los desarrolladores de CPU ya han escrito todas las bibliotecas para usted. interfaz en C con piezas de ASM o solo en C? "Los controladores de dispositivos pueden", ¿cómo? Pensé, cuando nosotros, por ejemplo, escribimos smt en HDD, seremos instrucciones de llamadas que reemplazarían los elementos internos de esta HDD de una manera correcta. –

+1

@MInner: No porque los desarrolladores de la CPU hayan proporcionado bibliotecas especiales, sino porque el compilador puede generar el código correcto para acceder al dispositivo (o al bus de comunicación al que está conectado el dispositivo) –

+0

¿Complemento para esta plataforma o para cualquiera? Si para cualquier ... Que el compilador debe ser muy pesado o modulado. –

3

Normalmente, hay una cantidad mínima de ensamblaje (ya que necesita un poco), y el resto está escrito en C e interfaces con él. Puede escribir funciones en ensamblaje y llamarlas desde C, para que pueda encapsular cualquier funcionalidad que desee.

Mediante un pequeño truco específico de implementación, es posible escribir controladores completamente en C, ya que normalmente es posible crear, por ejemplo, un volatile int * que utilizará un registro de dispositivo mapeado en memoria.

9

La idea básica en Unix es escribir casi todo en C. Así que en un principio, algo así como el 99% de la misma fue de C, que era el punto , y el objetivo principal era la portabilidad.
Para responder a su pregunta, la interacción con los dispositivos también está escrita en C, sí. Incluso cosas de muy bajo nivel están escritas en C, especialmente en Unix. Pero todavía hay muy pocas partes escritas en lenguaje ensamblador. En x86, por ejemplo, el gestor de arranque de cualquier sistema operativo incluirá una parte en el ensamblador. Puede tener pequeñas partes de controladores de dispositivo escritos en lenguaje ensamblador. Pero no es común, e incluso cuando está hecho, normalmente es una parte muy pequeña del código de nivel más bajo. Cuánto depende exactamente de las implementaciones. Por ejemplo, NetBSD puede ejecutarse en docenas de arquitecturas diferentes, por lo que evitan el lenguaje ensamblador a toda costa; por el contrario, a Apple no le importa la portabilidad, por lo que una parte decente de MacOS libc está escrita en lenguaje ensamblador.

+1

Algunas cosas deben escribirse en ensamblador, al menos en ciertas arquitecturas, como el intercambio de tareas, etc. Pero, como es bien sabido, todos (AFAIK) del contenido supuestamente de bajo nivel de PCI en NetBSD están escritos en C. –

+0

A Apple le importa la portabilidad. Su sistema operativo actual tiene que ejecutarse en i386, x86_64 y ARM. La iteración anterior (OS X 10.5) también se ejecutó en la arquitectura de PowerPC. Dudo si alguno de sus libc está escrito en ensamblador, excepto la interfaz syscall. – JeremyP

+0

Sí, sí lo hacen, pero me refería a grandes rasgos. Admiten menos configuraciones de hardware que cualquiera de sus concurrentes directos, y en ese sentido, tienen menos preocupaciones de portabilidad. Sobre la libc, no he visto las fuentes; Leo cosas como strcmp en ensamblador. – Jean

3

Algunos sistemas operativos están escritos en lenguaje ensamblador, pero es es mucho más común que un núcleo se escriba en un lenguaje de alto nivel como C para la portabilidad. Normalmente (although this is not always the case), un kernel escrito en un lenguaje de alto nivel también tendrá algunos bits pequeños de lenguaje ensamblador para los elementos que el compilador no puede expresar y debe escribirse en Assembler por algún motivo. Ejemplos típicos son: sólo

  • Certain modo kernel de instrucciones para manipular la MMU o realizar otras operaciones privilegiadas no pueden ser generados por un compilador estándar. En este caso, el código debe escribirse en lenguaje ensamblador.

  • Optimizaciones de rendimiento específicas de la plataforma. Por ejemplo, la arquitectura X64 tiene una instrucción de intercambio de endances y el ARM tiene una palanca de cambios (gira la palabra que se lee por N bits) que se puede usar en operaciones de carga.

  • Conjunto 'pegamento' para interactuar con algo que no funcionará bien con (por ejemplo) la estructura de la estructura de pila de C, los formatos de datos o las convenciones de disposición de parámetros.

1

No tiene que preguntarse acerca de preguntas como estas. Ve a buscar el origen del kernel de Linux y búscalo tú mismo. La mayor parte del ensamblaje se almacena por arquitectura en el directorio arch. Realmente no es sorprendente que la gran mayoría esté en C. El compilador genera código de máquina nativo, después de todo. No tiene que ser C tampoco. Nuestro kernel incrustado en el trabajo está escrito en C++.

+0

Pero es una especie de punto de SO documentar todos los hechos de programación, simple y complicado por igual. –

1

Si le interesan los indicadores específicos, considere el kernel de Linux. Todo el árbol software está prácticamente todos escrito en C. La porción más conocido de montaje utilizado en el núcleo es entry.S que es específica para cada arquitectura:

http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=arch/x86/kernel/entry_64.S;h=17be5ec7cbbad332973b6b46a79cdb3db2832f74;hb=HEAD

Además, para cada arquitectura, funcionalidad y optimizaciones que no son posibles en C (por ejemplo, spinlocks operaciones atómicas) puede ser implementado en el montaje:

http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=arch/x86/include/asm/spinlock.h;h=3089f70c0c52059e569c8745d1dcca089daee8af;hb=HEAD

Cuestiones relacionadas