2014-05-21 17 views
6

Ecco il ioctl chiamata in spazio utente:In che modo Linux sa quale ioctl deve chiamare?

int ioctl(int fd, int cmd, ...); 

Per quanto ne so, quando vogliamo perfrom operazioni di IO, definiamo la nostra funzione ioctl con una serie di richieste (comandi), assegnare il nostro ioctl ad una struttura come questa file_operations:

struct file_operations fops = { 
.read = device_read, 
.write = device_write, 
.ioctl = device_ioctl, // device_ioctl is our function 
.open = device_open, 
.release = device_release, 
}; 

E la funzione device_ioctl è definito diversamente rispetto all'interfaccia spazio utente:

static long device_ioctl(struct file *f, unsigned int cmd, unsigned long arg) 

Penso basato sul descrittore di file, il kernel può ottenere la struttura di file appropriato e chiede il dispositivo di ioctl.

questa è solo una supposizione, perché non riesco a trovare è la definizione della funzione generica in cui il kernel seleziona appropriata funzione ioctl in base al file descrittore fd passato nel interfaccia generica ioctl? Ci sono solo 3 ioctl definizioni posso trovare, ma a quanto pare questi sono solo le definizioni dei dispositivi, non il kernel: ioctl

+1

può farmi sapere cosa significano questi punti (**. **) qui e come funziona come puntatore di funzione? Sono curioso di sapere. – indranil

risposta

5

Guardate nel codice sorgente di Linux, fs/ioctl.c (http://lxr.free-electrons.com/source/fs/ioctl.c)
Vi si possono vedere la syscall per ioctl:

SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg) 

Questo a sua trasforma chiamate do_vfs_ioctl(), che chiama vfs_ioctl () che chiama quindi la funzione unlocked_ioctl definita per quel filesystem nella struttura file_operations.
Questa sarà la funzione device_ioctl che hai registrato.

+0

Infine. Grazie. – Amumu

2

device_ioctl è un puntatore a funzione. Il kernel prende semplicemente fd come indice per un array di struct file_operations e chiama il .ioctl dell'elemento corrispondente. Il kernel non ha mai bisogno di sapere quale sia la funzione stessa a quale dispositivo si riferisce.

Questa è la base di "Tutto è un file", che è moto di Unix.

+0

Grazie. So che è un puntatore a funzione. Ma dov'è il posto in cui il generico 'ioctl' nello spazio utente è stato implementato per selezionare correttamente la funzione nella matrice di file_operations? – Amumu

+0

@Aumu, non è affatto nello spazio utente. Lo spazio utente 'ioctl' chiama semplicemente la chiamata di sistema ioctl, passando i parametri. È il generico 'ioctl' in _kernel space_ che esamina l'array di' struct file_operations'. – Shahbaz

+0

@Shabaz Mi riferisco a 'ioctl' tipicamente usato nell'applicazione utente come' spazio utente 'ioctl'. Sì, lo so che seleziona 'ioctl' appropriato nello spazio del kernel. Ma mi chiedo dove sia implementato il generico 'ioctl' nello spazio del kernel. Ho cercato, e dà solo 3 definizioni, e tutte queste 3 definizioni sono 'ioctl' di driver: http://lxr.free-electrons.com/ident?i=ioctl – Amumu

0

Il kernel saprà quale funzione ioctl chiamare a causa del descrittore di file . Per poter chiamare un ioctl() dallo spazio utente devi aprire un file per ottenere il fd, tipicamente un/dev/[some_device] il cui driver implementerà la struct file_operations, come hai fatto notare.

1

Quando si chiama ioctl si passa un descrittore di file. Hai il descrittore di file da apertura di un file dispositivo come /dev/tty0:

$ ls -l /dev/tty0 
crw--w---- 1 root tty 4, 0 Mar 6 10:47 /dev/tty0 
$ 

Il numero 4 qui è il numero maggiore dispositivo che è codificato nel modulo del driver del kernel deve utilizzare.

+0

Sapete dove nel codice del kernel seleziona il dispositivo appropriato 'ioctl' basato sul file fd? – Amumu

Problemi correlati