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

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

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

Ответы [ 2 ]

17 голосов
/ 05 января 2009

Вам понадобится макрос 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();
    ...

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

4 голосов
/ 12 января 2009

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

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

...