2016-04-01 9 views
0

So habe ich eine Reihe von Fragen über das Hinzufügen von Systemaufrufen gesehen, aber ich kann keine Beispiele finden, die ein LKM verwenden, das funktioniert. Ich habe Ressourcen wie folgt gefunden: http://tldp.org/LDP/lkmpg/2.6/html/ Dies funktioniert in der Theorie, aber nicht kompilieren. Kann jemand mich auf ein einfaches Beispiel für das Hinzufügen eines Hallo Welt Systemaufrufs oder etwas hinweisen. Etwas wie dieses: https://tssurya.wordpress.com/2014/08/19/adding-a-hello-world-system-call-to-linux-kernel-3-16-0/ das erfordert nicht, dass ich meinen Kern neu kompiliere?Hinzufügen eines Systemaufrufs mit einem Kernel-Modul (LKM)

Antwort

1

Im Allgemeinen wird dringend empfohlen, nicht implementieren einen ganz neuen Systemaufruf.

Stattdessen nur ein neues ioctl und wahrscheinlich einige neue Block- oder Zeichengeräte implementieren.

Denn wie dass zu tun, es sieht aus wie es eine andere Frage/Antwort bereits: How do I use ioctl() to manipulate my kernel module?

+0

Ich nehme nicht an, dass Sie etwas Intuition haben, wie man diese Dinge benutzt? Ich fand ein Beispiel: http://www.tldp.org/LDP/lkmpg/2.6/html/x892.html, aber ich bin nicht sicher, wie Sie die ioctls verwenden würden. Sie können also den Gerätetreiber lesen und dann davon lesen, indem Sie ihn angeben. Was machst du mit dem ioctl? – BashOverride

+0

Ich denke, ich sollte meine Frage eigentlich neu definieren. Angenommen, ich möchte einen Systemaufruf hinzufügen, der Daten zu einem gerade laufenden Prozess zurückgibt. Also würde ich es eine pid übergeben und es würde Dinge wie diese Eltern-PID, Startzeit usw. zurückgeben. Würde das ioctl nur eine Lektüre nennen, die diese Info finden würde? Oder was? Es fällt mir schwer zu verstehen, wie dieses Setup funktionieren würde. – BashOverride

0

Ich glaube nicht, dass Sie mit einem Modul tun. Die Definitionen des Syscall gehen an zwei Stellen, die zur Laufzeit (soweit ich weiß) nicht wirklich geändert werden können: syscall table (die Nummern pro Architektur zuweist) und syscalls include file (installiert mit dem Kernel selbst, nicht mit Modulen). (Oder zumindest nicht ohne Code-Umschreiben zur Laufzeit zu stören.)

Sie müssen immer in diesem Fall den Kernel neu kompilieren. Wenn Sie jedoch einen schnellen Aktualisierungs-/Wiederholungszyklus durchführen möchten, können Sie einen Syscall implementieren, der nur ein Stub ist und eine Nachricht an das richtige Modul weitergibt, wenn es geladen ist. Dadurch können Sie die Implementierung ändern, nicht jedoch die Signatur.