2012-06-20 15 views
5

È possibile chiamare ioctl da un modulo del kernel Linux? Qualcuno può fornire un esempio di come viene utilizzato?Come usare ioctl() dallo spazio del kernel in Linux?

+3

In realtà non si dovrebbe fare cose del genere. Se fai una ricerca, troverai del codice dipendente dall'implementazione per come eseguire un syscall arbitrario dallo spazio del kernel, ma per favore pensa se c'è un modo per realizzare il tuo vero obiettivo senza rompere il modello in questo modo. –

risposta

5

Puoi provare a chiamare sys_ioctl.
Viene esportato se il kernel è compilato con CONFIG_COMPAT.

Oppure, se si dispone del driver del dispositivo struct file_operations, è possibile chiamare direttamente il gestore ioctl.

Tuttavia, l'handle di ioctl si aspetterebbe che i parametri del puntatore si trovino nello spazio degli indirizzi del processo attualmente in esecuzione, non nello spazio degli indirizzi del kernel. copy_from_user verrebbe utilizzato per leggerli. Se si danno dei puntatori allo spazio degli indirizzi del kernel, copy_from_user avrà esito negativo. Non vedo come potresti aggirare questo.

Edit:

Se si chiamerà gestore ioctl tra sottostante Codice di copy_from_user non potrà mai fallire.

mm_segment_t fs; 

    fs = get_fs();  /* save previous value */ 
    set_fs (get_ds()); /* use kernel limit */ 

    /* system calls can be invoked */ 

    set_fs(fs); /* restore before returning to user space */ 
+1

Il gestore ioctl in file_operations è stato deprecato. Riesci a capire il modo più nuovo di usare ioctl? – iammurtaza

+0

Puoi elaborare come get_fs() e set_fs() magicamente permettono allo spazio del kernel di eseguire chiamate di sistema, e come dopo questo "copy_from_user()" non crea più un problema? –

+0

'set_fs' influenza il meccanismo che convalida che gli indirizzi passati a' copy_to_user' sono effettivamente nello spazio degli indirizzi dell'utente corrente. Fa pensare al kernel che lo spazio degli indirizzi corrente sia lo spazio degli indirizzi del kernel. – ugoren

Problemi correlati