모듈에서 floating 연산을 합니다. 2.6 커널에서 빌드 할수 있는
글쓴이: a287848 / 작성시간: 월, 2005/03/28 - 8:04오후
floating 연산을 하는 모듈을 만들고 컴파일 하는데
2.6 에서 floating 연산을 2.6 에서 허용하지 않는 문제 때문에
컴파일이 안됩니다. 벌써 2 주 정도 된것 같은데, 이문제 때문에
진척이 없습니다.
에러 메시지는
MODPOST
*** Warning: "__moddi3" [drivers/dmc/dmc_module.ko] un defined !
*** Warning: "__adddf3" [drivers/dmc/dmc_module.ko] un defined !
*** Warning: "__divdf3" [drivers/dmc/dmc_module.ko] un defined !
*** Warning: "__muldf3" [drivers/dmc/dmc_module.ko] un defined !
...
이렇게 뜹니다.
make option 에서 -msoft-float 를 넣어도 에러가 나오네요.
해결해본신적 있으신분 부탁 드립니다.^^
Forums:
1. 가장 좋은 방법은 floating point를 사용하지 않는 것입니
1. 가장 좋은 방법은 floating point를 사용하지 않는 것입니다. 특별한 이유가 있지 않다면 정수 연산으로 대체할 수 있습니다. 예를 들어 x / 3 에서 소수점 둘째자리까지 결과를 얻고 싶다면 소수점 위는 x / 3, 소수점 아래는 (x * 100) % 3 같이 계산할 수 있습니다.
2. 커널은 FPU 레지스터를 저장하기 않기 때문에 FPU 레지스터를 사용해서는 안되지만 다음과 같이 사용할 수도 있습니다.
kernel_fpu_begin()
FPU를 이용한 연산
kernel_fpu_end()
3. FPU를 이용하지 않고 software floating point 연산을 사용하는 것도 좋은 방법입니다. 이 경우 software floating point library가 모듈에 static link가 되어야 합니다. 위의 경우 link 에러가 뜨는 것은 C library와 모듈이 link가 되지 않기 때문입니다.
추가로 질문 드려 봅니다.
답변 주셔서 너무 감사드립니다.
다만 아직도 해결이 안되서 다시한번 질문을 드려야 겠습니다.
일단 어떻게 해서든지 Floating 연산을 해야 하는 경우 입니다
그리고 floating 연산에 log 를 사용하기 때문에 사실상 정수로의 대체는 불가능
하고요.-.- GCC 라이브러리를 정적 링크 시키려고 하는데
원하는데로 안되네요
제가만드는 외부 모듈은 dmc_module.c 입니다.
make file
마지막에 제가 ld 를 사용해서 정적 링크 시키려는데 경로가 잘못되어도
확인을 안하네요. 예를들어 libgcc.a 를 libgcccccccc.a 라고 잘못주어도 에러가 안나타납니다. 어떻게 해결해여 할까요? 내일이 deadline 입니다. -.-
Dig it.
제가 답변을 드렸을 때는 그런 의미가 아니었는데... :-) li
제가 답변을 드렸을 때는 그런 의미가 아니었는데... :-)
libgcc나 C library를 링크할려고 하지 마시고, 필요한 소스만 가져와서 프로젝트에 추가를 하세요. glibc 소스에서 원하는 소스 파일을 찾을 수 있습니다. 예를 들어 __divdf3은 soft-fp/divdf3.c에 구현되어 있습니다. 소스를 조금만 고치면 커널 모듈에 붙일 수 있을 것입니다. log같은 다른 math function도 필요하면 glibc나 uClibc 같은 다른 library 소스에서 찾을 수 있을 것입니다.
Freedom is another word for nothing left to lose,
Nothing doesn't mean nothing if it ain't free.
답변 감사드립니다.^^ 덕분에 해결되었습니다.
겨우 deadline 지켰네요
저의 스케쥴링 정책은 deadline 인가 봅니다.
anticipatory 도 괜찮을듯 한데.^^
Dig it.
댓글 달기