Hallo,
ich habe ein Linux Kernel Module mit insmod geladen.
Es handelt sich um ein HelloWorld, dass ich mit 'cat /dev/hello'
ansprechen will.
Auf dem kleinen embedded Linux habe ich allerdings kein udev, dh. ich
muss 'mknod' zum Erzeugen von /dev/hello verwenden.
Frage: Auf welche der folgenden Dateien soll ich mknod anwenden?
Na gut, dann bleibt die Frage, woher ich <params> kriege.
Ich dachte, ich muss mit 'ls -l' die MAJOR & MINOR einer bestimmten
Datei lesen. Nur welcher?
embert schrieb:> Ich dachte, ich muss mit 'ls -l' die MAJOR & MINOR einer bestimmten> Datei lesen. Nur welcher?
du musst du in dem Modul vergeben. Irgendwo im Quelltext wird wohl ein
DEFINE dafür festgelegt sein.
embert schrieb:> Na gut, dann bleibt die Frage, woher ich <params> kriege.>> Ich dachte, ich muss mit 'ls -l' die MAJOR & MINOR einer bestimmten> Datei lesen. Nur welcher?
Nein. Du musst diese "Datei" erstellen. Als inode-Nummern musst du die
nehmen, die du in deinem Kernel-Modul festgelegt hast.
Die major inode number aller devices kannst du auch in /proc/devices
nachlesen.
cat /sys/devices/virtual/misc/hello/dev
Dort steht die major:minor drin.
Die Zeiten, in denen die major:minor statisch im Modul als Define
angelegt werden sind lange vorbei.
kernel schrieb:> cat /sys/devices/virtual/misc/hello/dev>> Dort steht die major:minor drin.>> Die Zeiten, in denen die major:minor statisch im Modul als Define> angelegt werden sind lange vorbei.
Danke, kernel.
Ich konnte /dev/hello erzeugen, habe aber noch ein Problem das Ding mit
'cat' anzusprechen.
Sieht jmd den Fehler?
Das gibt ja auch nicht aus, was dein Code ausgeben soll, sondern nur die
major und minor des Devices.
Damit kannst du dann das mknod machen und daraus dann wiederum deinen
Treiber antriggern.
Also: Ich brauchte kein /dev/hello per mknod anzulegen. Das
insmod hello_dev.ko
macht das bereits selbst. Es wurde automatisch mit Major 10 und Minor
57 angelegt, siehe oben "ls -l /dev/hello".
Der Befehl:
Ok, danke.
Hat geklappt.
Mein eigentlicher Treiber generiert allerdings keine 'dev'.
Welche Datei muss ich hier mit 'cat' ansprechen, um die MAJOR & MINOR zu
bekommen?
Kann man das allgemein sagen?
Ich habe es mit 'uevent' probiert, aber da steht nichts.
Hey Bob,
wie oben beschrieben handelt es sich jetzt nicht mehr um HelloWorld,
sondern um einen neuen Treiber.
Dieser generiert aber nirgends eine 'dev'-Datei.
embert schrieb:> wie oben beschrieben handelt es sich jetzt nicht mehr um HelloWorld,> sondern um einen neuen Treiber.> Dieser generiert aber nirgends eine 'dev'-Datei.
Sorry, wir können Deinen neuen Treiber aber nicht sehen, um den
Unterschied zu hello_dev.c zu erkennen. Sollen wir jetzt die Glaskugel
auspacken?
Frank M. schrieb:> Sorry, wir können Deinen neuen Treiber aber nicht sehen, um den> Unterschied zu hello_dev.c zu erkennen. Sollen wir jetzt die Glaskugel> auspacken?
Nein. Deshalb habe ich gefragt, ob man das allgemein(!) sagen kann, wo
major:minor zu finden sind.
Bspw. konnte mir "Kernel" sagen, dass das in
/sys/devices/virtual/misc/hello/dev zu finden ist, bevor ich den
Source-Code verlinkt habe.
Bei dem neuen Treiber handelt es sich um einem 'Platform Driver', was
ich durch das hier zeigen wollte.
1
/ # cat /sys/devices/platform/myModule/uevent
2
DRIVER=myModule
3
MODALIAS=platform:myModule
Vielleicht gibt's für 'Platform Driver' ja Regeln, wo major:minor
hingepackt wird.
Alle mit misc_register() registrierten Geräte bekommen Major 10.
MISC_DYNAMIC_MINOR bedeutet, dass der Kernel sich irgendeine freie
Minor-Nummer sucht. Wenn du kein udev hast, solltest du dort lieber eine
feste Nummer eintragen (siehe Documentation/devices.txt für eine Liste
schon belegter Nummern).
embert schrieb:> Bei dem neuen Treiber handelt es sich um einem 'Platform Driver'
Dieser hat gar kein device in /dev. Deshalb heißt er ja auch nicht
block/char/misc/... driver, sondern platform driver.
Du solltest mal ein ordentliches Buch lesen. Zum Beispiel "Linux Device
Drivers". Da sind diese Trivialitäten alle drin erklärt.