어플리케이션이라면 dl 라이브러리가 그 역할을 해준다고 알고있습니다. open함수를 호출했다면 open함수의 주소를 dl 라이브러리가 찾아주는것같은데요...
커널모듈에서 커널함수를 호출했을때는 어떻게 그 함수의 주소를 알수있는지 알고싶습니다. 예를들어 register_chrdev 이런류의 함수를 호출했을때요...
감사드립니다. :o
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 섹션 내의 심볼에 해당하는 주소값을 설정하게 됩니다.
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
EXPORT_SYMBOL
register_chrdev() 함수는 커널이 빌드될 때
EXPORT_SYMBOL() 매크로를 통해 __ksymtab 섹션에
자신의 주소와 심볼명(스트링)을 등록합니다. (struct kernel_symbol)
모듈이 로드될 때는 내부적으로 simplify_symbols() 함수를 호출하는데
이 함수는 자신의 심볼 테이블을 검사하여 정의되지 않은 심볼의 경우
직접 커널의 __ksymtab 섹션 내의 심볼에 해당하는 주소값을 설정하게 됩니다.
댓글 달기