當然可以在載入 module 的同時帶參數進去,只不過不是用傳統的 argc/argv 的方式。在 Linux kernel 中,必須藉助 module_param() 巨集 (定義在 linux/moduleparam.h 中) 來達成。
根據定義,module_param(name,type,perm) 有三個參數,分別是變數名稱、變數的資料型別,以及其對應 sysfs 檔案的權限。例如: module_param(myint, int, 0); 代表變數名稱是 myinit,其資料型別為 init,而權限設為 0 則代表沒有 sysfs 項目。至於 sysfs 是甚麼,為了避免跳痛,下次再詳談。簡單的說,sysfs 是 Linux 所採用的一種虛擬檔案系統,其功能就是為了要傳遞 kernel module 的資訊。
先來看例子,下面這支程式姑且叫做 hello-param2.c,主要是用來示範如何帶入字串到 module 中並顯示出來。變數 who 的預設值是 "World",所以如果沒有帶入參數時,預設會輸出 "Hello World" 以及 "Goodbye World"。
#include <linux/init.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
static char *who= "World";
module_param(who, charp, 0);
static int hello_init(void)
{
printk(KERN_INFO "Hello, %s!\n", who);
return 0;
}
static void hello_exit(void)
{
printk(KERN_INFO "Goodbye, %s!\n", who);
}
module_init(hello_init);
module_exit(hello_exit);
Make 完之後 (記得修改之前的 Makefile),透過 modinfo 可以看到這個 module 帶有一個參數,變數名稱是 who,變數型態是 charp (who:charp):
[root@Pomelo-14-61 LKMP]# modinfo hello-param2.ko
filename: hello-param2.ko
srcversion: EE5675FFF077444D49D7DB2
depends:
vermagic: 2.6.32-279.22.1.el6.x86_64 SMP mod_unload modversions
parm: who:charp
在預設情況下,不帶參數的載入 module 會輸出 Hello, World!;卸載時輸出 Goodbye, World!
[root@Pomelo-14-61 LKMP]# insmod hello-param2.ko
[root@Pomelo-14-61 LKMP]#
[root@Pomelo-14-61 LKMP]# tail -1 /var/log/messages
Oct 6 11:10:23 Pomelo-14-61 kernel: Hello, World!
[root@Pomelo-14-61 LKMP]#
[root@Pomelo-14-61 LKMP]# rmmod hello-param2
[root@Pomelo-14-61 LKMP]# tail -1 /var/log/messages
Oct 6 11:10:57 Pomelo-14-61 kernel: Goodbye, World!
如果帶入參數 who=”Linux”,所以載入會輸出 Hello, Linux!,卸載輸出 Goodbye, Linux!
[root@Pomelo-14-61 LKMP]# insmod hello-param2.ko who="Linux"
[root@Pomelo-14-61 LKMP]#
[root@Pomelo-14-61 LKMP]# tail -1 /var/log/messages
Oct 6 11:14:42 Pomelo-14-61 kernel: Hello, Linux!
[root@Pomelo-14-61 LKMP]#
[root@Pomelo-14-61 LKMP]# rmmod hello-param2
[root@Pomelo-14-61 LKMP]#
[root@Pomelo-14-61 LKMP]# tail -1 /var/log/messages
Oct 6 11:14:58 Pomelo-14-61 kernel: Goodbye, Linux!
[root@Pomelo-14-61 LKMP]#