¿Cómo escribir un módulo de controlador de Linux, llamar / usar otro módulo de controlador?

StackOverflow https://stackoverflow.com/questions/413955

Pregunta

Estoy desarrollando un módulo que se puede cargar en el controlador de Linux y tengo que usar otro dispositivo en mi controlador (tipo de controlador apilado en otro controlador)

¿Cómo llamo / uso otro controlador en mi controlador? Creo que ambos están en el kernel, por lo que podría haber una forma de usar otro controlador directamente.

¿Fue útil?

Solución

Necesitará la macro EXPORT_SYMBOL (o EXPORT_SYMBOL_GPL ). Por ejemplo:

/* mod1.c */
#include <linux/module.h>
#include <linux/kernel.h>
#include "mod1.h"
....
void mod1_foo(void)
{
    printk(KERN_ALERT "mod1_foo\n");
}
EXPORT_SYMBOL(mod1_foo);

/* mod2.h */
....
extern void mod1_foo(void);
....

/* mod2.c */
#include <linux/module.h>
#include <linux/kernel.h>
#include "mod1.h"
#include "mod2.h"
int init_module(void)
{
    mod1_foo();
    ...

Esto debería ser una navegación simple, pero, por supuesto, debe tener cuidado con el espacio de nombres: la pisada en los símbolos del módulo del kernel de otra persona sería desafortunada.

Otros consejos

Olvidó mencionar que también debería estudiar try_module_get / module_put / symbol_get / symbol_put / symbol_request, para asegurar la carga del otro módulo, y el hecho de que no se descarga durante el uso. Aunque no recuerdo los detalles exactos; Creo que modprobe asegurará que el otro módulo esté cargado, pero no estoy seguro si se agregará la dependencia de tiempo de ejecución para la descarga. Supongo que esas API pueden ser necesarias para otros casos, pero necesita saber sobre ellas para verificar esto.

Por cierto, el libro gratuito Linux Device Drivers está disponible aquí, y responderá a esta pregunta y mucho más: http://lwn.net/Kernel/LDD3/

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top