modules modprobe lsmod diseño como comando cargar file-io linux-kernel kernel-module

file-io - modprobe - kernel modules



E/S de archivos en un módulo kernel de Linux (5)

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.html

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


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

Me gusta seguir el desarrollo de Linux (por curiosidad, no soy un desarrollador de kernel, sí Java), y he visto discusiones sobre esta cuestión antes. Pude encontrar un mensaje LKML sobre esto, básicamente mencionando que generalmente es 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 se trata de un módulo privado (como en el caso de 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, puede que no lo haga. ser aceptado.

Evan Teran mencionó sysfs, lo cual me parece una buena idea. Si realmente necesita hacer cosas más duras, siempre puede crear nuevos ioctrls.

EDITAR:

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


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

Existen mecanismos (netlink, por ejemplo, o simplemente registrar un dispositivo de caracteres) para permitir que un módulo kernel hable con un proceso de ayuda de espacio de usuario. Ese proceso de ayuda 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 kernel.

Esto probablemente sería mejor que tratar de abrir archivos en el espacio del kernel.

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



suponiendo que puede obtener punteros a los punteros de función relavent para las llamadas al sistema de open / read / close , 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);

Sin syscall_* , necesitarás crear los punteros a la función " syscall_* " que he mostrado. Estoy seguro de que hay una mejor manera, pero creo que esto funcionaría.