mknod um /dev zu erzeugen

Gast #4431001
Lesenswert?
• ▲
▼
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?
1
# find | grep hello
2
./sys/devices/virtual/misc/hello
3
./sys/devices/virtual/misc/hello/dev
4
./sys/devices/virtual/misc/hello/power
5
./sys/devices/virtual/misc/hello/power/control
6
./sys/devices/virtual/misc/hello/power/runtime_active_time
7
./sys/devices/virtual/misc/hello/power/autosuspend_delay_ms
8
./sys/devices/virtual/misc/hello/power/runtime_status
9
./sys/devices/virtual/misc/hello/power/runtime_suspended_time
10
./sys/devices/virtual/misc/hello/subsystem
11
./sys/devices/virtual/misc/hello/uevent
12
./sys/class/misc/hello
13
./sys/module/hello_dev
14
./sys/module/hello_dev/srcversion
15
./sys/module/hello_dev/notes
16
./sys/module/hello_dev/notes/.note.gnu.build-id
17
./sys/module/hello_dev/taint
18
./sys/module/hello_dev/initstate
19
./sys/module/hello_dev/coresize
20
./sys/module/hello_dev/sections
21
./sys/module/hello_dev/sections/.init.text
22
./sys/module/hello_dev/sections/.ARM.exidx.exit.text
23
./sys/module/hello_dev/sections/.data
24
./sys/module/hello_dev/sections/.text
25
./sys/module/hello_dev/sections/.ARM.exidx.init.text
26
./sys/module/hello_dev/sections/.ARM.exidx
27
./sys/module/hello_dev/sections/.rodata
28
./sys/module/hello_dev/sections/.strtab
29
./sys/module/hello_dev/sections/.symtab
30
./sys/module/hello_dev/sections/.gnu.linkonce.this_module
31
./sys/module/hello_dev/sections/.rodata.str1.4
32
./sys/module/hello_dev/sections/.note.gnu.build-id
33
./sys/module/hello_dev/version
34
./sys/module/hello_dev/uevent
35
./sys/module/hello_dev/holders
36
./sys/module/hello_dev/initsize
#4431630
Lesenswert?
• ▲
▼
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.
Gast #4431844
Lesenswert?
• ▲
▼
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?
1
/sys/devices/virtual/misc/hello # ls -l
2
-r--r--r--    1 0        0             4096 Jan  1 00:00 dev
3
drwxr-xr-x    2 0        0                0 Jan  1 00:02 power
4
lrwxrwxrwx    1 0        0                0 Jan  1 00:02 subsystem -> ../../../../class/misc
5
-rw-r--r--    1 0        0             4096 Jan  1 00:02 uevent
6
/sys/devices/virtual/misc/hello # mknod /dev/hello c 1 0
7

8
/sys/devices/virtual/misc/hello # ls -l /dev/hello
9
crw-r--r--    1 0        0           1,   0 Jan  1 00:03 hello
10

11
/sys/devices/virtual/misc/hello # cat /dev/hello 
12
cat: can't open '/dev/hello': No such device or address
Moderator Persönliche Seite #4432082
Lesenswert?
• ▲
▼
Ich habe mir mal gerade aus dem Artikel:

  http://www.linuxdevcenter.com/pub/a/linux/2007/07/05/devhelloworld-a-simple-introduction-to-device-drivers-under-linux.html?page=2

das hello_dev.tar.gz runtergeladen:
1
# wget http://www.linuxdevcenter.com/linux/2007/07/05/examples/hello_dev.tar.gz
2
...
3
Saving to: `hello_dev.tar.gz'
4
root@www:~/hello# tar xfz hello_dev.tar.gz
5
root@www:~/hello# cd hello_dev/
6
root@www:~/hello/hello_dev# ls -l
7
total 12
8
-rw-r--r-- 1 fm fm 2274 2007-06-21 14:27 hello_dev.c
9
-rw-r--r-- 1 fm fm   53 2007-06-20 01:56 hello.rules
10
-rw-r--r-- 1 fm fm  138 2007-06-20 02:29 Makefile
11
root@www:~/hello/hello_dev# make
12
make -C /lib/modules/3.0.0-32-server/build M=/root/hello/hello_dev modules
13
make[1]: Entering directory `/usr/src/linux-headers-3.0.0-32-server'
14
  CC [M]  /root/hello/hello_dev/hello_dev.o
15
  Building modules, stage 2.
16
  MODPOST 1 modules
17
  CC      /root/hello/hello_dev/hello_dev.mod.o
18
  LD [M]  /root/hello/hello_dev/hello_dev.ko
19
make[1]: Leaving directory `/usr/src/linux-headers-3.0.0-32-server'
20
root@www:~/hello/hello_dev# ls -l
21
total 40
22
-rw-r--r-- 1 fm   fm   2274 2007-06-21 14:27 hello_dev.c
23
-rw-r--r-- 1 root root 5510 2016-01-19 12:57 hello_dev.ko
24
-rw-r--r-- 1 root root  793 2016-01-19 12:57 hello_dev.mod.c
25
-rw-r--r-- 1 root root 2760 2016-01-19 12:57 hello_dev.mod.o
26
-rw-r--r-- 1 root root 5104 2016-01-19 12:57 hello_dev.o
27
-rw-r--r-- 1 fm   fm     53 2007-06-20 01:56 hello.rules
28
-rw-r--r-- 1 fm   fm    138 2007-06-20 02:29 Makefile
29
-rw-r--r-- 1 root root   42 2016-01-19 12:57 modules.order
30
-rw-r--r-- 1 root root    0 2016-01-19 12:57 Module.symvers
31
root@www:~/hello/hello_dev# insmod hello_dev.ko
32
root@www:~/hello/hello_dev# ls -l /dev/hello
33
crw------- 1 root root 10, 57 2016-01-19 12:57 /dev/hello
34
root@www:~/hello/hello_dev# cat /dev/hello
35
Hello, world!

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:
1
root@www:~/hello/hello_dev# cat /sys/devices/virtual/misc/hello/dev
2
10:57

bestätigt das.

Wenn ich das Kernel-Modul entferne, verschwindet auch das Device wieder:
1
root@www:~/hello/hello_dev# rmmod hello_dev
2
root@www:~/hello/hello_dev# ls -l /dev/hello
3
ls: cannot access /dev/hello: No such file or directory

Das geht also auch automatisch.
Gast #4432332
Lesenswert?
• ▲
▼
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.
1
/ # cat /sys/devices/platform/myModule/uevent 
2
DRIVER=myModule
3
MODALIAS=platform:myModule
Gast #4432546
Lesenswert?
• ▲
▼
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.
#4432810
Lesenswert?
• ▲
▼
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).
Gast #4434381
Lesenswert?
• ▲
▼
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.