2014-09-02 2 views
7

라즈베리 파이에서 커널 모듈을 컴파일하려고합니다. 대상 환경에서 컴파일 중입니다. 내가 모듈을 삽입하려고하면, 내가 얻을 충분히커널 모듈을 컴파일 할 때 "__aeabi_ldivmod"가 정의되지 않았습니다.

make -C /lib/modules/3.12.23-1.20140626git25673c3.rpfr20.armv6hl.bcm2708/build M=/home/harmic/horus/ppminput modules 
make[1]: Entering directory `/usr/src/kernels/3.12.23-1.20140626git25673c3.rpfr20.armv6hl.bcm2708' 
    CC [M] /home/harmic/horus/ppminput/ppminput.o 
    Building modules, stage 2. 
    MODPOST 1 modules 
WARNING: "__aeabi_ldivmod" [/home/harmic/horus/ppminput/ppminput.ko] undefined! 
    CC  /home/harmic/horus/ppminput/ppminput.mod.o 
    LD [M] /home/harmic/horus/ppminput/ppminput.ko 
make[1]: Leaving directory `/usr/src/kernels/3.12.23-1.20140626git25673c3.rpfr20.armv6hl.bcm2708' 

물론 :

나는 다음과 같은 출력을 얻을

Sep 2 22:44:26 pidora kernel: [ 7589.354709] ppminput: Unknown symbol __aeabi_ldivmod (err 0) 

에서 :

insmod: ERROR: could not insert module ./ppminput.ko: Unknown symbol in module 

및 시스템 로그에

내 모듈, 문제의 원인이되는 줄을 확인했습니다 :

unsigned int chan_abs_val = tdiff/CHAN_SCALE; 

(여기서 tdiff는 s64이고 CHAN_SCALE은 정수 리터럴입니다.)

내가 사단을 주석 처리하면 문제가 사라집니다. 그건 내 모듈에서 부서를 사용하는 유일한 라인입니다.

약간의 인터넷 검색 결과가이 문제에 대한 언급이되었지만 커널 모듈을 컴파일하는 맥락에서 찾을 수있는 것은 없습니다.

내 메이크 파일은 다음과 같습니다

obj-m += ppminput.o 

all: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 

clean: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 

환경 세부 사항 : 파이는 Pidora 2014 (페도라 20)를 실행

  • 합니다.
  • 커널은 3.12.23-1.20140626git25673c3.rpfr20.armv6hl.bcm2708입니다.
  • gcc는 4.8.2이다.

업데이트

내가 분명히 올바른 용어를 사용하여 검색하지 않았다. Another search은 많은 참조를 구입했지만 해결 방법은 없습니다. 그것들을 읽으면 ARM을 위해 컴파일하려고한다면 커널 내부에서 64 비트 디비전을 수행해서는 안된다는 의견을 얻고 있습니까?

답변

11

대부분의 32 비트 CPU에서 느린 라이브러리 기능을 사용하여 64 비트 나누기를 구현해야합니다. 컴파일러가 느리게 코드를 생성하지 못하도록 Linux는 이러한 기능을 구현하지 않습니다.

64 비트 분할을 수행하려면 명시 적으로해야합니다. do_div()부터 <asm/div64.h>까지 사용하십시오.

+0

안녕하세요! 그리고 모듈러를 만드는 방법? – flav

+3

@flav 질문을하려면 "질문하기"버튼을 사용하십시오. 또는 [documentation] (http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/asm-generic/div64.h)를 먼저 읽으십시오. –

관련 문제