Warum wird die Ereignisbehandlung einiger Betriebssysteme in asm anstelle von c geschrieben?

17

Meine Frage ist, warum heutzutage einige Betriebssystemereignisbehandlungen immer noch in Assemblersprache statt in einer höheren Sprache wie C geschrieben sind, wenn der Kernel selbst hauptsächlich in C geschrieben ist.

MAKZ
quelle
5
"Meistens in c" - und raten Sie mal, was der Rest ist? ;)
Goldlöckchen
@goldilocks gut, es ist in Montage. Aber warum, während andere Teile in c sind?
MAKZ
4
Ich bin kein Experte in diesem Bereich, aber es gibt einige hardwarebezogene Dinge, die in C nicht möglich sind. Diese sind in der Regel architekturspezifisch. "Inline-ASM" wird häufig in C-Code für diesen Zweck verwendet, daher wird z. B. foobar()mithilfe der Inline-Assembly eine Möglichkeit auf einer Plattform und eine andere Möglichkeit auf einer anderen definiert. Dadurch wird der Einsatz von asm auf ein Minimum beschränkt, kann jedoch nicht vollständig vermieden werden.
Goldlöckchen
Wie setzt man das Global Descriptor Table Pointer Register in C?
user253751

Antworten:

24

Die Sprache entzieht den Zugriff auf CPU-Register, und ein Betriebssystem, das Ereignisse verarbeitet, muss den Kontext speichern, sodass es auf die Register zum Zeitpunkt des Ereignisses zugreifen muss, wodurch die C-Spezifikation verletzt wird.

Knitterfrei
quelle
Dies ist eigentlich der Hauptgrund. Einige eingebettete C-Compiler verfügen über Erweiterungen, mit denen sie Register ansprechen können (normalerweise über vordeklarierte globale Konstanten / Variablen). Sie können es tun, weil sie nur eine Architektur zum Ziel haben. Allzweck-C-Compiler zielen jedoch auf zu viele verschiedene Architekturen ab, um solche Erweiterungen sinnvoll zu machen. Daher implementieren sie normalerweise nur einen asm-Einbettungsmechanismus (außerdem würden sie dadurch nicht zum Standard werden)
slebetman
18

C ist eine Abstraktion des Maschinencodes, der auf der Maschine ausgeführt wird (obwohl viel näher als die meisten anderen Sprachen).

Für diese Dinge werden Maschinencode-Anweisungen, die nicht in C ausgedrückt werden können, und möglicherweise für die zusätzliche Optimierung, die von der C-Compiler-Assembly nicht bereitgestellt wird, hauptsächlich in Form eines Inline-Assemblers verwendet .

In der Kernel - Code Baum Quelle wird diese gespeichert unter arch/<arch>und include/asm-<arch>wo <arch>eine bestimmte Architektur Namen. Es ist eigentlich nur ein kleiner Teil der gesamten Kernelquelle.

jemand
quelle
6

Sie können dies nicht in C tun :)

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

Ich versuche, in den geschützten x86-Modus zu gelangen. Natürlich kann ich dies in C immer noch tun, indem ich rohe Maschinencodes "ausgebe", aber immer noch, falls ich auf präzise Offets zugreifen muss - meistens habe ich Pech.

Das zweite Beispiel ist BootLoader. Auf x86-Systemen muss der herkömmliche Startcode genau 512 Byte lang sein und die letzten beiden Byte müssen 0xAA und 0x55 (oder genau 55 AA) sein Arbeit auf eine fantastische Weise.

In vielen weiteren Fällen ist die Montage nicht nur vorzuziehen, sondern das einzige Mittel.

Krishna S Santosh
quelle
-5

asm ist schlanker und im Allgemeinen viel schneller als C, das mit Bibliotheken usw. überhäuft ist, und das Betriebssystem verarbeitet die ganze Zeit über VIELE Ereignisse. Sie wollen schlank und schnell für diese Funktion.

Escoce
quelle
2
Die Optimierung der C-Compilertechnologie ist ziemlich gut geworden. Es ist ein Mythos, dass asm im Allgemeinen viel schneller ist als C. Auf jeden Fall ist dies nicht der Grund, warum Betriebssystembetriebe auf niedriger Ebene asm verwenden. Dies hat hauptsächlich mit Operationen zu tun, die nicht in C ausgedrückt werden können, wie z. B. Speicherbarrieren, und es werden Tänze für Nicht-C-Aufrufkonventionen usw. registriert.
Celada