2016-08-17 3 views
0

Wenn ich einen Gerätetreiber schreibe, verwende ich die Funktion device_create(), die eine Datei in/dev erstellt, die mit den Funktionen verknüpft ist, die über Fops registriert sind.Kann ich Dateiberechtigungen innerhalb eines Programms ändern?

Das Problem ist, sobald ich dieses Modul insmod, kann ich nicht fprintf in die/dev-Datei schreiben. Ein Seitenbereichsfehler tritt auf. Ich kann immer noch in eine normale Datei schreiben, also stelle ich mir vor, dass ich keine Berechtigung habe, in/dev in die Datei zu schreiben. Gibt es irgendetwas, was ich tun kann, um die Datei beim Aufruf von device_create() innerhalb des Kernelmoduls beschreibbar zu machen, so dass ich sie nicht extern einstellen müsste?

Antwort

1

Wenn ich dieses Recht gelesen habe, haben Sie ein Userspace-Programm tun fopen + fprintf auf einer Gerätedatei von unterstützt Ihr benutzerdefinierter Treiber Bei der Verwendung stürzt der Kernel ab.

Zunächst ist die Verwendung der FILE-Abstraktion (angegeben mit fopen und fprintf) extrem flüchtig, wenn sie auf Gerätetreiber angewendet wird. Da es eine interne Pufferung durchführt, wissen Sie nie genau, welche Daten den Treiber tatsächlich treffen und in welchen Teilen. Verwenden Sie stattdessen direkt die Standarddateideskriptoren (open + write).

Jetzt kann der Verdacht, dass es ein Genehmigungsproblem gibt, nicht richtig sein. Wenn die Open-Routine Ihres Treibers erreicht ist, hat der Kernel bereits festgestellt, dass Sie über die erforderlichen Berechtigungen verfügen. Wenn die Schreibroutine erreicht ist, wurde die Datei bereits geöffnet. Daher wissen wir, dass Sie über die entsprechenden Berechtigungen verfügen. Aber selbst wenn es ein Berechtigungsproblem irgendeiner Art gab, ist ein Seitendomänenfehler definitiv nicht gültig für den Kernel als Antwort.

Angesichts der Qualität der Frage würde ich argumentieren, Sie sind zu neu zu programmieren, um mit diesem Zeug zu spielen und würde empfehlen, vorläufig auf Userspace zu bleiben.

+0

Ich stimme nicht besonders mit der Denkweise überein, Leuten zu sagen, dass sie nicht versuchen sollen, Dinge zu lernen, aber danke für die Antwort. – Zephyr

+0

Ich sage dir nicht, dass du nichts lernen sollst, ich sage dir, dass du in der richtigen Reihenfolge lernen sollst. Userspace-Programme sind einfacher zu schreiben und leichter zu debuggen. Wenn Sie in diesem Stadium mit dem Kernel spielen, machen Sie sich unnötig schwer. –

0

Werfen Sie einen Blick auf init/initramfs.c, wo es Beispielanwendungen von syscalls durch den Kernel gibt. Fügen Sie linux/syscalls.h hinzu und verwenden Sie einfach sys_chmod. Es funktioniert wie die Userspace-Variante. Dies kann auf so ziemlich jeden Systemaufruf angewendet werden. (Nicht dass es eine gute Idee ist, socket im Kernel zu verwenden)

+0

Ich habe nie einen Kernel-Treiber geschrieben, also konnte ich nicht sagen, ob das eine gute Lösung ist, aber es sieht OK aus. Mein Hauptproblem ist der Mangel an Details. Eine Bezugnahme auf den Quellcode wäre für weitere Details angebracht, aber Sie sollten zumindest einen Überblick darüber geben, was dort zu finden wäre. –

Verwandte Themen