亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Linux內核模塊初始化的過程是怎樣的

發布時間:2021-10-15 09:17:13 來源:億速云 閱讀:147 作者:柒染 欄目:編程語言

Linux內核模塊初始化的過程是怎樣的,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

一、代碼

       模塊1導出了函數void  output(void),模塊2調用了模塊1中的函數。(先加載模塊1,再加載模塊2

       模塊1:

#include <linux/module.h>
#include <linux/kernel.h>


//
static int int_var = 0;
module_param(int_var, int, 0644);
MODULE_PARM_DESC(int_var, "A integer variable");

static char* str_var = "default";
module_param_named(str_var_alias, str_var, charp, 0644);
MODULE_PARM_DESC(str_var_alias, "A string variable");

static char str_var2[10];
module_param_string(str_var2_alias, str_var2, 10, 0644);
MODULE_PARM_DESC(str_var2_alias, "A string variable");

static int int_arr[10];
int narr;
module_param_array(int_arr, int, &narr, 0644);
MODULE_PARM_DESC(int_arr, "A integer array");

static int int_arr2[10];
int narr2;
module_param_array_named(int_arr2_alias, int_arr2, int, &narr2, 0644);
MODULE_PARM_DESC(int_arr2_alias, "A integer array");


//
static void output(void)
{
    printk("hello world!\n");
}
EXPORT_SYMBOL_GPL(output);


static int __init init_marker(void)
{
    int i;

    printk("init marker.\n");

    //
    printk("int_var:%d\n", int_var);
    printk("str_var:%s\n", str_var);
    printk("str_var2:%s\n", str_var2);
    for (i=0; i<narr; ++i)
    {
        printk("int_arr[%d]=%d\n", i, int_arr[i]);
    }
    for (i=0; i<narr2; ++i)
    {
        printk("int_arr2[%d]=%d\n", i, int_arr2[i]);
    }

    //
    output();

    return 0;
}

static void __exit exit_marker(void)
{
    printk("exit marker.\n");
}


module_init(init_marker);
module_exit(exit_marker);


MODULE_VERSION("1.0.0_0");
MODULE_LICENSE("GPL");
MODULE_AUTHOR("gwy");
MODULE_ALIAS("the alias of module name");
MODULE_DESCRIPTION("the description about the use of the module");
//MODULE_DEVICE_TABLE();

        模塊2:

#include <linux/module.h>
#include <linux/kernel.h>


static void my(void)
{
    extern void output(void);
    output();
    printk("my\n");
}

static int __init init_marker(void)
{
    printk("init marker.\n");


        
    my();

    return 0;
}

static void __exit exit_marker(void)
{
    printk("exit marker.\n");
}


module_init(init_marker);
module_exit(exit_marker);


MODULE_VERSION("1.0.0_0");
MODULE_LICENSE("GPL");
MODULE_AUTHOR("gwy");
MODULE_ALIAS("the alias of module name");
MODULE_DESCRIPTION("the description about the use of the module");
//MODULE_DEVICE_TABLE();

二、初始化

2.1  函數原型

        static int __init init_marker(void)

        { 

        }

        static void __exit exit_marker(void)

        {

        }

        初始化函數,在定義文件之外沒有任何意義,所以應聲明為static。

        __init(__exit)表名該函數只在初始化期間使用。在模塊裝載之后,模塊裝載器會將初始化函數丟掉,這樣可以將函數占用的內存釋放出來。

2.2 關于模塊的描述

        MODULE_VERSION("1.0.0_0"); 

            模塊版本號

        MODULE_LICENSE("GPL");

            模塊開源協議

        MODULE_AUTHOR("gwy");

            模塊作者

        MODULE_ALIAS("the alias of module name");

            模塊別名

        MODULE_DESCRIPTION("the description about the use of the module");

            模塊描述

        MODULE_PARM_DESC(int_var, "A integer variable");

            參數描述

查看模塊信息:

Linux內核模塊初始化的過程是怎樣的

三、加載/卸載

        insmod

        rmmod

        modprobe ( modprobe -r )

        lsmod(通過讀取/proc/modules虛擬文件來獲取模塊信息)

四、模塊參數

4.1 參數

        module_param(int_var, int, 0644);

            定義模塊參數。

        module_param_named(str_var_alias, str_var, charp, 0644);

            外部參數名稱與內部變量名稱不同。

        module_param_string(str_var2_alias, str_var2, 10, 0644);

            拷貝字符串到分配好的內存。(不同于charp,先分配內存,再拷貝)

        module_param_array(int_arr, int, &narr, 0644);

            定義模塊數組類型參數。

        module_param_array_named(int_arr2_alias, int_arr2, int, &narr2, 0644);

            數組類型 外部參數名稱與內部變量名稱不同。

        MODULE_PARM_DESC(int_var, "A integer variable");

            參數描述。

4.2 支持的類型

        bool

        invbool 

            布爾值(true或false),關聯的變量是int型。

        charp 

            字符指針值。內核會為用戶提供的字符串分配內存,并設置相應的指針。

        int、short、long、uint、ushort、ulong

4.3 訪問權限

        module_param(int_var, int, 0644); 

        0644是訪問權限,用數字表示,或者用S_IRUGO|S_IWUSR表示。

        查看訪問權限:/sys/module/test/parameters

Linux內核模塊初始化的過程是怎樣的

4.4 查看模塊的參數

        modinfo查看,見2.2中圖片。

五、導出符號表

        模塊層疊技術

5.1 導出函數

        EXPORT_SYMBOL(func)

        EXPORT_SYMBOL_GPL(func) 

            EXPORT_SYMBOL_GPL導出的模塊只能被GPL許可的模塊使用。

5.2 查看導出的符號

        /proc/kallsyms

5.3 調用模塊導出符號

        需要在模塊2的Makefile中添加:KBUILD_EXTRA_SYMBOLS = /opt/test-kernel/Module.symvers(模塊1的路徑,必須是絕對路徑), 否則會報錯。

        參考資料:http://blog.csdn.net/hshl1214/article/details/8769112

六、錯誤處理

        如果可以繼續,通過降低功能繼續運轉。

        如果不能繼續,必須撤銷所有已經注冊的設備。

            goto、cleanup/flag。

            撤銷順序與加載順序相反。

七、模塊裝載競爭

        模塊還沒初始化完的時候,內核就有可能來調用我們的模塊了。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南投县| 淮南市| 蒲城县| 田林县| 山丹县| 克东县| 苗栗市| 吉首市| 湟中县| 马鞍山市| 乌拉特后旗| 车险| 长子县| 祁东县| 香格里拉县| 潍坊市| 隆安县| 巩留县| 区。| 丰原市| 花莲县| 汉沽区| 体育| 西乌珠穆沁旗| 西林县| 泰和县| 原平市| 前郭尔| 西充县| 南平市| 民丰县| 宝兴县| 汪清县| 麟游县| 永兴县| 行唐县| 德州市| 娄烦县| 青阳县| 曲沃县| 郑州市|