2013-03-29 7 views
8

두 개의 리눅스 커널 모듈이 있습니다. 하나는 다른 모듈에 어떤 기능을 제공 할 수 있습니다. 그러나 그 기능의 사용은 필수적인 것은 아니며, 두 번째 모듈은 첫 번째 모듈이 없어도 작동 할 수 있습니다.리눅스 커널의 모듈 간 통신

첫 번째 모듈에서 함수를 내보내고 두 번째 모듈에서 사용하는 경우 두 번째 모듈은 해당 심볼에 종속되므로 첫 번째 모듈 없이는로드 할 수 없습니다.

해결책 중 하나는 첫 번째 모듈의 함수에 대해/proc/kallsym을 조사하는 사용자 스크립트를 갖는 것입니다.이 스크립트가있는 경우 두 번째 모듈에 매개 변수로 해당 스크립트의 주소를 전달합니다. 그것의 포인터. 하지만 분명한 이유 때문에 그 해결책을 좋아하지 않습니다.

두 번째 모듈이 첫 번째 모듈에서 일부 심볼의 주소를 가져 오지만 딱딱한 의존성을 피할 수 있도록보다 정확하고 우아한 솔루션이 있다면?

답변

1

모듈 B가 모듈 A에 의존하면 모듈 A가 먼저로드되지 않으면 모듈 B가 성공적으로로드 될 수 없다고 생각합니다.

실제로 모듈 A가 처음 삽입 된 후에 만 ​​모듈 A에서 내 보낸 모듈 B가 필요로하는 심볼이/proc/kallsym 파일에 나타납니다.

모듈 B에서 module_init() 함수에는 모듈을 확인하는 코드가 있어야합니다. A가 이미 있는지 여부. 그렇지 않으면 A를 먼저로드합니다. request_module()을 사용하여 A를로드하거나 try_then_request_module()을 사용하여 더 멋진 메소드를 작성하십시오.

+0

모듈 A는 모듈 A가 전혀 없어도 작동해야합니다 (A가 기계에없는 일부 하드웨어 가속에 대한 인터페이스를 제공한다고 가정). – Eugene

+0

2.4에서 query_module() 인터페이스가 필요하지만 거의 필요하지는 않지만 2.6에서 제거되었습니다. 나는 대체물이 있는지 궁금해. – Eugene

5

마지막으로 해결책을 찾았습니다 : 커널에 symbol_get() 및 symbol_put()이있어 다른 모듈에서 임의의 심볼을 조회 할 수 있습니다 (모듈을 내보낼 필요가 있습니다). 모듈이 언로드되는 것을 방지합니다. 그 상징을 사용 해요.

1

더 세련된 솔루션이 있지만 커널을 변경해야합니다. 기본적으로 커널은 모듈 등록을 수용 할 수 있도록 향상되었습니다. 모듈이로드되어 다른 모듈에 자신을 노출시키고 자 할 때, 그는 잘 알려진 int로 커널에 등록 할 것입니다. 이것은 등록 된 모듈에 대한 참조를 저장하는 커널 배열의 색인 일뿐입니다. 이제 다른 모듈에 대한 참조를 얻고 자하는 모든 모듈은 커널에이 모듈에 대한 새로운 참조를 요청할 것입니다 - 잘 알려진 int를 사용하십시오. 이러한 새 참조는 수명이 짧아야합니다 (예 : 참조를 얻었지만 같은 맥락에서 다시 참조). 오래 지속되는 연결을 허용하려면 두 모듈 사이에서 프로토콜을 만들어야합니다. 그러면 어느 모듈이 언로드 될 때 다른 모듈에게 그가 떠날 것임을 알리는 방법을 알게됩니다.