kernel 에서 64 bits 나눗셈 및 나머지 연산
글쓴이: mini7662 / 작성시간: 수, 2006/11/01 - 11:42오전
안녕하세요...
커널 모듈 프로그래밍을 하다가 문제가 생겨서
고수님들에게 도움을 청합니다.
모듈에서 64 bits(unsigned long long 타입) 나눗셈(/) 및 나머지(%) 연산을
하는 부분이 있는데 이걸 그냥 링크할 경우,
__udivdi3 와 __umoddi3 에 대해 unresolved symbol 에러가 나는데요,
인터넷에서 관련글(http://www.mail-archive.com/rtl@fsmlabs.com/msg00591.html)을
참고해서 kernel 2.4 에서는 Makefile 에서 링크시에
ld -r -o $(TARGET) $(OBJ) `$(CC) -print-libgcc-file-name`
로해서 libgcc.a 를 static 링크해서 해결했습니다.
그런데 문제는... kernel 2.6 용으로도 만들어야 하는데,
kernel 2.6 에서 모듈을 빌드하기 위해서
kbuild 를 써야 하는데,
KLDP 위키의 관련글(http://wiki.kldp.org/wiki.php/DocbookSgml/KBUILD)를
참고해서 EXTRA_LDFLAGS += `$(CC) -print-libgcc-file-name` 를
kbuild Makefile 에 넣어줬습니다만,
여전히 symbol 에러가 납니다.
링크시에 libgcc.a 를 들고가면 해결될것 같은데
EXTRA_LDFLAGS 가 그 역할을 하는 건지 모르겠네요.
Forums:
자답
자답 :
#include <asm/div64.h> /* kernel 2.4 , 2.6 공통 */
...
unsigned long remainder;
#if 0 /* 기존 */
if( x % y == 0 )
#else /* 변경 */
remainder = do_div( x, y );
if( remainder == 0 )
#endif
{
...
}
2.6이 나눗셈 연산을
2.6이 나눗셈 연산을 허용하지 않는것으로 알고 있습니다.
저는 예전에 작성했던 2.4용 코드를 2.6으로 포팅할때 이 문제를 봤는데
그때는 glibc 라이브러리로 부터 __udivdi3 와 __umoddi3등등의 함수모두를 header 파일로 포함시켰었습니다.
엄청 무식한 방법이였죠. 시프팅 연산으로 해결할수도 있었겠지만 시도해 보지 않았구요
혹시나 해서 그때 사용했던 해더 파일을 드립니다.
floatingop.h
만 추가하시면 됩니다.
아마 다음분이 더 좋은 해결책을 주실거라 믿으므로 패스~
Dig it.
감사합니다...^^
a287848님, 말씀 감사합니다...^^
64bits 나눗셈/나머지 연산은
에 do_div()로 해결하는 것이
젤 깔끔할 것 같네요...
mod = do_div( x, y ); 에서
x = x/y 가 되는 것만 조심하면요...
x 를 계속 유지해야할 경우엔,
tmp = x;
remainder = do_div( tmp, y );
로 해야합니다...^^;
댓글 달기