kernel 에서 64 bits 나눗셈 및 나머지 연산

mini7662의 이미지

안녕하세요...
커널 모듈 프로그래밍을 하다가 문제가 생겨서
고수님들에게 도움을 청합니다.

모듈에서 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 가 그 역할을 하는 건지 모르겠네요.

mini7662의 이미지

자답 :

#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
{
...
}

a287848의 이미지

2.6이 나눗셈 연산을 허용하지 않는것으로 알고 있습니다.
저는 예전에 작성했던 2.4용 코드를 2.6으로 포팅할때 이 문제를 봤는데
그때는 glibc 라이브러리로 부터 __udivdi3 와 __umoddi3등등의 함수모두를 header 파일로 포함시켰었습니다.
엄청 무식한 방법이였죠. 시프팅 연산으로 해결할수도 있었겠지만 시도해 보지 않았구요
혹시나 해서 그때 사용했던 해더 파일을 드립니다.
floatingop.h
만 추가하시면 됩니다.

아마 다음분이 더 좋은 해결책을 주실거라 믿으므로 패스~

Dig it.

mini7662의 이미지

a287848님, 말씀 감사합니다...^^

64bits 나눗셈/나머지 연산은
에 do_div()로 해결하는 것이
젤 깔끔할 것 같네요...

mod = do_div( x, y ); 에서
x = x/y 가 되는 것만 조심하면요...

x 를 계속 유지해야할 경우엔,
tmp = x;
remainder = do_div( tmp, y );
로 해야합니다...^^;

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.