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