Как написать вызов модуля драйвера Linux / использовать другой модуль драйвера?

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

Вопрос

Я разрабатываю модуль для загрузки драйверов Linux, и мне приходится использовать другое устройство в моем драйвере.(вид драйвера, установленного на другой драйвер)

Как мне вызвать / использовать другой драйвер в моем драйвере?Я думаю, что они оба находятся в ядре, так что, возможно, есть способ напрямую использовать другой драйвер.

Это было полезно?

Решение

Вам понадобится макрос EXPORT_SYMBOL (или EXPORT_SYMBOL_GPL ). Например:

/* 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();
    ...

Это должно быть просто плавно, но вы, конечно, должны быть осторожны с пространством имен - стучать по чужим символам модуля ядра было бы неудачно.

Другие советы

Вы забыли упомянуть, что вам также следует изучить try_module_get /module_put /symbol_get/symbol_put /symbol_request для обеспечения загрузки другого модуля и того факта, что он не выгружается во время использования.Хотя точных подробностей я не помню;Я думаю, что modprobe обеспечит загрузку другого модуля, но я не уверен, будет ли добавлена зависимость от времени выполнения для выгрузки.Я предполагаю, что эти API могут понадобиться для некоторых других случаев, но нужно знать о них, чтобы проверить это.

Кстати, бесплатная книга "Драйверы устройств Linux" доступна здесь, и она ответит на этот вопрос и на многое другое:http://lwn.net/Kernel/LDD3/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top