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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

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

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

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

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

舉個(gè)具體的例子,下面是兩個(gè)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定義了一個(gè)變量expval和一個(gè)函數(shù)expfun,并分別用EXPORT_SYMBOLEXPORT_SYMBOL_GPL導(dǎo)出。而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ù)。

這里有三點(diǎn)重要說明:

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

因?yàn)関ser模塊用到了dep模塊的東西。從這里可以看出,modprobe命令優(yōu)于insmod命令的地方在于其可以自動(dòng)加載被依賴的模塊。而這又要?dú)w功于depmod命令,depmod命令會(huì)生成模塊的依賴信息,保存在/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:
  • 兩個(gè)模塊存在依賴關(guān)系,如果分別編譯兩個(gè)模塊,會(huì)出現(xiàn)類似下面的警告信息,并且即便加載順序正確,加載也不會(huì)成功 :
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

這是因?yàn)樵诰幾gvser模塊時(shí)在內(nèi)核的符號(hào)表中找不到expvalexpfun的項(xiàng),而vser模塊又完全不知道dep模塊的存在。

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

  • 卸載模塊時(shí)要先卸載vser模塊,再卸載dep模塊,否則會(huì)因?yàn)閐ep模塊被vser模塊使用而不能卸載 。

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

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

    關(guān)注

    7

    文章

    2628

    瀏覽量

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

    關(guān)注

    3

    文章

    1350

    瀏覽量

    40156
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11177

    瀏覽量

    208497
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    本文檔的主要內(nèi)容詳細(xì)介紹的是嵌入式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可以幫助工程師簡(jiǎn)化內(nèi)核模塊的創(chuàng)建工作。在petalinux工程目錄下,使用命令“ petalinux-create -t modules --name
    的頭像 發(fā)表于 03-02 11:10 ?4252次閱讀

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

    主要闡述Asterisk內(nèi)核模塊的基礎(chǔ)知識(shí)。
    發(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ū)動(dòng)可以直接編譯進(jìn)內(nèi)核鏡像,也可以單獨(dú)編譯成ko文件(內(nèi)核模塊),然后再進(jìn)行加載。內(nèi)核從3.7后開始支持模塊簽名,該功能使能以后,內(nèi)核只允許
    發(fā)表于 08-08 16:14 ?1109次閱讀

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

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

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

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