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
Respuesta
¿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.
Es un módulo personalizado, no se distribuirá.Necesito abrir un archivo que contiene un mapeo de inodos => sumas de verificación. – mipadi
@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
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.
También puede encontrar información sobre sys_call_open en este Linux Kernel Module Programing Guide.
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
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?).
En realidad, he alterado el mecanismo para leer desde un archivo en/proc, por lo que probablemente no necesite leer un archivo directamente. – mipadi
/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
- 1. Cómo codificar un módulo kernel de Linux?
- 2. Tarea periódica en un módulo de kernel de Linux
- 3. módulo del kernel Linux compilar
- 4. ¿Puedo usar strtok() en un Módulo Kernel de Linux?
- 5. Makefile para el módulo kernel de Linux?
- 6. Ubicación del Módulo Kernel de Linux
- 7. ¿Cómo cargar automáticamente un módulo kernel en Gentoo Linux?
- 8. ¿Cómo leer/escribir archivos dentro de un módulo kernel de Linux?
- 9. Compilación cruzada de un módulo kernel
- 10. Construyendo un módulo kernel de Linux fuera de árbol en un directorio de objetos separado
- 11. Como hacer un módulo kernel de Linux depende de otro módulo externo con depmod?
- 12. ¿Cuál es la diferencia entre module_init e init_module en un módulo kernel de Linux?
- 13. Acceso a un puerto serie desde un módulo de kernel de Linux
- 14. ¿Cómo incluir C backtrace en un código de módulo kernel?
- 15. No se puede escribir en la memoria kernel a través del módulo kernel de Linux (Ubuntu)
- 16. ¿Cómo puedo obtener el nivel de batería dentro de un módulo kernel de Linux?
- 17. stdlib.h alternativa en kernel Linux?
- 18. Cómo capturar marcos de red en un módulo kernel
- 19. Ejecutar un programa en el kernel de Linux
- 20. ¿Hay alguna manera de que un módulo kernel encuentre direcciones de sección de otro módulo cargado?
- 21. ¿Hay alguna manera de averiguar qué está usando un módulo kernel de Linux?
- 22. cómo determinar si un módulo del kernel de Linux tiene una pérdida de memoria
- 23. Cargando el módulo kernel en el núcleo de Android
- 24. ¿Cómo asignar una página ejecutable en un módulo kernel de Linux?
- 25. ¿Hay un límite de tamaño para el módulo kernel en Linux?
- 26. addr2line en el módulo kernel
- 27. Organización de los encabezados kernel de Linux
- 28. desarrollo del kernel de Linux
- 29. Programación del kernel de Linux
- 30. ¿Puedo reemplazar una función del kernel de Linux con un módulo?
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) –