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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren