91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

宿州市| 镇安县| 酒泉市| 偃师市| 仁怀市| 清丰县| 搜索| 古蔺县| 永泰县| 呼图壁县| 长岛县| 沾化县| 宾川县| 长汀县| 岗巴县| 山阴县| 湘阴县| 手机| 淮安市| 台江县| 马公市| 通化市| 图们市| 荣昌县| 平凉市| 贺兰县| 叶城县| 镇远县| 洛宁县| 通河县| 腾冲县| 年辖:市辖区| 玛曲县| 炉霍县| 新丰县| 都昌县| 汉沽区| 高陵县| 准格尔旗| 噶尔县| 五台县|