iT邦幫忙

DAY 6
0

Linux kernel模組的開發系列 第 6

不同的 module init 與 cleanup 做法

在 Hello World 的例子中提到,init_module() 與 cleanup_module() 都是 kernel module 中兩個基本需要的函數,實際上在 Linux kernel 2.4 之後,使用習慣上已經被分別被 module_init() 與 module_exit() 兩個巨集所取代。這兩個巨集被定義在 linux/init.h 中,所以必須額外 include 他才行。另外,你必須在使用這兩個巨集前先定義 init 與 cleanup 函數。

/*  
 *  hello-2.c - Demonstrating the module_init() and module_exit() macros.
 *  This is preferred over using init_module() and cleanup_module().
 */
#include <linux/module.h>    /* Needed by all modules */
#include <linux/kernel.h>    /* Needed for KERN_INFO */
#include <linux/init.h>        /* Needed for the macros */

static int __init hello_2_init(void)
{
    printk(KERN_INFO "Hello, world 2\n");
    return 0;
}

static void __exit hello_2_exit(void)
{
    printk(KERN_INFO "Goodbye, world 2\n");
}

module_init(hello_2_init);
module_exit(hello_2_exit);

還有另一個__initdata 巨集的用法,他的意義跟 __init 巨集一樣,只不過是針對變數而不是函數。

/*  
 *  hello-3.c - Illustrating the __init, __initdata and __exit macros.
 */
#include <linux/module.h>    /* Needed by all modules */
#include <linux/kernel.h>    /* Needed for KERN_INFO */
#include <linux/init.h>        /* Needed for the macros */

static int hello3_data __initdata = 3;

static int __init hello_3_init(void)
{
    printk(KERN_INFO "Hello, world %d\n", hello3_data);
    return 0;
}

static void __exit hello_3_exit(void)
{
    printk(KERN_INFO "Goodbye, world 3\n");
}

module_init(hello_3_init);
module_exit(hello_3_exit);

上一篇
執行 kernel module
下一篇
送參數到 module 中
系列文
Linux kernel模組的開發30

尚未有邦友留言

立即登入留言