Detaillierte Erläuterung verschiedener Kommunikationswege zwischen Linux-Benutzerstatus und Kernelstatus

Detaillierte Erläuterung verschiedener Kommunikationswege zwischen Linux-Benutzerstatus und Kernelstatus

Aufgrund der Einschränkung der CPU-Berechtigungen ist die Kommunikation zwischen dem Linux-Benutzerstatus und dem Kernelstatus bei der Interprozesskommunikation nicht so einfach, wie man es sich vorstellt. Dieser Artikel befasst sich mit den Kommunikationsmethoden zwischen dem Linux-Benutzerstatus und dem Kernelstatus.

Wenn wir Code schreiben, greifen wir normalerweise über Systemaufruffunktionen im Benutzerbereich auf den Kernelbereich zu. Dies ist die am häufigsten verwendete Art der Kommunikation zwischen Benutzerbereich und Kernelbereich. (Weitere Informationen zum Linux-Benutzermodus und Kernelmodus finden Sie unter xx)

Darüber hinaus gibt es vier weitere Möglichkeiten:

  • procfs(/proc)
  • sysctl (/proc/sys)
  • sysfs(/sys)
  • Netlink-Buchse

procfs(/proc)

procfs ist die Abkürzung für Process File System. Es ist im Wesentlichen ein Pseudodateisystem. Warum wird es Pseudodateisystem genannt? Da es keinen externen Speicherplatz, sondern nur eine kleine Menge an Arbeitsspeicher beansprucht, wird es normalerweise im Verzeichnis /proc gemountet.

Eine Datei, die wir in diesem Verzeichnis sehen, ist tatsächlich eine Kernelvariable. Der Kernel verwendet dieses Verzeichnis, um seine internen Informationen in Form von Dateien anzuzeigen. Dies entspricht dem Verzeichnis /proc , das eine Brücke für die Interaktion zwischen Benutzerstatus und Kernelstatus bildet. Der Benutzerstatus liest und schreibt Dateien unter /proc , was bedeutet, dass kernelbezogene Konfigurationsparameter gelesen und geschrieben werden.

Beispielsweise stellen die gemeinsamen /proc/cpuinfo , /proc/meminfo und /proc/net jeweils relevante Parameter für CPU, Speicher und Netzwerk bereit. Darüber hinaus gibt es viele Parameter, wie unten gezeigt:

root@ubuntu:~# ls /proc/
1 1143 1345 1447 2 2292 29 331 393 44 63 70 76 acpi diskstats irq sperren sched_debug sysvipc zoneinfo
10 1145 1357 148 20 23 290 332 396 442 64 7019 77 asound dma kallsyms mdstat schedstat thread-selbst
1042 1149 1361 149 2084 2425 291 34 398 45 65 7029 8 Buddyinfo Treiber Kcore Meminfo SCSI Timer_Liste
1044 1150 1363 15 2087 25 3 3455 413 46 66 7079 83 Bus Execdomains Schlüssel Sonstiges Selbst Timer_Stats
1046 1151 1371 16 2090 256 30 35 418 47 6600 7080 884 cgroups fb Schlüsselbenutzer Module slabinfo tty
1048 1153 1372 17 21 26 302 36 419 5 67 71 9 cmdline Dateisysteme kmsg mountet softirqs Betriebszeit
11 1190 1390 18 22 27 31 37 420 518 6749 72 96 Konsolen fs kpagecgroup mtrr stat Version
1126 12 143 182 2214 28 32 373 421 524 68 73 97 CPU-Info Interrupts Kpagecount Net Swaps Versionssignatur
1137 1252 1434 184 2215 280 327 38 422 525 69 74 98 Krypto iomem kpageflags pagetypeinfo sys vmallocinfo
1141 13 144 190 2262 281 33 39 425 5940 7 75 985 Geräte ioports loadavg Partitionen sysrq-trigger vmstat

Wie Sie sehen, gibt es viele Dateien, die durch Zahlen dargestellt werden. Dabei handelt es sich eigentlich um die Prozessdateien, die im aktuellen System ausgeführt werden. Die Zahlen stellen die Prozess-ID (PID) dar. Jede Datei enthält alle Konfigurationsinformationen des Prozesses, einschließlich Prozessstatus, Dateideskriptoren, Speicherzuordnung usw. Werfen wir einen Blick darauf:

root@ubuntu:~# ls /proc/1/
attr/ cmdline environ io mem ns/ pagemap schedstat stat timer
Autogruppierung, Komm, Exe, Grenzwerte, Mountinfo, Numa_Maps, Persönlichkeit, Sitzungs-ID, Statm, Uid_Map
auxv coredump_filter fd/ loginuid mounts oom_adj projid_map setgroups status wchan
cgroup cpuset fdinfo/ map_files/ mountstats oom_score root/ smaps syscall     
clear_refs cwd/ gid_map Karten net/ oom_score_adj sched Stapel Aufgabe/

Zusammenfassend lässt sich sagen, dass der Kernel seine Systemkonfigurationsinformationen nacheinander in Dateien verfügbar macht. Einige dieser Dateien sind schreibgeschützt, andere beschreibbar und wieder andere ändern sich dynamisch. Wenn eine Anwendung beispielsweise eine /proc/ -Datei liest, registriert der Kernel die Datei und ruft dann eine Reihe von Kernelfunktionen auf, um sie zu verarbeiten. Dabei werden die entsprechenden Kernelparameter in den Benutzerbereich kopiert, sodass der Benutzer die Kernelinformationen durch Lesen der Datei abrufen kann. Nachfolgend sehen Sie ein grobes Diagramm:

sysctl

Das uns bekannte sysctl ist ein Linux-Befehl. Seine Funktionen und Verwendung können Sie man sysctl sehen. Es wird hauptsächlich zum Ändern der Laufzeitparameter des Kernels verwendet. Mit anderen Worten, es kann die Kernelparameter dynamisch ändern, während der Kernel ausgeführt wird.

Es verwendet im Wesentlichen immer noch Dateilese- und -schreibvorgänge, um die Kommunikation zwischen Benutzermodus und Kernelmodus abzuschließen. Es verwendet ein Unterverzeichnis von /proc /proc/sys . Der Unterschied zu procfs ist:

procfs gibt hauptsächlich schreibgeschützte Daten aus, während die meisten von sysctl ausgegebenen Informationen schreibbar sind.

Beispielsweise verwenden wir normalerweise cat /proc/sys/net/ipv4/ip_forward um zu ermitteln, ob die Kernel-Netzwerkschicht die Weiterleitung von IP-Paketen zulässt, und verwenden echo 1 > /proc/sys/net/ipv4/ip_forward oder sysctl -w net.ipv4.ip_forward=1 um die Kernel-Netzwerkschicht so einzustellen, dass die Weiterleitung von IP-Paketen zulässig ist.

Für denselben Vorgang stellt Linux auch die Datei /etc/sysctl.conf bereit, damit Sie Stapeländerungen vornehmen können.

sysfs

Sysfs ist ein virtuelles Dateisystem, das in Linux 2.6 eingeführt wurde. Es verwendet auch die Datei /sys um die Kommunikation zwischen Benutzermodus und Kernel abzuschließen. Im Gegensatz zu procfs trennt sysfs einige der Geräte und Treiber, die ursprünglich in procfs waren, und präsentiert sie dem Benutzer in Form eines „Gerätebaums“.

Sysfs kann nicht nur Geräte- und Treiberinformationen aus dem Kernelspeicher lesen, sondern auch Geräte und Treiber konfigurieren.

Sehen wir uns an, was sich unter /sys befindet:

# ls /sys
Block Bus Klasse Dev Geräte Firmware FS Hypervisor Kernel Modul Leistung

Es ist ersichtlich, dass diese Dateien grundsätzlich eng mit den Geräten und Treibern des Computers zusammenhängen. Die genaue Bedeutung dieser Dateien können Sie selbst herausfinden, daher werde ich hier nicht näher darauf eingehen.

Netzlink

Netlink ist die am häufigsten verwendete Methode zur Kommunikation zwischen dem Linux-Benutzermodus und dem Kernelmodus. Unterstützung ist erst ab Linux-Kernel 2.6.14 verfügbar. Es handelt sich im Wesentlichen um einen Socket, und die von regulären Sockets verwendete Standard-API gilt auch für ihn. Um beispielsweise einen Netlink-Socket zu erstellen, können Sie die folgende Socket-Funktion aufrufen:

#include <asm/types.h>
#include <sys/socket.h>
#include <linux/netlink.h>

netlink_socket = Socket (AF_NETLINK, Sockettyp, Netlink-Familie);

Der flexible Ansatz von Netlink ermöglicht die Verwendung in Nachrichtenübermittlungssystemen zwischen dem Kernel und verschiedenen Benutzerprozessen, wie etwa Routing-Subsystemen, Firewalls (Netfilter), IPSec-Sicherheitsrichtlinien usw.

Verlängerung:

net-tools greift auf die Netzwerkparameterkonfiguration des Kernels zu und ändert diese über procfs (/proc) und ioctl-Systemaufrufe, während iproute2 über die Netlink-Socket-Schnittstelle mit dem Kernel kommuniziert. Ersteres wurde eliminiert und Letzteres hat sich allmählich zum Standard entwickelt.

Zusammenfassen

Für die Kommunikation zwischen dem Linux-Benutzermodus und dem Kernelmodus gibt es vier Hauptwege, von denen Netlink und Procfs die gängigsten sind.

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

<<:  Detaillierte Erläuterung der Deep Copy und Shallow Copy im JS-Variablenspeicher

>>:  C# implementiert MySQL-Befehlszeilensicherung und -wiederherstellung

Artikel empfehlen

Detaillierte Erläuterung der Systemeingabe- und -ausgabeverwaltung in Linux

Verwaltung der Ein- und Ausgaben im System 1. Ver...

Lösung für zu große Mysql-Binlog-Protokolldateien

Inhaltsverzeichnis 1. Verwandte Binlog-Konfigurat...

Eine kurze Diskussion über die Verwendung und Analyse von Nofollow-Tags

Kontroverse um Nofollow Zwischen Zac und Guoping ...

Lösung für die Upload-Einschränkung von Element-ui-Uploaddateien

Frage Die Angabe des Typs der hochgeladenen Datei...

JavaScript zur Implementierung des Flugzeugkriegsspiels

In diesem Artikel erfahren Sie, wie Sie mit Canva...

Spezifische Schritte zur Verwendung des Vant-Frameworks im WeChat-Applet

Inhaltsverzeichnis 1. Öffnen Sie das Projektverze...

JavaScript zur Implementierung der Schaltfläche „Zurück nach oben“

In diesem Artikel wird der spezifische Code für J...

Teilen Sie 5 hilfreiche CSS-Selektoren, um Ihr CSS-Erlebnis zu bereichern

Dank unserer umfassenden CSS-Erfahrung als Webdesi...

So bewerben Sie sich für Webdesign-Jobs

<br />Hallo zusammen! Es ist mir eine Ehre, ...

Lösung für Nginx-Installationsfehler

1. Entpacken Sie nginx-1.8.1.tar.gz 2. Entpacken ...

So ändern Sie das Root-Passwort von MySQL in Docker

Der erste Schritt besteht darin, einen MySQL-Cont...

Grafisches Tutorial zur Installation und Konfiguration von MySQL 8.0.22

Installation und Konfiguration von MySQL8.0.22 (s...