精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

內核模塊依賴什么意思

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

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

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

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

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關鍵處:

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

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

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

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

這里有三點重要說明:

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

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

# cat /lib/modules/5.10.111-64-generic/modules.dep
......
extra/vser.ko: extra/dep.ko
extra/dep.ko:
  • 兩個模塊存在依賴關系,如果分別編譯兩個模塊,會出現類似下面的警告信息,并且即便加載順序正確,加載也不會成功 :
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模塊時在內核的符號表中找不到expvalexpfun的項,而vser模塊又完全不知道dep模塊的存在。

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

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

內核將會創建模塊依賴關系的鏈接,只有當依賴于這個模塊的鏈表為空時,模塊才能被卸載.

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

    關注

    7

    文章

    2670

    瀏覽量

    47340
  • 內核
    +關注

    關注

    3

    文章

    1363

    瀏覽量

    40228
  • Linux
    +關注

    關注

    87

    文章

    11229

    瀏覽量

    208926
收藏 人收藏

    評論

    相關推薦

    linux 了解內核模塊的原理 《Rice linux 學習開發》

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

    Linux 內核模塊工作原理及內核模塊編譯案例

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

    Linux內核模塊間通訊方法

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

    Linux內核模塊程序結構

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

    Linux內核模塊簡介

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

    內核模塊的原理以及其模塊編寫

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

    什么是內核模塊?如何編寫一個簡單的模塊?

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

    什么是 Linux 內核模塊?

    lsmod 命令能夠告訴你當前系統上加載了哪些內核模塊,以及關于使用它們的一些有趣的細節。
    的頭像 發表于 08-09 17:01 ?3218次閱讀

    嵌入式LINUX系統內核內核模塊調試教程

    本文檔的主要內容詳細介紹的是嵌入式LINUX系統內核內核模塊調試教程。
    發表于 11-06 17:32 ?21次下載
    嵌入式LINUX系統<b class='flag-5'>內核</b>和<b class='flag-5'>內核模塊</b>調試教程

    如何在Petalinux創建Linux內核模塊?

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

    Asterisk內核模塊介紹

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

    嵌入式LINUX系統內核內核模塊調試

    嵌入式LINUX系統內核內核模塊調試(嵌入式開發和硬件開發)-嵌入式LINUX系統內核內核模塊調試? ? ? ? ? ? ? ? ?
    發表于 07-30 13:55 ?10次下載
    嵌入式LINUX系統<b class='flag-5'>內核</b>和<b class='flag-5'>內核模塊</b>調試

    什么是內核模塊簽名?內核如何開啟模塊簽名

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

    Linux內核模塊參數傳遞與sysfs文件系統

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

    深入分析Linux kernel安全特性: 內核模塊簽名

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