Как написать модуль драйвера Linux/использовать другой модуль драйвера?
Я разрабатываю загружаемый модуль драйвера Linux, и я должен использовать другое устройство в своем драйвере (вид драйвера, уложенный на другой драйвер)
Как мне позвонить/использовать другой драйвер в моем драйвере? Я думаю, что они оба находятся в ядре, поэтому может быть способ, который может использовать другой драйвер напрямую.
Ответы
Ответ 1
Вам понадобится макрос 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();
...
Это должно быть плавным, но вы, конечно, должны быть осторожны с пространством имен - топать на кого-то еще символы модуля ядра были бы неудачными.
Ответ 2
Вы забыли упомянуть, что вы должны также изучить try_module_get/module_put/symbol_get/symbol_put/symbol_request, для обеспечения загрузки другого модуля и того факта, что он не выгружается во время использования. Однако я не помню точных подробностей; Я думаю, что modprobe обеспечит загрузку другого модуля, но я не уверен, будет ли добавлена зависимость времени выполнения для разгрузки. Я предполагаю, что эти API могут понадобиться для некоторых других случаев, но должны знать о них, чтобы проверить это.
Btw, бесплатная книга Linux Device Drivers доступна здесь, и она ответит на этот вопрос и многое другое:
http://lwn.net/Kernel/LDD3/