Forum: PC-Programmierung mknod um /dev zu erzeugen


von embert (Gast)


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

von Rene H. (Gast)


Lesenswert?

Auf keines davon. Du willst ja /dev/hello.
Also mknod /dev/hello <params>.

von embert (Gast)


Lesenswert?

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?

von Peter II (Gast)


Lesenswert?

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.

von Rene H. (Gast)


Lesenswert?

Dass ist deine Aufgabe herauszufinden. Wir kennen dein Kernel-Modul 
nicht.

von Rolf M. (rmagnus)


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.

von kernel (Gast)


Lesenswert?

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.

von embert (Gast)


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

von Clemens L. (c_l)


Lesenswert?

"kernel" hat dir gesagt, du sollst
1
cat /sys/devices/virtual/misc/hello/dev
 ausführen. Das hast du nicht gemacht.

von embert (Gast)


Lesenswert?

Clemens L. schrieb:
> "kernel" hat dir gesagt, du sollstcat
> /sys/devices/virtual/misc/hello/dev ausführen. Das hast du nicht
> gemacht.
1
/sys/devices/virtual/misc/hello # cat dev 
2
10:59

Das aber nicht was der Code ausgeben sollte.

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

von Klaus W. (mfgkw)


Lesenswert?

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.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

embert schrieb:
> /sys/devices/virtual/misc/hello # cat dev
> 10:59

embert schrieb:
> /sys/devices/virtual/misc/hello # mknod /dev/hello c 1 0

Ist falsch.

Richtig:

mknod /dev/hello c 10 59

von Frank M. (ukw) (Moderator) Benutzerseite


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.

: Bearbeitet durch Moderator
von embert (Gast)


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

von Bob (Gast)


Lesenswert?

kernel schrieb:
> cat /sys/devices/virtual/misc/hello/dev
>
> Dort steht die major:minor drin.

von embert (Gast)


Lesenswert?

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.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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?

von embert (Gast)


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.

von Clemens L. (c_l)


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).

von kernel (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.