2012-06-20 17 views
5

¿Es posible llamar al ioctl desde un módulo kernel de Linux? ¿Alguien puede dar un ejemplo de cómo se usa?Cómo usar ioctl() desde el espacio del kernel en Linux?

+3

Realmente no se supone que hagas cosas como esas. Si realiza una búsqueda, encontrará un código dependiente de la implementación de cómo hacer una llamada de sistema arbitraria desde el espacio del kernel, pero piense si hay una manera de lograr su objetivo real sin romper el modelo de esta manera. –

Respuesta

5

Puede intentar llamar al sys_ioctl.
Se exporta si el kernel está compilado con CONFIG_COMPAT.

O, si tiene el controlador del dispositivo struct file_operations, puede llamar directamente al controlador ioctl.

Sin embargo, el identificador ioctl esperaría que los parámetros del puntero estuvieran en el espacio de direcciones del proceso que se está ejecutando actualmente, no en el espacio de direcciones del kernel. copy_from_user se usaría para leerlos. Si da punteros al espacio de direcciones del kernel, copy_from_user fallará. No veo cómo te las arreglarías con esto.

Editar:

Si va a llamar manejador ioctl entre el código de abajo copy_from_user será nunca fallará.

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

ioctl handler en file_operations ha quedado en desuso. ¿Puedes encontrar una forma más nueva de usar ioctl? – iammurtaza

+0

¿Puede explicar cómo get_fs() y set_fs() permiten mágicamente que el espacio del kernel ejecute llamadas al sistema, y ​​cómo después de este "copy_from_user()" ya no crea un problema? –

+0

'set_fs' afecta el mecanismo que valida que las direcciones pasadas a' copy_to_user' están realmente en el espacio de direcciones del usuario actual. Hace que el núcleo piense que el espacio de direcciones actual es el espacio de direcciones del kernel. – ugoren

Cuestiones relacionadas