Wenn wir sendmsg API-Aufruf von Benutzerprozess aufrufen, wird die Eingabefunktion aufgerufen und wir haben eine Nachricht an den Kernel gesendet. Ok, aber wenn wir recvmsg API-Aufruf aufrufen, wird die Eingabefunktion erneut aufgerufen? Ich habe das am Beispiel gesehen, das ich nicht kommentieren kann, weil ich keinen Ruf habe. Titel dieses Beitrags ist: "Wie netlink Socket verwenden, um mit einem Kernelmodul zu kommunizieren?" Könnte also jemand dieses Beispiel sehen und mir sagen, wie man zwischen dem Schreiben in den Kernel-Socket und dem Lesen unterscheidet?NETLINK Eingabefunktion im Kernel
Antwort
Warum sollte die Eingabefunktion erneut aufgerufen werden? sendmsg()
sendet und recvmsg()
empfängt. Die hello_nl_recv_msg()
wird nur ausgeführt, wenn das Kernelmodul eine Nachricht empfängt.
In diesem Beispiel sendet das Programm UserSpace die Nachricht A mit der Funktion sendmsg()
an den Kernel.
Nachricht Eine kommt zum Kernel. Der Kernel ruft hello_nl_recv_msg()
auf. Nachricht Eine ist in dem Argument skb
eingekapselt.
Das Kernel-Modul sendet eine Antwort an den Prozess, dessen Prozess-ID skb
lautet. Er erstellt eine Nachricht B. Das Kernelmodul sendet die Nachricht B mit der Funktion nlmsg_unicast()
an den Benutzerbereich.
Nachricht B erscheint im Benutzerbereich während der recvmsg()
-Funktion. (Weil die Prozess-ID des Userspace-Programms dieselbe ist, an die das Kernel-Modul geschrieben hat.)
recvmsg()
schläft, bis eine Nachricht an den Kernel empfangen wird, damit Sie sich keine Sorgen machen müssen, ob der Kernel bereits geantwortet hat oder nicht bevor Sie diese Funktion aufrufen.
- 1. Wie erkennt Kernel das Vorhandensein von Netlink im Userspace?
- 2. Abrufen nicht ausgerichteter Netlink-Nachrichtengröße im Kernel-Bereich
- 3. Netlink User-Space und Kernel-Space-Kommunikation
- 4. Linux Kernel Generisches Netlink - Ist es gleichzeitig?
- 5. Unterstützt Libevent Netlink-Socket
- 6. der virtuelle Maschine und die Kernel-Kommunikation über netlink
- 7. Wie erstelle ich einen "netlink" zwischen Kernel und Userspace?
- 8. Netlink Sockets in C den 3.X Linux-Kernel
- 9. VLAN-Informationen mit NETLINK
- 10. Linux netlink mutlicast Routing-Updates
- 11. Verwendet jemand Netlink für IPC?
- 12. Wie schreibe ich Pakete im Kernel-Bereich
- 13. Wie eine mit Eingabefunktion
- 14. Eingabefunktion innerhalb While-Schleife
- 15. Ist Netlink das Medium für Syscall-Ereignisse?
- 16. malloc im Kernel
- 17. Ioremaped Adresse im Kernel
- 18. cublasSgetrsBatched Fehler im Kernel
- 19. Integerüberlauf im Kernel - möglich?
- 20. GMP im Kernel Modul
- 21. Interrupts im Linux-Kernel verfolgen
- 22. Wie schlafen im Linux-Kernel?
- 23. Zufallszahl im Kernel-Modul erzeugen
- 24. Zeitmessung im Linux Kernel 2.6
- 25. strerror-ähnliche Funktionalität im Kernel?
- 26. stdlib.h Alternative im Linux-Kernel?
- 27. Aktiviere DRM_KMS_CMA_HELPER im Linux Kernel
- 28. Ist malloc() im Kernel-Bereich?
- 29. Warum wird Kernel im maschinellen Lernen als Kernel-Funktion bezeichnet?
- 30. Nicht im Kernel-Speicher schreiben über Linux Kernel-Modul (Ubuntu)
Ok, wenn wir sendmsg API-Aufruf aufrufen, heißt das, dass wir auch nlmsg_unicast() aufgerufen haben, also werden wir beim nächsten Aufruf von recvmsg() die Nachricht vom Kernel bekommen. Das ist der Punkt? – Bratic