2008-11-08 14 views
18

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

+0

duplicado posible de [Cómo leer/escribir archivos dentro de un módulo del kernel de Linux?] (Http://stackoverflow.com/questions/1184274/how-to-read-write-files-within-a- linux-kernel-module) –

Respuesta

30

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

Me gusta seguir el desarrollo de Linux (por curiosidad, no soy un desarrollador de kernel, sí Java), y he visto la discusión de esta pregunta antes. Pude encontrar un LKML message 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 para algunos hardware personalizados 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 cual me parece una buena idea. Si realmente necesita hacer cosas más duras, siempre puede crear nuevos ioctrls.

EDIT:

Bueno, he encontrado el artículo que estaba buscando, que 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.

+0

Es un módulo personalizado, no se distribuirá.Necesito abrir un archivo que contiene un mapeo de inodos => sumas de verificación. – mipadi

+1

@mipadi: Encontré el artículo en el que estaba pensando, explica exactamente cómo abrir y leer un archivo del kernel (después de la parte "do not do this"). He editado mi publicación para reflejar eso y contener el enlace. Buena suerte. – MBCook

8

suponiendo que usted puede obtener punteros a los punteros de función relavent a las llamadas al sistema 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); 

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

1

También puede encontrar información sobre sys_call_open en este Linux Kernel Module Programing Guide.

+0

Sí, he echado un vistazo a eso. A propósito, estoy arreglando la llamada al sistema abierta (2), y realmente necesito leer un archivo _inside_ mi versión parcheada. – mipadi

2

En general, si necesita leer/escribir archivos desde un módulo kernel, está haciendo algo mal desde el punto de vista arquitectónico.

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?).

+0

En realidad, he alterado el mecanismo para leer desde un archivo en/proc, por lo que probablemente no necesite leer un archivo directamente. – mipadi

Cuestiones relacionadas