저는 프로그래밍 초보자입니다 LKM
.
저는 명령줄 인수를 가져와 이를 경고 수준에 기록하는 간단한 인수 전달 가능 모듈을 작성하고 있습니다.
printk
문제는 왜 함수 의 두 번째 함수를 호출하지 않는지 알 수 없다는 것입니다 hello_start
. 어쩌면 거기에서 오류가 발생할 수도 있지만 놀랍게도 rmmod
unload() 중에 작동합니다. 로그와 코드는 다음과 같습니다.
// 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);