Kernel

安裝過程中的可載入核心模組日誌記錄問題

  • December 27, 2020

我是LKM程式初學者。

我正在編寫一個簡單的參數可傳遞模組,它獲取命令行參數,然後將它們記錄在警報級別。

問題是我不知道為什麼它不呼叫第二個printk函式hello_start,也許那裡發生了錯誤,但令人驚奇的是它在 unloading( rmmod) 過程中起作用。這是日誌和程式碼:

// 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); 

謝謝你的合作!

你的第二個最後printk()沒有 a \n,而第一個有。

此外,單詞後括號內的數字kernel:是以秒為單位的系統正常執行時間,因此看起來第二條消息實際上是在與第一條消息相同的一秒內生成的。

我的第一個假設是缺少的\n行終止符導致正在讀取核心消息緩衝區的程序等待以防更多文本即將到達,並且消息的其餘部分僅\n在第三個之後由使用者空間日誌記錄守護程序處理消息表示收到了完整的行。

在核心消息緩衝區(參見dmesg命令)中,括號中的正常執行時間通常是消息的第一個元素:人類可讀的時間戳、主機名和單詞kernel:由用於讀取核心消息緩衝區和注入核心的任何日誌系統添加消息到使用者空間日誌流中。

因此,請嘗試添加\n到第二條消息的末尾,如下所示:

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

引用自:https://unix.stackexchange.com/questions/626351