0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

內(nèi)核模塊依賴什么意思

麥辣雞腿堡 ? 來源:嵌入式Linux充電站 ? 作者:Vincent ? 2023-09-26 16:51 ? 次閱讀

通常情況下,一個模塊只使用內(nèi)核導出的符號,自己不導出符號。但是如果一個模塊需要提供全局變量或函數(shù)給另外的模塊使用,那么就需要將這些符號導出。

這在一個驅(qū)動調(diào)用另一個驅(qū)動代碼時比較常見,這樣模塊和模塊之間就形成了依賴關(guān)系,使用導出符號的模塊將會依賴于導出符號的模塊。

舉個具體的例子,下面是兩個C文件,vser.c調(diào)用了dep.c中的變量和函數(shù):

vser.c

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

extern int expval;
extern void expfun(void);

static int __init vser_init(void)
{
 printk("vser_init");
 printk("expval:%dn", expval);
 expfun();
 
 return 0;
}

static void __exit vser_exit(void)
{
 printk("vser_exitn");
}

module_init(vser_init);
module_exit(vser_exit);

dep.c

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

static int expval = 5;
EXPORT_SYMBOL(expval);

static void expfun(void)
{
 printk("expfun");
}EXPORT_SYMBOL_GPL(expfun);

Makefile關(guān)鍵處:

obj-m := vser.o
obj-m += dep.o

上述代碼中,dep.c定義了一個變量expval和一個函數(shù)expfun,并分別用EXPORT_SYMBOLEXPORT_SYMBOL_GPL導出。而vser.c里則調(diào)用了dep.c的變量和函數(shù),編譯安裝后:

# modprobe vser
# dmesg
[58278.204677] vser_init
[58278.204683] expval:5
[58287.206464] expfun

從輸出信息中可以看到,vser.c正確引用到了dep.c的變量和函數(shù)。

這里有三點重要說明:

  • 如果使用insmod命令加載模塊,則必須先加載dep模塊,再加載vser模塊

因為vser模塊用到了dep模塊的東西。從這里可以看出,modprobe命令優(yōu)于insmod命令的地方在于其可以自動加載被依賴的模塊。而這又要歸功于depmod命令,depmod命令會生成模塊的依賴信息,保存在/lib/modules/5.10.111-64-generic/modules.dep文件中。其中,5.10.111-64-generic是內(nèi)核源碼版本。查看該文件可以發(fā)現(xiàn)vser模塊所依賴的模塊。

# cat /lib/modules/5.10.111-64-generic/modules.dep
......
extra/vser.ko: extra/dep.ko
extra/dep.ko:
  • 兩個模塊存在依賴關(guān)系,如果分別編譯兩個模塊,會出現(xiàn)類似下面的警告信息,并且即便加載順序正確,加載也不會成功 :
WARNING: "expfun" [/home/ubuntu/driver/module/vser.ko] undefined!
WARNING: "expval" [/home/ubuntu/driver/module/vser.ko] undefined!

# sudo insmod dep.ko
# sudo insmod vser.ko
insmod:error inserting 'vser.ko': -1 Invalid parameters

這是因為在編譯vser模塊時在內(nèi)核的符號表中找不到expvalexpfun的項,而vser模塊又完全不知道dep模塊的存在。

解決這個問題的方法是將兩個模塊放在一起編譯,或者將dep模塊放在內(nèi)核源碼中,先在內(nèi)核源碼下編譯完所有的模塊,再編譯vser模塊。

  • 卸載模塊時要先卸載vser模塊,再卸載dep模塊,否則會因為dep模塊被vser模塊使用而不能卸載 。

內(nèi)核將會創(chuàng)建模塊依賴關(guān)系的鏈接,只有當依賴于這個模塊的鏈表為空時,模塊才能被卸載.

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 模塊
    +關(guān)注

    關(guān)注

    7

    文章

    2713

    瀏覽量

    47485
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1372

    瀏覽量

    40293
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11304

    瀏覽量

    209535
收藏 人收藏

    評論

    相關(guān)推薦

    linux 了解內(nèi)核模塊的原理 《Rice linux 學習開發(fā)》

    內(nèi)核模塊是一種沒有經(jīng)過鏈接,不能獨立運行的目標文件,是在內(nèi)核空間中運行的程序。
    的頭像 發(fā)表于 07-16 10:08 ?4670次閱讀
    linux 了解<b class='flag-5'>內(nèi)核模塊</b>的原理 《Rice linux 學習開發(fā)》

    Linux 內(nèi)核模塊工作原理及內(nèi)核模塊編譯案例

    一個內(nèi)核模塊至少包含兩個函數(shù),模塊被加載時執(zhí)行的初始化函數(shù)init_module()和模塊被卸載時執(zhí)行的結(jié)束函數(shù)cleanup_module()。
    發(fā)表于 09-23 09:39 ?2508次閱讀
    Linux <b class='flag-5'>內(nèi)核模塊</b>工作原理及<b class='flag-5'>內(nèi)核模塊</b>編譯案例

    Linux內(nèi)核模塊間通訊方法

    Linux內(nèi)核模塊間通訊方法非常的多,最便捷的方法莫過于函數(shù)或變量符號導出,然后直接調(diào)用。默認情況下,模塊模塊之間、模塊內(nèi)核之間的全局變
    發(fā)表于 06-07 16:23 ?2557次閱讀
    Linux<b class='flag-5'>內(nèi)核模塊</b>間通訊方法

    Linux內(nèi)核模塊程序結(jié)構(gòu)

    Linux設備驅(qū)動會以內(nèi)核模塊的形式出現(xiàn),因此,學會編寫Linux內(nèi)核模塊編程是學習Linux設備驅(qū)動的先決條件。一個Linux內(nèi)核模塊主要由如下幾個部分組成: (1)模塊加載函數(shù)(一
    發(fā)表于 05-27 09:36

    Linux內(nèi)核模塊簡介

    :用來顯示當前系統(tǒng)中所有正在運行的模塊信息。4.ksyms:用來顯示內(nèi)核符號和模塊符號表信息。5.depmod:處理可加載內(nèi)核模塊依賴關(guān)系
    發(fā)表于 08-22 09:22

    內(nèi)核模塊的原理以及其模塊編寫

    內(nèi)核模塊是具有獨立功能的程序。它可以被單獨編譯,但是不能單獨運行,它的運行必須被鏈接到內(nèi)核作為內(nèi)核的一部分在內(nèi)核空間中運行。
    的頭像 發(fā)表于 01-02 11:11 ?4507次閱讀
    <b class='flag-5'>內(nèi)核模塊</b>的原理以及其<b class='flag-5'>模塊</b>編寫

    什么是內(nèi)核模塊?如何編寫一個簡單的模塊?

    內(nèi)核模塊是Linux內(nèi)核向外部提供的一個插口,其全稱為動態(tài)可加載內(nèi)核模塊(Loadable Kernel Module,LKM),我們簡稱為模塊。Linux
    發(fā)表于 08-24 17:15 ?20次下載

    什么是 Linux 內(nèi)核模塊?

    lsmod 命令能夠告訴你當前系統(tǒng)上加載了哪些內(nèi)核模塊,以及關(guān)于使用它們的一些有趣的細節(jié)。
    的頭像 發(fā)表于 08-09 17:01 ?3248次閱讀

    嵌入式LINUX系統(tǒng)內(nèi)核內(nèi)核模塊調(diào)試教程

    本文檔的主要內(nèi)容詳細介紹的是嵌入式LINUX系統(tǒng)內(nèi)核內(nèi)核模塊調(diào)試教程。
    發(fā)表于 11-06 17:32 ?21次下載
    嵌入式LINUX系統(tǒng)<b class='flag-5'>內(nèi)核</b>和<b class='flag-5'>內(nèi)核模塊</b>調(diào)試教程

    如何在Petalinux創(chuàng)建Linux內(nèi)核模塊?

    創(chuàng)建內(nèi)核模塊 Petalinux可以幫助工程師簡化內(nèi)核模塊的創(chuàng)建工作。在petalinux工程目錄下,使用命令“ petalinux-create -t modules --name
    的頭像 發(fā)表于 03-02 11:10 ?4377次閱讀

    Asterisk內(nèi)核模塊介紹

    主要闡述Asterisk內(nèi)核模塊的基礎知識。
    發(fā)表于 03-17 13:47 ?7次下載

    嵌入式LINUX系統(tǒng)內(nèi)核內(nèi)核模塊調(diào)試

    嵌入式LINUX系統(tǒng)內(nèi)核內(nèi)核模塊調(diào)試(嵌入式開發(fā)和硬件開發(fā))-嵌入式LINUX系統(tǒng)內(nèi)核內(nèi)核模塊調(diào)試? ? ? ? ? ? ? ? ?
    發(fā)表于 07-30 13:55 ?10次下載
    嵌入式LINUX系統(tǒng)<b class='flag-5'>內(nèi)核</b>和<b class='flag-5'>內(nèi)核模塊</b>調(diào)試

    什么是內(nèi)核模塊簽名?內(nèi)核如何開啟模塊簽名

    驅(qū)動可以直接編譯進內(nèi)核鏡像,也可以單獨編譯成ko文件(內(nèi)核模塊),然后再進行加載。內(nèi)核從3.7后開始支持模塊簽名,該功能使能以后,內(nèi)核只允許
    發(fā)表于 08-08 16:14 ?1177次閱讀

    Linux內(nèi)核模塊參數(shù)傳遞與sysfs文件系統(tǒng)

    函數(shù)傳參的內(nèi)核傳參機制,編寫內(nèi)核程序時只要實現(xiàn)傳參接口,用戶在加載內(nèi)核模塊時即可傳入指定參數(shù),使得內(nèi)核模塊更加靈活。
    發(fā)表于 06-07 16:23 ?2140次閱讀

    深入分析Linux kernel安全特性: 內(nèi)核模塊簽名

    顧名思義,在開啟該功能之后,內(nèi)核在加載內(nèi)核模塊時,會對內(nèi)核模塊的簽名進行檢查。
    的頭像 發(fā)表于 10-18 12:32 ?4840次閱讀