Qual è la differenza tra ioctl (), unlocked_ioctl () e compat_ioctl ()?


38

Passando attraverso il codice sorgente 2.6.36 di Linux su lxr.linux.no , non sono riuscito a trovare il ioctl()metodo file_operations. Invece ho trovato due nuove chiamate: unlocked_ioctl()e compat_ioctl(). Qual è la differenza tra ioctl(), unlocked_ioctl()e compat_ioctl()?

Risposte:


39

Meta-risposta: tutte le cose grezze che accadono al kernel Linux passano attraverso lkml (la mailing list del kernel Linux) . Per riepiloghi esplicativi, leggi o cerca lwn (notizie settimanali su Linux) .

Risposta: Dal nuovo modo di ioctl () di Jonathan Corbet :

ioctl()è una delle parti rimanenti del kernel che gira sotto il Big Kernel Lock (BKL). In passato, l'utilizzo di BKL ha reso possibile per i ioctl()metodi a esecuzione prolungata creare lunghe latenze per processi non correlati.

Segue una spiegazione della patch introdotta unlocked_ioctle compat_ioctlin 2.6.11. La rimozione del ioctlcampo è avvenuta molto più tardi, nella 2.6.36.

Spiegazione: Quando è ioctlstato eseguito, è stato necessario il Big Kernel Lock (BKL), quindi nient'altro poteva essere eseguito contemporaneamente. Questo è molto male su una macchina multiprocessore, quindi c'è stato un grande sforzo per sbarazzarsi del BKL. In primo luogo, è unlocked_ioctlstato introdotto. Permette ad ogni autista che scrive di scegliere quale blocco usare invece. Questo può essere difficile, quindi c'è stato un periodo di transizione durante il quale i vecchi driver funzionavano ancora (usando ioctl) ma i nuovi driver potevano usare l'interfaccia migliorata ( unlocked_ioctl). Alla fine tutti i driver sono stati convertiti e ioctlpotrebbero essere rimossi.

compat_ioctlin realtà non è correlato, anche se è stato aggiunto contemporaneamente. Il suo scopo è quello di consentire ai programmi userland a 32 bit di effettuare ioctlchiamate su un kernel a 64 bit. Il significato dell'ultimo argomento ioctldipende dal driver, quindi non è possibile eseguire una conversione indipendente dal driver.


1
Stavo guardando l'ultima fonte ioctl e ho visto che la syscall fa alcuni controlli e poi salta qui . Sai dove posso raccogliere maggiori informazioni sul sistema ioctl? Sono interessato a come i comandi ioctl sui file dei caratteri vengono indirizzati al driver appropriato. È attraverso unlocked_ioctlciò che succede? Il fatto che venga utilizzato un puntatore a funzione per file (in questo caso a struct file) sembra che io possa essere vicino. unlocked_ioctlDopo la registrazione dei file dei caratteri sull'inizializzazione del driver mknod?
Sherrellbc,

1
@sherrellbc Il driver di dispositivo registra i metodi di gestione dei file come unlocked_ioctlin a struct file_opsquando struct file_opsviene avviato e vengono popolati dall'oggetto file all'apertura del file. mknodnon ha alcun ruolo in questo.
Gilles 'SO- smetti di essere malvagio' il

Vedo. Stavo pensando che un driver di dispositivo deve prima mknodesporre la sua interfaccia attraverso un dispositivo a caratteri prima di reindirizzare le operazioni di file associate a se stesso (tramite unlocked_ioctl).
Sherrellbc,

4

Ci sono casi in cui la sostituzione di (include / linux / fs.h) struct file_operations metodo ioctl () in compat_ioctl () nel kernel 2.6.36 non funziona (ad es. Per alcuni driver di dispositivo) e deve essere utilizzato unlocked_ioctl ().

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.