Pregunta

Estoy escribiendo un módulo de kernel de Linux que necesita abrir y leer archivos. ¿Cuál es la mejor manera de lograr eso?

¿Fue útil?

Solución

¿Puedo preguntar por qué estás intentando abrir un archivo?

Me gusta seguir el desarrollo de Linux (por curiosidad, no soy un desarrollador de kernel, hago Java), y he visto una discusión sobre esta pregunta antes. Pude encontrar un mensaje LKML sobre esto, básicamente mencionando Suele ser una mala idea. Estoy casi seguro de que LWN lo cubrió en el último año, pero tengo problemas para encontrar el artículo.

Si este es un módulo privado (como para un hardware personalizado y el módulo no se distribuirá), puede hacerlo, pero tengo la impresión de que si va a enviar su código a la línea principal, entonces puede no ser aceptado.

Evan Teran mencionó sysfs, lo que me parece una buena idea. Si realmente necesita hacer cosas personalizadas más difíciles, siempre puede hacer nuevos ioctrls.

EDITAR:

Bien, encontré el artículo que estaba buscando, es de Linux Journal . Explica por qué hacer este tipo de cosas generalmente es una mala idea, luego le dice exactamente cómo hacerlo de todos modos.

Otros consejos

suponiendo que puede obtener punteros a los punteros de la función correspondiente a las llamadas al sistema abrir / leer / cerrar , puede hacer algo como esto :

mm_segment_t fs = get_fs();
set_fs(KERNEL_DS);

fd = (*syscall_open)(file, flags, mode);
if(fd != -1) {
    (*syscall_read)(fd, buf, size);
    (*syscall_close)(fd);
}
set_fs(fs);

deberá crear el " syscall_ * " punteros de función que he mostrado sin embargo. Estoy seguro de que hay una mejor manera, pero creo que esto funcionaría.

En términos generales, si necesita leer / escribir archivos de un módulo de kernel, está haciendo algo mal arquitectónicamente.

Existen mecanismos (por ejemplo, netlink, o simplemente registrar un dispositivo de caracteres) para permitir que un módulo del núcleo se comunique con un proceso auxiliar de espacio de usuario. Ese proceso auxiliar de espacio de usuario puede hacer lo que quiera.

También podría implementar una llamada al sistema (o similar) para tomar un descriptor de archivo abierto en el espacio de usuario y leerlo / escribirlo desde el núcleo.

Esto probablemente sería más ordenado que intentar abrir archivos en el espacio del kernel.

Hay otras cosas que ya abren archivos desde el espacio del kernel, podría mirarlas (¿el controlador de bucle me viene a la mente?).

También puede encontrar información sobre sys_call_open en este Módulo de kernel de Linux Guía de programación .

El sistema de archivos

/ proc también es bueno para uso privado, y es fácil.
http://www.linuxtopia.org/online_books/Linux_Kernel_Module_Programming_Guide/x773. >

Todos los desarrolladores del kernel dicen que la E / S de archivo desde el espacio del kernel es mala (especialmente si te estás refiriendo a estos archivos por sus rutas) pero el kernel principal hace esto cuando cargas el firmware. Si solo necesita leer de los archivos, use el

kernel_read_file_from_path(const char *path, void **buf, loff_t *size, loff_t max_size, enum kernel_read_file_id id)
La función

, que es la que usa el código del cargador de firmware, declarada en include / linux / fs.h . Esta función devuelve un valor negativo en caso de error.

No estoy realmente seguro del punto de la variable id al final, si observa el código no se usa realmente, así que simplemente ponga algo como READING_FIRMWARE allí (sin comillas).

buf no tiene terminación nula, sino que se refiere a su tamaño en size . Si necesita que se termine con un valor nulo, cree una cadena size + 1 bytes de largo y cópiela o reescriba la función kernel_read_file () (utilizada por kernel_read_file_from_path ( ) , definido en fs / exec.c ) y agregue uno a i_size donde se asigna la memoria. (Si desea hacer esto, puede redefinir la función kernel_read_file () en su módulo con un nombre de función diferente para evitar modificar todo el núcleo).

Si necesita escribir en archivos, hay una función kernel_write () (análoga a kernel_read () , que es utilizada por kernel_read_file () y, por lo tanto, también mediante kernel_read_file_from_path () ), pero no existe la función kernel_write_file () o kernel_write_file_from_path () . Puede ver el código en el archivo fs / exec.c en el árbol fuente del kernel de Linux donde kernel_read_file () y kernel_read_file_from_path () definido para escribir sus propias funciones kernel_write_file () y kernel_write_file_from_path () que puede incluir en su módulo.

Y, como siempre, puede almacenar el contenido de un archivo en un puntero de caracteres en lugar de un puntero vacío con esta función lanzándolo.

scroll top