Die Hardware von printf verstehen

Lesezeit: 3 Minuten

Ich habe mich gefragt, ob online Ressourcen verfügbar sind, die erklären, was mit etwas passiert, wie printf von C, das erklärt, was auf der sehr niedrigen Ebene vor sich geht (BIOS/Kernel-Aufrufe).

Benutzeravatar von jschmier
jschmier

Linux:

printf() —> printf() in der C-Bibliothek —> write() in der C-Bibliothek —> write() Systemaufruf im Kernel.

Um die Schnittstelle zwischen User Space und Kernel Space zu verstehen, müssen Sie einige Kenntnisse darüber haben, wie Systemaufrufe arbeiten.

Um zu verstehen, was auf den untersten Ebenen vor sich geht, müssen Sie den Quellcode in der analysieren Kernel.

Der Schnellreferenz für Linux-Systemaufrufe (PDF-Link) kann nützlich sein, da er anzeigt, wo Sie in der Kernel-Quelle mit der Suche beginnen könnten.

  • Nachdem ich über die Antwort von Hostile Fork auf C/C++-Funktionsdefinitionen ohne Assembly gestolpert bin, denke ich, dass sie besser ist als meine eigene.

    – jschmier

    1. Februar 2011 um 21:03 Uhr

Etwas wie printf oder speziell printf? Das ist etwas vage.

printf gibt an den stdout FILE*-Stream aus; was damit verbunden ist, ist systemabhängig und kann darüber hinaus auf jedes andere Stream-Gerät umgeleitet werden, für das das Betriebssystem einen geeigneten Gerätetreiber bereitstellt. Ich arbeite in eingebetteten Systemen, und meistens wird stdout standardmäßig an einen UART für serielle E / A geleitet – häufig ist dies das einzige unterstützte Stream-E / A-Gerät und kann nicht umgeleitet werden. In einem GUI-Betriebssystem für Anwendungen im Konsolenmodus wird die Ausgabe grafisch in der systemdefinierten Terminalschriftart in ein Fenster „gezeichnet“, in Windows kann dies beispielsweise GDI- oder DirectDraw-Aufrufe umfassen, die wiederum auf den Gerätetreiber der Videohardware zugreifen. Auf einem modernen Desktop-Betriebssystem bezieht die Konsolenzeichenausgabe das BIOS überhaupt nicht mit ein, außer vielleicht anfänglichem Bootstrapping.

Kurz gesagt, zwischen einem printf()-Aufruf und der Hardware, auf der er ausgegeben wird, befindet sich normalerweise eine riesige Menge an Software.

Das ist sehr plattformspezifisch. Aus Hardware-Sicht könnte die Back-End-Implementierung von printf () an einen seriellen Anschluss, ein nicht serielles LCD usw. gerichtet werden. Sie stellen wirklich zwei Fragen:

  1. Wie interpretiert printf() Argumente und Formatstrings, um eine korrekte Ausgabe zu erzeugen?

  2. Wie gelangt die Ausgabe von printf() auf Ihr Zielgerät?

Sie müssen bedenken, dass Betriebssystem, Kernel und BIOS nicht erforderlich sind, damit eine Anwendung funktioniert. Eingebettete Apps verfügen normalerweise über printf() und andere IO-Routinen, die in einen Zeichenringpuffer schreiben. Ein Interrupt kann dann diesen Puffer abfragen und die Ausgabehardware (LCD, serielle Schnittstelle, Lasershow usw.) manipulieren, um die gepufferte Ausgabe an das richtige Ziel zu senden.

Per Definition sind BIOS- und Kernel-Aufrufe plattformspezifisch. Für welche Plattform interessieren Sie sich? Mehrere Links zu Linux-bezogenen Informationen wurden bereits gepostet.

Beachte das auch printf führt möglicherweise nicht einmal zu BIOS- oder Kernel-Aufrufen, da auf Ihrer Plattform möglicherweise kein Kernel oder BIOS vorhanden ist (eingebettete Systeme sind ein gutes Beispiel dafür).

printf() akzeptiert mehrere Argumente (Funktion für Argumente mit variabler Länge). Der Benutzer liefert eine Zeichenfolge und Eingabeargumente.

Die Funktion printf() erstellt einen internen Puffer zum Erstellen der Ausgabezeichenfolge. Jetzt durchläuft printf() jedes Zeichen der Benutzerzeichenfolge und kopiert das Zeichen in die Ausgabezeichenfolge. Printf() stoppt nur bei “%”.

“%” bedeutet, dass es ein zu konvertierendes Argument gibt (Argumente haben die Form char, int, long, float, double oder string). Es wandelt es in eine Zeichenfolge um und fügt es an den Ausgabepuffer an. Wenn das Argument eine Zeichenfolge ist, wird eine Zeichenfolge kopiert.

Schließlich kann printf() das Ende von user sting erreichen und den gesamten Puffer in die stdout-Datei kopieren.

1443990cookie-checkDie Hardware von printf verstehen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy