Ich schreibe Kernel-Modul (C in Linux) und ich möchte die Berechtigung der anderen Dateien darin ändern. irgendeine Lösungsmöglichkeit? seit ich im Kernel bin, kann ich chmod syscall nicht benutzen und ... Danke für deine Hilfe
Das ist mein Makefile:
%Vor%Und das ist mein Code:
%Vor%Beim Erstellen gibt es eine Warnung:
WARNING: "sys_chmod" [file] undefiened
und beim Laden des Moduls mit "sudo insmod" gibt es diesen Fehler:
Unknown sybol in module
Es scheint, dass dieser Fehler besonders in Kernel-Modulen auftritt. irgendeine Idee? Nochmals vielen Dank!
Die Systemaufrufe sind keine exportierten Symbole. Sie müssen ein bisschen hacken, wenn Sie sie wollen.
Sie möchten Ihre Finger auf sys_call_table
setzen. Es enthält einen Zeiger auf jeden Systemaufruf.
Betrachten Sie arch/x86/kernel/syscall_table_32.S
oder arch/i386/kernel/entry.S
für ältere Kernel.
Sie können grep sys_call_table /usr/src/linux/System.map
(oder /proc/kallsyms
, wenn die Symbole exportiert werden), um die Basisadresse dieser Tabelle zu finden.
Sie können diese Adresse als Parameter für Ihr Modul haben (das Konvertieren einer Hex-Zeichenfolge in einen Zeiger wird benötigt).
Sie können den richtigen syscall mit dem in arch/x86/include/asm/unistd_32.h
(oder include/asm-i386/unistd.h
für ältere Kernel) definierten Offset aufrufen.
Sie erhalten etwas wie: #define __NR_chmod 15
Makros sind hilfreich:
%Vor%Vergessen Sie außerdem nicht, das Datensegment zu ändern, wenn Sie den Kernel-Puffer (für den Dateinamen für Beispiele) übergeben, der Benutzerpuffer sein soll:
%Vor% Willkommen bei stackoverflow! IIRC Sie möchten sys_chmod()
Aus der Linux-Kernel-Mailing-Liste
Am Donnerstag, den 20. Februar 2003 um 11:10:27 Uhr +0100 schrieb Andrea Arcangeli: Am 20. Februar 2003 um 12:40:43 Uhr -0500 schrieb Jeff Garzik:
Am Donnerstag, den 20. Februar 2003 um 11:04:37 Uhr +0530 schrieb Prasad:
Gibt es einen Weg, mit dem ich einen Systemaufruf im Kernel aufrufen könnte Raum? Der Syscall soll als anderer Prozess getarnt ausgeführt werden. Das tatsächliche
Rufen Sie sys_whatever () auf. Sehen Sie sich den Kernel-Code für Beispiele an.
Der Kernel tut dies bereits in verschiedene Orte. sys_read, sys_write, open_filp, sys_close und andere Funktionen können vom Kernel aus sicher aufgerufen werden Code - obwohl dies nicht erwünscht ist. init / do_mounts.c ist ein besonders ärgerlicher Fall, und ist ein großer Grund, warum klibc muss zusammengeführt werden. syscalls sollte aus dem Userspace gemacht werden, nicht aus dem Kernel.
Die Leute fangen an, sich Sorgen zu machen, da dies nicht die Art von Sache ist, die Sie im Kernel tun könnten (es sei denn, Sie benutzen Sie, Sie wissen, was Sie tun). Wenn Sie nur die Berechtigungen für ein bestimmtes Ereignis ändern möchten, tun Sie dies über den Benutzerbereich mit inotify oder ähnlichem.
Haftungsausschluss beiseite:
Hier ist ein Code, den ich in einem anderen Kernelmodul gefunden habe, das die Aufrufe sys_ * verwendet:
%Vor%Auch gefunden:
%Vor% in include/linux/syscalls.h
Wohlgemerkt, es ist eine Weile her, seit ich irgendwelche Kernel-Sachen gemacht habe. Überprüfen Sie , dass dies die geeignete Schnittstelle für chmod-Kram ist und dass Sie keinen anderen Aufruf abkürzen, der beispielsweise Sicherheitshaken implementiert.
Auch Dieser Link enthält Informationen zu syscalls und deren Symbolen. Auch Hier ist eine Kurzreferenz von User-Space-API-Systemaufrufen und wo sie im Kernel implementiert sind.
Tags und Links c linux kernel-module file-permissions