Ho scritto un programma di blocco driver che crea un dispositivo fittizio a blocchi (sbd0
). Ho registrato tutte le operazioni del dispositivo per questo dispositivo a blocchi: (fare riferimento a include/linux/blkdev.h
a 2.6.32 dei sorgenti del kernel)Perché il kernel utilizza il driver di blocco predefinito al posto del codice del mio driver?
static struct block_device_operations sbd_ops = {
.owner = THIS_MODULE,
.open = sbd_open,
.release = sbd_close,
.ioctl = sbd_ioctl,
.getgeo = sbd_getgeo,
.locked_ioctl = sbd_locked_ioctl,
.compat_ioctl = sbd_compat_ioctl,
.direct_access = sbd_direct_access,
.media_changed = sbd_media_changed,
.revalidate_disk = sbd_revalidate_disk
};
ho compilato il programma del driver. Ho inserito il modulo e /dev/sbd0
è stato creato. Ora voglio testare il mio codice del driver. Così ho scritto un'applicazione come di seguito.
fd = open("/dev/sbd0", O_RDONLY);
retval = ioctl(fd, BLKBSZGET, &blksz); //trying to get logical block size
uscita è: 4096
mi sono chiesto: non ho attuare ioctl per BLKBSZGET
. Non ha invocato il mio sbd_ioctl
, invece ha usato il driver predefinito e mi ha dato il risultato. Per open
, close
chiama eseguito sbd_open
e sbd_close
(che ho implementato). E poi ho provato:
retval = ioctl(fd, HDIO_GETGEO, &geoinfo);
E 'invocato sbd_getgeo
ma ho pensato che sarebbe richiamare sbd_ioctl
.
Ecco le mie domande:
- ho implementato un autista e ha creato un dispositivo. Se eseguo qualsiasi operazione su quel dispositivo, deve richiamare la mia applicazione driver. Ma come usa alcune delle mie funzioni driver e alcune funzioni driver predefinite?
ioctl(fd, HDIO_GETGEO, ..)
non ha richiamato.ioctl
chiamata, ma ha invocato.getgeo
. Com'è possibile?
vuoi dire, prima 'ioctl' gestito da' blkdev_ioctl'. Quindi direttamente poche operazioni 'ioctl' gestite da' blkdev_ioctl' e rimanenti saranno gestite dalle mie funzioni driver? – SGG
Sì, è esattamente così. – Mat
Ho visto la definizione di 'blkdev_ioctl'. veramente buono e molto chiaro. Ora voglio vedere come 'ioctl' chiama' blkdev_ioctl'. Voglio vedere il file sorgente. In quale file ottengo questo? – SGG