커널모듈에서 커널함수를 호출할수있는 원리를 알고싶습니다.

toy의 이미지

어플리케이션이라면 dl 라이브러리가 그 역할을 해준다고 알고있습니다.
open함수를 호출했다면 open함수의 주소를 dl 라이브러리가 찾아주는것같은데요...

커널모듈에서 커널함수를 호출했을때는 어떻게 그 함수의 주소를 알수있는지 알고싶습니다.
예를들어 register_chrdev 이런류의 함수를 호출했을때요...

감사드립니다. :o

pastime의 이미지

register_chrdev() 함수는 커널이 빌드될 때
EXPORT_SYMBOL() 매크로를 통해 __ksymtab 섹션에
자신의 주소와 심볼명(스트링)을 등록합니다. (struct kernel_symbol)

191 /* For every exported symbol, place a struct in the __ksymtab section */
192 #define __EXPORT_SYMBOL(sym, sec)                               \
193         __CRC_SYMBOL(sym, sec)                                  \
194         static const char __kstrtab_##sym[]                     \
195         __attribute__((section("__ksymtab_strings")))           \
196         = MODULE_SYMBOL_PREFIX #sym;                            \
197         static const struct kernel_symbol __ksymtab_##sym       \
198         __attribute_used__                                      \
199         __attribute__((section("__ksymtab" sec), unused))       \
200         = { (unsigned long)&sym, __kstrtab_##sym }
201 
202 #define EXPORT_SYMBOL(sym)                                      \
203         __EXPORT_SYMBOL(sym, "")
204 
205 #define EXPORT_SYMBOL_GPL(sym)                                  \
206         __EXPORT_SYMBOL(sym, "_gpl")
207 
208 #endif

모듈이 로드될 때는 내부적으로 simplify_symbols() 함수를 호출하는데
이 함수는 자신의 심볼 테이블을 검사하여 정의되지 않은 심볼의 경우
직접 커널의 __ksymtab 섹션 내의 심볼에 해당하는 주소값을 설정하게 됩니다.