Pourquoi la gestion des événements de certains systèmes d'exploitation est écrite en asm au lieu de c?

17

Ma question est pourquoi de nos jours une certaine gestion des événements du système d'exploitation est toujours écrite en langage assembleur au lieu d'un langage de niveau supérieur tel que C, alors que le noyau lui-même est écrit principalement en C?

MAKZ
la source
5
"Surtout en c" - et devinez quel est le reste? ;)
goldilocks
@goldilocks bien c'est en assemblage. Mais pourquoi, alors que d'autres parties sont en c?
MAKZ
4
Je ne suis pas un expert mais il y a des choses liées au matériel de bas niveau qui ne peuvent pas être faites en C; ce sont généralement spécifiques à l'architecture. "Inline ASM" est souvent utilisé dans le code C à cet effet, donc par exemple foobar()sera défini, en utilisant l'assemblage en ligne, d'une manière sur une plate-forme et d'une autre manière sur une autre. Cela réduit l'utilisation de asm au minimum, mais il ne peut pas être complètement évité.
goldilocks
Comment définissez-vous le registre du pointeur de table des descripteurs globaux en C?
user253751

Réponses:

24

Le langage supprime l'accès aux registres du processeur, et un système d'exploitation lors de la gestion des événements doit enregistrer le contexte, il a donc besoin d'accéder aux registres au moment de l'événement, cassant ainsi la spécification C.

WrinkleFree
la source
C'est en fait la principale raison. Certains compilateurs C intégrés ont des extensions qui leur permettent d'adresser des registres (généralement via des constantes / variables globales pré-déclarées). Ils peuvent le faire car ils ne ciblent qu'une seule architecture. Mais les compilateurs C à usage général ciblent trop d'architectures différentes pour rendre ces extensions raisonnables. Ainsi, ils implémentent généralement un mécanisme d'intégration asm (en plus, cela les rendrait non standard)
slebetman
18

C est une abstraction du code machine qui s'exécute sur la machine (bien que beaucoup plus proche que la plupart des autres langues).

Pour ces choses, des instructions de code machine qui ne peuvent pas être exprimées en C, et peut-être pour l'optimisation supplémentaire non fournie par l'assembly du compilateur C, sont principalement utilisées sous la forme d'un assembleur en ligne .

Dans l'arborescence du code source du noyau, il est stocké sous arch/<arch>et include/asm-<arch>où se <arch>trouve un nom d'architecture spécifique. Ce n'est en fait qu'une petite partie de la source complète du noyau.

n'importe qui
la source
6

Vous ne pouvez pas faire cela en C :)

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

J'essaie d'entrer en mode protégé x86. Évidemment, je peux toujours le faire en C en «émettant» des codes machine bruts, mais toujours au cas où j'aurais besoin d'accéder à des décalages précis - je n'ai surtout pas de chance.

Le deuxième exemple est BootLoader. Sur les systèmes x86, il est nécessaire que le code de démarrage traditionnel soit exactement de 512 octets de long et que les deux derniers octets soient respectivement 0xAA et 0x55 (ou 55 AA exactement) ... travail d'une manière fantastique.

Il existe de nombreux autres cas de ce type où l'Assemblée n'est pas seulement préférable - mais est le seul moyen.

Krishna S Santosh
la source
-5

asm est plus mince et généralement beaucoup plus rapide que C junked avec des bibliothèques, etc., et le système d'exploitation gère beaucoup d'événements tout le temps. Vous voulez mince et rapide pour cette fonction.

Escoce
la source
2
L'optimisation de la technologie du compilateur C est devenue assez bonne. C'est un mythe qu'asm serait généralement beaucoup plus rapide que C. En tout cas, ce n'est pas la raison pour laquelle les opérations de bas niveau du système d'exploitation utilisent asm. Cela a principalement à voir avec les opérations qui ne peuvent pas être exprimées en C comme les barrières de mémoire, et enregistrer les danses pour les conventions d'appel non-C, etc ...
Celada