¿Por qué algunos sistemas operativos de manejo de eventos están escritos en asm en lugar de c?

17

Mi pregunta es ¿por qué hoy en día el manejo de eventos del sistema operativo todavía está escrito en lenguaje ensamblador en lugar de un lenguaje de nivel superior como C, cuando el núcleo en sí está escrito principalmente en C?

MAKZ
fuente
55
"Principalmente en c" - ¿y adivina cuál es el resto? ;)
Ricitos
@goldilocks bien está en ensamblaje. Pero ¿por qué, mientras que otras partes están en c?
MAKZ
44
No soy un experto en esto, pero hay algunas cosas relacionadas con el hardware de bajo nivel que no se pueden hacer en C; Estos suelen ser específicos de la arquitectura. El "ASM en línea" se usa a menudo en el código C para ese propósito, por lo que, por ejemplo foobar(), se definirá, usando el ensamblaje en línea, de una manera en una plataforma y de otra en otra. Esto mantiene el uso de asm al mínimo, pero no se puede evitar por completo.
GOLDILOCKS
¿Cómo se configura el registro del puntero de tabla de descriptor global en C?
user253751

Respuestas:

24

El lenguaje abstrae el acceso a los registros de la CPU, y un sistema operativo cuando maneja eventos tiene que guardar el contexto, por lo que necesita acceso a los registros en el punto del evento, rompiendo así la especificación C.

Libre de arrugas
fuente
Esta es en realidad la razón principal. Algunos compiladores de C integrados tienen extensiones que les permiten direccionar registros (generalmente a través de constantes / variables globales previamente declaradas). Pueden hacerlo porque solo apuntan a una arquitectura. Pero los compiladores C de propósito general se dirigen a demasiadas arquitecturas diferentes para hacer que tales extensiones sean razonables. Así que por lo general sólo poner en práctica un mecanismo de incorporación de asm (además, que los haría no estándar)
slebetman
18

C es una abstracción del código de máquina que se ejecuta en la máquina (aunque mucho más cerca que la mayoría de los otros lenguajes).

Para esas cosas, se utilizan declaraciones de código de máquina que no se pueden expresar en C, y tal vez para la optimización adicional no proporcionada por el ensamblador del compilador de C, principalmente en forma de ensamblador en línea .

En el árbol de código fuente del núcleo, esto se almacena en arch/<arch>y include/asm-<arch>donde <arch>hay un nombre de arquitectura específico. En realidad, es sólo una pequeña parte del código fuente del núcleo completo.

nadie
fuente
6

No puedes hacer esto en C :)

lgdt[xxxx]
mov eax, cr0
or al, 0x01
mov cr0, eax

Estoy tratando de entrar en modo protegido x86. Obviamente todavía puedo hacer esto en C "emitiendo" códigos de máquina sin procesar, pero aún en caso de que necesite acceder a ofensas precisas, la mayoría de las veces no tengo suerte.

El segundo ejemplo es BootLoader. En los sistemas x86, se requiere que el código de arranque tradicional tenga exactamente 512 bytes de longitud y los dos últimos bytes sean 0xAA y 0x55 (o 55 AA exactamente) respectivamente ... Asegurarse de que los compiladores C sean una pesadilla y el ensamblador trabajo de una manera fantástica.

Hay muchos más casos en los que la Asamblea no solo es preferible, sino que es el único medio.

Krishna S Santosh
fuente
-5

asm es más delgado y generalmente mucho más rápido que C desechado con bibliotecas, etc., y el sistema operativo maneja MUCHOS eventos TODO el tiempo. Desea delgado y rápido para esta función.

Escoce
fuente
2
La optimización de la tecnología del compilador de C se ha vuelto bastante buena. Es un mito que asm sería generalmente mucho más rápido que C. En cualquier caso, esa no es la razón por la que las operaciones del sistema operativo de bajo nivel de uso de ASM. En su mayoría tiene que ver con las operaciones que no se pueden expresar en C como barreras de memoria, y registrar los bailes de convenciones de llamada no-C, etc ...
Celada