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/symplic_get/symplic_put/symplic_request를 공부해야한다는 것을 잊어 버렸습니다. 그래도 정확한 세부 사항을 기억하지 못합니다. ModProbe가 다른 모듈이로드되도록 보장 할 것이라고 생각하지만 언로드를위한 런타임 종속성이 추가 될지 확실하지 않습니다. 다른 경우에는 이러한 API가 필요할 수 있지만이를 확인하기 위해서는 알아야합니다.

BTW, 무료 책 Linux 장치 드라이버는 여기에서 제공 되며이 질문에 훨씬 더 답할 것입니다.http://lwn.net/kernel/ldd3/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top