Posto se u pozivima read, write i llseek ne pojavljuje inode, kako onda da navatam minor broj tog device-a?
Linux drajveri:Kako da u file ops metodima saznam koji je minor broj device fajla nad kojim se radi?
Zaključano
Zakačeno
koristi stat da dobijes inode fajla (man 2 stat), mada ti u sustini i ne treba inode - mos' da koristis 'vako nesto:
takodje bi major, minor number dobio i sa npr:
u /proc/devices-u doduse stoje samo major number-i.
Code:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <linux/kdev_t.h>
int main()
{
dev_t device;
struct stat f_stat;
if (stat ("/dev/hda", &f_stat) == -1)
{
fprintf(stderr, "baah!\n");
exit (-1);
}
device = f_stat.st_rdev;
printf ("major %u, minor %u\n", major(device), minor(device));
return 0;
}
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <linux/kdev_t.h>
int main()
{
dev_t device;
struct stat f_stat;
if (stat ("/dev/hda", &f_stat) == -1)
{
fprintf(stderr, "baah!\n");
exit (-1);
}
device = f_stat.st_rdev;
printf ("major %u, minor %u\n", major(device), minor(device));
return 0;
}
takodje bi major, minor number dobio i sa npr:
Code:
caboom@buddha: ~ % ls -l /dev/hda
brw-rw---- 1 root disk 3, 0 Feb 23 22:02 /dev/hda
caboom@buddha: ~ % ls -l /dev/hdd
brw-rw---- 1 root disk 22, 64 Feb 23 22:02 /dev/hdd
caboom@buddha: ~ % cat /proc/devices
Character devices:
1 mem
4 /dev/vc/0
4 tty
4 ttyS
5 /dev/tty
5 /dev/console
5 /dev/ptmx
7 vcs
10 misc
13 input
14 sound
21 sg
36 netlink
81 video4linux
89 i2c
108 ppp
116 alsa
128 ptm
136 pts
180 usb
202 cpu/msr
203 cpu/cpuid
226 drm
Block devices:
2 fd
3 ide0
7 loop
9 md
11 sr
22 ide1
43 nbd
253 device-mapper
254 mdp
caboom@buddha: ~ % ls -l /dev/hda
brw-rw---- 1 root disk 3, 0 Feb 23 22:02 /dev/hda
caboom@buddha: ~ % ls -l /dev/hdd
brw-rw---- 1 root disk 22, 64 Feb 23 22:02 /dev/hdd
caboom@buddha: ~ % cat /proc/devices
Character devices:
1 mem
4 /dev/vc/0
4 tty
4 ttyS
5 /dev/tty
5 /dev/console
5 /dev/ptmx
7 vcs
10 misc
13 input
14 sound
21 sg
36 netlink
81 video4linux
89 i2c
108 ppp
116 alsa
128 ptm
136 pts
180 usb
202 cpu/msr
203 cpu/cpuid
226 drm
Block devices:
2 fd
3 ide0
7 loop
9 md
11 sr
22 ide1
43 nbd
253 device-mapper
254 mdp
u /proc/devices-u doduse stoje samo major number-i.
Potpis
Izvini, sad vidim da nisam napisao da se u pitanju radi o kernel modulu (drajveru) koji treba da funkcionise razlicito za razlicite minor brojeve.
Znaci, neko je otvorio device fajl za moj uredjaj i sad, za neki minor broj hocu da read i write rade na jedan nacin, a na razlicit za neki drugi minor broj. A vidim da read i write nemaju kao ulazni parametar pointer na inode nego samo pointer na file, gde nema na prvi pogled nicega sto bi posluzilo za pronalazenje inode-a, pa me je zanimalo kako to da izvedem.
U medjuvremenu sam u Rubinijevoj knjizi pronasao da se to radi prilikom open-a, da tada upisem u file strukturu doticnog fajla pointer na odgovarajucu fops strukturu koju sam spremio za taj slucaj... a ja sam zamisljao da mi u okviru svake funkcije treba switch (minor).. case (sto je moguce kod ioctl, koji se poziva sa jednim od parametara - pointerom na inode, ali ne i kod read i write koji to nemaju), pa sam zato pitao... mislim, ove file operations kanda da nisu sve od iste fele...
Znaci, neko je otvorio device fajl za moj uredjaj i sad, za neki minor broj hocu da read i write rade na jedan nacin, a na razlicit za neki drugi minor broj. A vidim da read i write nemaju kao ulazni parametar pointer na inode nego samo pointer na file, gde nema na prvi pogled nicega sto bi posluzilo za pronalazenje inode-a, pa me je zanimalo kako to da izvedem.
U medjuvremenu sam u Rubinijevoj knjizi pronasao da se to radi prilikom open-a, da tada upisem u file strukturu doticnog fajla pointer na odgovarajucu fops strukturu koju sam spremio za taj slucaj... a ja sam zamisljao da mi u okviru svake funkcije treba switch (minor).. case (sto je moguce kod ioctl, koji se poziva sa jednim od parametara - pointerom na inode, ali ne i kod read i write koji to nemaju), pa sam zato pitao... mislim, ove file operations kanda da nisu sve od iste fele...
pa pazi, na kraju se sve zavrsava time da moraju da se postuju POSIX standardi u neku ruku, ali ako ti treba drugaciji nivo apstrakcije nad open/read/write-om uvek mozes da napises svoj api i dodas svoje ekvivalente syscall-ova u kernelu. jeste okolo-izokola, ali time se oslobadjas tereta koji nose standardi i sa druge strane takodje smanjujes portabilnost onoga sto si napisao.