Netlink -Familien
Der NetLink -Clan bestimmt das Kernel -Paket oder den NetLink -Set für die Kommunikation. Die vorhandenen Netlink -Familien sind Folgendes:
Die Schnittstelle NetLink ist nicht vertrauenswürdig. Es bemüht sich, die Informationen an seine beabsichtigten Empfänger zu liefern. Wenn jedoch ein Speicherproblem oder ein anderer Fehler auftritt, kann dies die Kommunikation verlieren. Durch Aktivieren des NLM -F -ACK. NLMSG -Fehlerpakete mit dem auf 0 festgelegten Fehlerfeld sind Bestätigungen. Die Anerkennung für die empfangenen Nachrichten sollten vom Programm selbst erstellt werden.
Für jedes fallengelassene Paket versucht der Kernel, eine NLMSG -Fehlerantwort zu geben. Dieses Muster sollte auch von den Benutzerprozessen folgen. In jedem Fall ist es schwierig, die Daten aus dem Kernel vertrauenswürdig an den Benutzer zu übermitteln.
Wenn der Socket-Speicher gefüllt ist, kann der Kernel keine NetLink-Nachricht übertragen, da die Informationen verloren gehen und der Kern mit seinem Benutzer-Raum-Betrieb nicht mehr den gleichen Begriff des Status des Kerns teilen würde. Die App ist dafür verantwortlich.
Beispiel:
Wir werden ein Programm diskutieren, um die NetLink () -Funktion für die Kommunikation zwischen dem Kernel und den normalen Systemen zu verwenden. Zunächst werfen wir einen Blick auf die Benutzerseite dieses Programms. Dafür müssen wir den Hauptbuchsen und die NetLink -Header im Code hinzufügen, um die Sockets im C -Programm zusammen mit der Netlink () -Funktion zu verwenden, i.e. "Steckdose.H ”und„ NetLink.H".
Danach setzen wir die maximale Nutzlastgröße auf 1024 und legen die definierenden Strukturen fest, ich.e. SOCKADDR_NL, src_adr, dest_adr. Die Nullstruktur "NLMSGHDR" ist auch mit "*nl" und iovec -Struktur definiert. Die main () -Funktion wird mit der Erstellung einer Sockel mit der Funktion „Socket“ gestartet. Diese Funktion enthält den Namen PF_NetLink Domain für den Socket und den Sock_raw -Socket -Typ. Das NetLink_test -Socket -Protokoll ist in den Parametern der Socket -Funktion definiert.
Die Funktion memset () wird verwendet, um auf den Block "src_adr" des Strukturspeichers zu verweisen, in dem der Wert 0 auf mehrere Bytes gesetzt ist, die die Struktur "Src_adr" enthält. Mit der SRC_ADR -Struktur setzen wir die Familie, die Prozess -ID und die Gruppen des jeweiligen Sockets auf AF_NetLink, Self Process ID bzw. 0. Ähnlich wie bei einer TCP/IP -Verbindung ist der festgelegte Socket über die NetLink Bind () -Funktion mit einer lokalen IP (Origin) -Kinneziell -IP verknüpft. Die Funktion memset () wird erneut verwendet, um auf den Block „dest_adr“ des Strukturspeichers zu verweisen, in dem der Wert 0 auf mehrere Bytes eingestellt ist, die die Zielstruktur enthält.
Mit der Dest_adr -Struktur weisen wir die Familie, die Prozess -ID und die Gruppen für den jeweiligen Zielsocket AF_NetLink, 0 Prozess -ID bzw. 0 Gruppen zu. Mit der MALCOC () -Funktion weisen wir den dynamischen Speicher „NLMSGHDR“ zu und speichern das Rückgabeergebnis, i, i.e. erfolgreich oder nicht. Der Nullstrukturzeiger „NL“ zeigt auf die Nachrichtenlänge, die Prozess -ID und die Flag -0, um den NetLink -Nachrichtenheader zu füllen. Die Funktion von Strcpy () ist hier, um die Zeichenfolge in der Null -Zeigerstruktur „NL“ zu kopieren.
Daher besteht die Kommunikationsnutzlast plus NLMSGHDR eine NetLink -Nachricht aus. Wenn eine Kommunikation empfangen wird, geht sie in den Puffer, auf den der NL -Zeiger zeigt. Wir können die aktualisierte Nachricht auch an die Struktur MSGHDR "MSG" senden. Der Strukturzeiger „NL“ kann die Nachricht aus dem Kernel lesen und über die Verwendung der Funktion nlmsg_data () auf der Shell anstellen.
Zuletzt wird der NetLink Socket Descriptor verwendet, um die NetLink Socket zu schließen.
Innerhalb des Kernel -Programmraums erstellen wir zusammen mit seinem Zeiger "*nl_sk" eine Nullstruktur „Sock“, die "*nl_sk". Die Funktion nl_data_ready () verwendet diese Struktur und eine gewisse Länge, um sie aufzuwecken und die Daten nach einem Schlaf fertig zu machen. Die Funktion netlink_test () ist hier, um auf eine Nachricht zu warten, die vom Benutzerraum zum Kernel abfällt, und sie ausdrucken. Am Ende setzt der Kernel -Raum die Steckdose frei.
Das „Hallo du!Die Nachricht wird auf unserem Bildschirm nach der Ausführung dieses Beispiels angezeigt.
Abschluss
Hier geht. Wir haben ihre Verwendung besprochen, indem wir eine Nachricht vom Benutzerraum an den entsprechenden Kernelraum gesendet haben. Der Beispielcode dieses Artikels kann in jedem Compiler implementiert werden.