insmod 프로세스 중 로드 가능한 커널 모듈 로깅 문제

insmod 프로세스 중 로드 가능한 커널 모듈 로깅 문제

저는 프로그래밍 초보자입니다 LKM.

저는 명령줄 인수를 가져와 이를 경고 수준에 기록하는 간단한 인수 전달 가능 모듈을 작성하고 있습니다.

printk문제는 왜 함수 의 두 번째 함수를 호출하지 않는지 알 수 없다는 것입니다 hello_start. 어쩌면 거기에서 오류가 발생할 수도 있지만 놀랍게도 rmmodunload() 중에 작동합니다. 로그와 코드는 다음과 같습니다.

// insmod thetestmodule.ko yes_no=1
Dec 26 20:25:31 duckduck kernel: [  995.877225] Hi darcy. I'm now alive!
// Expect the argument here.

// rmmod thetestmodule
Dec 26 20:26:11 duckduck kernel: [  995.877230] This is the passed argument: 1
Dec 26 20:26:11 duckduck kernel: [ 1035.956640] Understood. Bye.
#include <linux/module.h>  
#include <linux/kernel.h>      
#include <linux/init.h>       
#include <linux/moduleparam.h>

#define AUTHOR "Darcy"

MODULE_LICENSE("GPL"); 
MODULE_AUTHOR(AUTHOR); 
MODULE_DESCRIPTION("OH. Kernel log, ALERT LEVEL O_o");
MODULE_VERSION("0.1"); 

static int short yes_no;
module_param(yes_no , short ,0);
MODULE_PARM_DESC(yes_no, "Enter 0 or 1 to say if you want the module be loaded in rescue mode.");

static int __init hello_start(void) 
{ 
    printk(KERN_ALERT "Hi darcy. I\'m now alive!\n"); 
    printk(KERN_ALERT "This is the passed argument: %d" , yes_no); 
    return 0; 
} 
  
static void __exit hello_end(void) 
{ 
    printk(KERN_INFO "Understood. Bye.\n"); 
    return NULL;
} 
  
module_init(hello_start); 
module_exit(hello_end); 

도와 주셔서 감사합니다!

답변1

두 번째 끝에는 a가 없지만 printk()첫 번째 끝에는 a가 있습니다.\n

또한 단어 뒤의 괄호 안의 숫자는 kernel:시스템 가동 시간(초)이므로 두 번째 메시지가 실제로 첫 번째 메시지와 동일한 시간에 생성된 것처럼 보입니다.

내 첫 번째 가설은 행 종결 자가 누락되어 더 많은 텍스트가 도착할 경우를 대비해 커널 메시지 버퍼를 읽는 프로세스가 기다리게 하고 메시지의 나머지 부분은 \n세 번째 텍스트 이후에만 사용자 공간 로그 데몬에 의해\n 처리된다는 것입니다. 전체 행이 수신되었음을 나타냅니다.

커널 메시지 버퍼(명령 참조 dmesg)에서 괄호 안의 가동 시간은 일반적으로 메시지의 첫 번째 요소입니다. 사람이 읽을 수 있는 타임스탬프, 호스트 이름, kernel:커널 메시지 버퍼를 읽고 이를 커널에 삽입하는 데 사용되는 단어입니다. 사용자 공간 로그 스트림에 메시지를 추가합니다.

\n따라서 두 번째 메시지 끝에 다음과 같이 추가해 보세요 .

printk(KERN_ALERT "This is the passed argument: %d\n" , yes_no); 

관련 정보