2017-11-11 11 views
-1

저는 커널 모듈 개발과 관련하여 새로운 것으로, 오늘 첫 번째 커널 모듈을 작성하기로 결정했습니다.커널 모듈로드로 인해 버그가 발생합니다.

my 모듈은 2 개의 숫자를 입력으로 받아 공백으로 구분하여 함께 추가합니다.

커널 모듈은 출력 돌아와 새로운 입력 (공백으로 구분이 개 번호)

을주는 것 그 파일에 기록이있을 것이다 그래서 파일 읽기, 발동 항목 이름 CALC (/ proc 디렉토리/CALC)를 통해 통신

모듈을로드 할 때 (insmod) 쉘이 멈추거나 dmesg를 볼 때 커널 버그 행 here is the trace이 표시됩니다.

이것이 내 코드의 버그인지, 아니면 리눅스 커널의 실제 버그인지 확실치 않으며, 내가 뭘 잘못했는지 이해하고 싶습니다. 어떻게 제 모듈을 디버깅을 시작할 수 있습니까? dmesg 로그.

here is the source code of my module. 사전에

내 메이크가 매우 표준이다,

obj-m += calc.o 
KDIR := /lib/modules/$(shell uname -r)/build 

all: 
    $(MAKE) -C $(KDIR) M=$(PWD) modules 

clean: 
    $(MAKE) -C $(KDIR) M=$(PWD) clean 

많은 많은 감사합니다!

편집 : 나는 우분투 16.04.02, 릴리스 4.10.0-28 꽤 표준을 사용하고 있습니다.

+0

로 변경해야합니다, 드라이버 및 추적의 코드는 텍스트로 질문 자체 **에 **해야한다 연결되지 않았습니다. – Tsyvarev

+0

확인, 감사합니다. 다음 번에 더 잘 아는 것 –

답변

0

장치 파일을 만들었습니까? 먼저 내 시스템에 명령

[email protected]:~/dd/char1# mknod /dev/my_device c 300 0 

이하로 사용하여 장치 파일을 만들 경우

[email protected]:~/s_flow/dd# ls -l /dev/my_device 

은 (우분투 14.04은)는 다음과 같이 모두 좋다.

[email protected]:~/s_flow/dd# dmesg 
[ 519.751941] calc: module verification failed: signature and/or required key missing - tainting kernel 
[ 519.752368] Calculator initializing 
[ 519.752372] Initializing proc entry at /proc/calc 
[ 519.752380] initialized calc proc entry 
[ 519.752384] mallocing last_message for 128 bytes 
[ 519.752386] malloc finished, resetting calc 
[ 519.752389] calc reset, all good : 

이 모듈을 사용하는 응용 프로그램 세부 정보를 제공 할 수 있습니까?

+0

나는 왜 고개를 끄덕 댈 필요가 있는지, 신경 써야 할 지 모르겠다. p.s 도움이되지는 않았지만 dmesg에 어떤 로그도 갖지 못했습니다. –

0

문제는 성명 last_message = ""; 잘못되었습니다. 포인터 last_message에 유효하지 않은 메모리 주소를 지정하고 있습니다. OOPS가오고있는 이유입니다. last_message이

static void reset_calc(void) { 
    last_message_size = 0; 
    last_message = ""; 
    last_message_type = WAS_LAST_READ; // we expect the first action to  be write 
    } 

같이 변경해야합니다은 스택 오버플로 규칙에 따르면

memset(last_message,0,MAX_MESSAGE_SIZE);