Linux -Kernel -API

Linux -Kernel -API
Wir werden die Linux Application Programming Interface, die API, durchlaufen. Linux -Kernel stellt die Systemaufrufe zur Verfügung, mit denen die Aufgabe über den Kernel erledigt werden kann. Lassen Sie uns die wenigen, weit verbreiteten Systemaufrufe von Linux diskutieren.

Beschreibung:

Linux -Kernel stellt den Satz oder die Liste der Funktionen zur Verfügung, die von den User Space -Programmen verwendet werden können.

Das Blockdiagramm sieht aus wie folgt:

Einige der wenigen weit verbreiteten Systemaufrufe sind geöffnet, schließen, lesen und schreiben. Dies sind grundlegende Systemaufrufe von Linux Kernel. Jede Aufgabe erfolgt über die Datei unter Linux. Die grundlegenden Vorgänge in jeder Datei können also durch Open, Schließen, Lesen und Schreiben durchgeführt werden.

Nehmen wir ein echtes Beispiel, in dem wir die „Hello -Welt“ auf der Serienkonsole drucken möchten. Um diese Aufgabe durch Systemaufrufe zu erreichen, müssen wir die Gerätedatei für die Konsole in /dev öffnen. Sobald wir die Gerätedatei für Konsole oder UART suchen, können wir den Open -System -Aufruf zum Öffnen des Geräts verwenden.

Hier ist die Syntax des offenen Systemaufrufs:

int offen (const char *pathname, int flags);
int open (const char *pathname, int flags, modus_t modus);

Aus dieser Syntax ist das erste Argument der Dateipfad, den wir öffnen möchten. In unserem Fall ist es die Gerätedatei, die wir als Konsolengerät gefunden haben. Im nächsten Argument bieten die Flags dem Benutzer eine gewisse Flexibilität, mit der Datei zu spielen. Nur wenige Beispiele für die Flags sind o_creat, o_append usw. Diese Flaggen haben spezifische Bedeutungen und Zwecke, und die Diskussion ist aus dem Rahmen dieser Diskussion heraus. Weitere Informationen zu den Flaggen und Parametern finden Sie auf den Kernel -Man -Seiten.

Sobald die Datei erfolgreich geöffnet ist, müssen wir den Schreibsystem -Anruf verwenden, um die „Hallo Welt“ an das Konsolengerät zu senden. Der Prototyp des Schreibsystemaufrufs lautet wie folgt:

ssize_t write (int fd, const void *buf, size_t count);

Der erste Parameter des Schreibsystemaufrufs ist die FD, die der Dateibeschreibung ist. Das „FD“ wird uns durch den Aufruf offener Systems gegeben. Nachdem wir die Datei erfolgreich geöffnet haben, sollten wir den Dateideskriptor erhalten. Diese FD wird weiter verwendet, um die Daten zu schreiben.

Der zweite Parameter ist die Pufferadresse, damit die Daten an das Konsolengerät gesendet werden sollen. In unserem Fall sind die Testdaten "Hello World".

Der letzte Parameter ist die Gesamtzahl der Bytes, die der Benutzer an das Konsolengerät schreiben möchte. In unserem Fall ist die Anzahl der Bytes die Größe von „Hello World“. Wir können entweder den Größe des Operators oder die Strlen -Funktion verwenden, um die Anzahl der Bytes zu erhalten. Wir sollten vorsichtig sein, während wir den Strlen benutzen. Diese Funktion ignoriert das Zeichenfolge -Terminator -Zeichen wie "\ 0". Wenn wir also die Saite lesen, müssen wir sicherstellen, dass der Nullcharakter richtig behandelt wird. Andernfalls haben wir den Segmentierungsfehler.

Lassen Sie uns nun den Code -Teil dieses Beispiels implementieren. Zuerst müssen wir die Serienkonsole oder das UART -Gerät finden. In der Maschine hat das, was wir verwenden, das serielle TTY -Gerät als/dev/pts/0. Wie erläutert müssen wir diese Datei zuerst öffnen. Wir müssen auch die härtere Datei einbeziehen, die die Erklärung des offenen Systemaufrufs angibt.

Unser Code zum Öffnen der Gerätedatei sieht wie folgt aus:

#enthalten
fd = open ("/dev/pts/0", o_wronly);

Wenn wir als nächstes den Schreibsystem Anruf aufrufen möchten, verwenden wir die vom Open bereitgestellte FD. Unser Aufruf zur Schreibfunktion sieht wie folgt aus:

#enthalten
char *data = "Hallo Welt";
Schreiben (FD, Daten, Strlen (Daten) +1);

Der vorherige Code -Snippet schreibt die „Hello -Welt“ in die serielle Konsole, die wir gefunden haben und die wir schreiben möchten.

Lassen Sie uns alle Teile zusammenfügen:

#enthalten
#enthalten
#enthalten
#enthalten
#enthalten
int main ()

int fd; int rc;
char *data = "Hallo Welt";
fd = open ("/dev/pts/0", o_wronly);
if (fd<0)

printf („Fehleröffnungsdatei:%d“, FD);
exit (-1);

RC = Write (FD, Daten, Strlen (Daten) +1);
if (rc<0)

printf („Fehlerschreibdatei:%d“, RC);
exit (-1);

schließen (fd); // Die Dateioperation erfolgt, schließen Sie die Datei.
Rückkehr 0;

Das Kompilieren des vorherigen Programms entspricht dem Zusammenstellen der anderen C -Programme wie folgt:

GCC test_write.c -o test_write.

Das test_write.C ist der Dateiname für unseren C -Code.

Nach der Zusammenstellung erhalten wir die ausführbare Datei mit dem Namen test_write.

Siehe folgende Snapshot:

Nach dem Ausführen des kompilierten und erzeugten Binärs haben wir die folgende Ausgabe.

Unser Programmausgang wird in fetten Buchstaben hervorgehoben. Das Folgende ist der Schnappschuss als Referenz:

Bisher haben wir ein Beispiel gesehen, bei dem wir die Linux -API verwenden, um die Testzeichenfolge auf der Konsole anzuzeigen. Dies ist das einfache Beispiel. Es gibt viele andere Angebote, die vom Systemanruf bereitgestellt werden. Nur wenige Systemanrufe, die von Linux bereitgestellt werden, sind wie folgt:

  • lesen: Lesen aus der Datei.
  • schreiben: Schreiben in die Datei.
  • offen: Öffnen der Datei.
  • schließen: Schließen der Datei.
  • Umfrage: Abfragen des Geräts für die Änderung des Zustands.
  • lseek: Suche nach einem bestimmten Offset in der Datei.
  • MMAP: Zuordnen des virtuellen Gedächtnisses in das physische Gedächtnis zuordnen.
  • BRK: Ändern Sie die Segmentgröße.
  • ioctl: Steuerelemente.
  • Zugang: Zugriff, um die Dateiberechtigungen zu erhalten.
  • Rohr: Bezieht sich auf die Rohrerstellung.

und viele mehr.

Dies ist die riesige Liste der von Linux Kernel bereitgestellten Funktionen. Wir haben nur sehr wenige gesehen und besprochen. In der Kernelquelle finden Sie die vollständige Liste der Systemanrufe, die vom Kernel bereitgestellt werden.

Abschluss

Wir haben über die Systemanrufe besprochen, was ein Weg ist, den Kernel zu bitten, die Aufgaben für die Benutzerraumprogramme auszuführen. Ohne den Systemanruf ist es nicht möglich, dass die Benutzerraumprogramme die Aufgabe des Kernels erledigen. Wir haben eine einfache Aufgabe oder ein Beispiel für das Schreiben der Testdaten „Hallo Welt“ auf das serielle Gerät aufgenommen. Wir haben die Open, schreiben und schließen die API des Kernels, um die Aufgabe in der Hand zu erledigen. Eine wichtige Sache ist, den Rückgabewert des Systems zu überprüfen. Kernel liefert die ordnungsgemäßen Rückgaberichte, um den Grund für den Fall des Funktionsfehlers zu erklären. Der Benutzer kann die Idee zum Ausfallgrund erhalten, indem er die Rückgabewerte aus dem Systemaufruf ansieht. Rückgabewerte haben eine bestimmte Bedeutung und sind in der Kernel-Dokumentation gut erfasst.