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

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

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

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

lPCU_elecfans ? 來(lái)源:未知 ? 作者:肖冰 ? 2019-07-16 10:08 ? 次閱讀

更多技術(shù)干貨內(nèi)容請(qǐng)穩(wěn)步到“電子發(fā)燒友網(wǎng)”公眾號(hào),回復(fù)資料即可免費(fèi)獲取一份技術(shù)資料,在這里每天可以獲取最專業(yè)、最前沿的電子技術(shù)。
Linux內(nèi)核是整體性結(jié)構(gòu),各個(gè)子系統(tǒng)緊密聯(lián)系,上接用戶控件,下接硬件,作為一個(gè)大程序在內(nèi)核控件運(yùn)行。

如果將所有的設(shè)備驅(qū)動(dòng)和內(nèi)核功能都集成在內(nèi)核中,則內(nèi)核會(huì)不斷的龐大,對(duì)我們的內(nèi)核裁剪也會(huì)帶來(lái)更大的挑戰(zhàn),為了解決這個(gè)問(wèn)題,Linux內(nèi)核引入內(nèi)核模塊機(jī)制,通過(guò)動(dòng)態(tài)加載內(nèi)核模塊,從而實(shí)現(xiàn)在運(yùn)行過(guò)程中擴(kuò)展內(nèi)核的功能。

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

1 內(nèi)核模塊是一種沒(méi)有經(jīng)過(guò)鏈接,不能獨(dú)立運(yùn)行的目標(biāo)文件,是在內(nèi)核空間中運(yùn)行的程序。經(jīng)過(guò)鏈接裝載到內(nèi)核里面成為內(nèi)核的一部分,可以訪問(wèn)內(nèi)核的公用符號(hào)(函數(shù)和變量)。

2 內(nèi)核模塊可以讓操作系統(tǒng)內(nèi)核在需要時(shí)載入和執(zhí)行,在不需要時(shí)由操作系統(tǒng)卸載。它們擴(kuò)展了操作系統(tǒng)內(nèi)核的功能卻不需要重新啟動(dòng)系統(tǒng)。

3 如果沒(méi)有內(nèi)核模塊,我們不得不一次又一次重新編譯生成單內(nèi)核操作系統(tǒng)的內(nèi)核鏡像來(lái)加入新的功能。這還意味著一個(gè)臃腫的內(nèi)核。

模塊機(jī)制的優(yōu)點(diǎn):

1 減小內(nèi)核映像尺寸,增加系統(tǒng)靈活性;

2 節(jié)省開(kāi)發(fā)時(shí)間;修改內(nèi)核,不必重新編譯整個(gè)內(nèi)核。

3 模塊的目標(biāo)代碼一旦被鏈入內(nèi)核,作用和靜態(tài)鏈接的內(nèi)核目標(biāo)代碼完全等價(jià)。

模塊機(jī)制的缺點(diǎn):

1 對(duì)系統(tǒng)性能有一定損失;

2 使用不當(dāng)時(shí)會(huì)導(dǎo)致系統(tǒng)崩潰;

接下來(lái)通過(guò)介紹一下內(nèi)核模塊的實(shí)現(xiàn):

首先先附上模塊的代碼(hello_world.c

1 #include

2 #include

3 #include

4

5 static int hello_init(void)

6 {

7 printk("hello world module! ");

8 return 0;

9 }

10

11 static void hello_exit(void)

12 {

13 printk("good bye module! ");

14 }

15

16 module_init(hello_init);

17 module_exit(hello_exit);

18

19 MODULE_LICENSE("GPL");

內(nèi)核模塊至少包含兩個(gè)函數(shù):

入口函數(shù)->初始化函數(shù)(xxx_init()):模塊加載時(shí),被調(diào)用

出口函數(shù)->卸載函數(shù)(xxx_exit()):模塊卸載時(shí),被調(diào)用

模塊的入口函數(shù)名和出口函數(shù)名可以任意命名,通過(guò)宏module_init()申明入口函數(shù),通過(guò)宏module_exit()申明出口函數(shù)。模塊需要包含頭文件:#include

內(nèi)核模塊證書:2.4內(nèi)核后,引入識(shí)別代碼是否在GPL許可下發(fā)布的機(jī)制 。在使用非公開(kāi)的源代碼產(chǎn)品時(shí)會(huì)得到警告。通過(guò)宏MODULE_LICENSE(“GPL”),設(shè)置模塊遵守GPL證書,取消警告信息。

內(nèi)核模塊的構(gòu)建:

管理模塊源碼方法: ① 模塊源碼加入到內(nèi)核源碼樹中。② 模塊源碼飯仔內(nèi)核源碼樹之外。

注:本文介紹的是放在內(nèi)核源碼樹外編譯。

接下來(lái)是Makefile的實(shí)現(xiàn):

首先附上Makefile的源碼

1 KERNEL_DIR = /home/FAN/linux-kernel

2

3 all:

4 make -C $(KERNEL_DIR) M=`pwd` modules

5 clean:

6 make -C $(KERNEL_DIR) M=`pwd` modules clean

7 rm -rf modules.order Module.symvers

8

9 obj-m += hello_world.o

其中:

1、KERNEL_DIR參數(shù),賦值內(nèi)核的位置,例如我的內(nèi)核源碼的路徑:/home/fan/linux-kernrl

2、當(dāng)終端執(zhí)行make時(shí),會(huì)運(yùn)行make -C $(KERNEL_DIR) M=`pwd` modules,其中M=`pwd`指向是模塊所在的路徑。

3、當(dāng)終端執(zhí)行make clean時(shí),會(huì)運(yùn)行下面兩條命令,將編譯生成的文件刪除

make -C $(KERNEL_DIR) M=`pwd` modules clean

rm -rf modules.order Module.symvers

4、obj-m += hello_world.o:其中 –m 表示將hello_world.c編譯成模塊

–y 表示將hello_world.c編譯進(jìn)內(nèi)核鏡像中

編譯生成文件:

在終端運(yùn)行make,則會(huì)生成hello_world.ko文件.

hello_world.ko發(fā)送到板子上,然后在板子上運(yùn)行insmod hello_world.ko, 會(huì)調(diào)用hello_init()函數(shù)運(yùn)行rmmod hello_world.ko,會(huì)調(diào)用hello_exit()函數(shù)

下圖為運(yùn)行結(jié)果:

本文作者:飯仔DIY,工作之余喜歡電子DIY,開(kāi)源分享是我寫文章的動(dòng)力,互相學(xué)習(xí)才能讓自己不斷強(qiáng)大。

歡迎廣大電子發(fā)燒友們投稿,投稿郵箱:liuyong@elecfans.com


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

    關(guān)注

    87

    文章

    11304

    瀏覽量

    209535

原文標(biāo)題:【原創(chuàng)】linux 了解內(nèi)核模塊的原理 《Rice linux 學(xué)習(xí)開(kāi)發(fā)》

文章出處:【微信號(hào):elecfans,微信公眾號(hào):電子發(fā)燒友網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    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 ?2508次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>內(nèi)核模塊</b>工作原理及<b class='flag-5'>內(nèi)核模塊</b>編譯案例

    詳解Linux內(nèi)核模塊的編寫方法

    Linux 系統(tǒng)為應(yīng)用程序提供了功能強(qiáng)大且容易擴(kuò)展的 API,但在某些情況下,這還遠(yuǎn)遠(yuǎn)不夠。與硬件交互或進(jìn)行需要訪問(wèn)系統(tǒng)中特權(quán)信息的操作時(shí),就需要一個(gè)內(nèi)核模塊
    的頭像 發(fā)表于 05-11 08:55 ?3749次閱讀

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

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

    RZ/G2L Linux系統(tǒng)如何添加新的內(nèi)核模塊

    RZ/G2L Linux系統(tǒng)的鏡像基于yocto構(gòu)建,本篇介紹如何添加新的內(nèi)核模塊
    的頭像 發(fā)表于 01-04 12:19 ?1789次閱讀
    RZ/G2L <b class='flag-5'>Linux</b>系統(tǒng)如何添加新的<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è)
    發(fā)表于 05-27 09:36

    【微信精選】linux 了解內(nèi)核模塊的原理 《Rice linux 學(xué)習(xí)開(kāi)發(fā)

    的挑戰(zhàn),為了解決這個(gè)問(wèn)題,Linux內(nèi)核引入內(nèi)核模塊機(jī)制,通過(guò)動(dòng)態(tài)加載內(nèi)核模塊,從而實(shí)現(xiàn)在運(yùn)行過(guò)程中擴(kuò)展
    發(fā)表于 07-16 07:00

    高效學(xué)習(xí)Linux內(nèi)核——內(nèi)核模塊編譯

    內(nèi)核是世界上最大的開(kāi)源項(xiàng)目之一,但是內(nèi)核是什么,它用于什么?一、什么是linux內(nèi)核模塊內(nèi)核是與計(jì)算機(jī)硬件接口的易替換軟件的最低級(jí)別。它負(fù)
    發(fā)表于 09-24 09:11

    內(nèi)核模塊開(kāi)發(fā)的相關(guān)資料下載

    我的嵌入式LINUX學(xué)習(xí).卷28------內(nèi)核模塊開(kāi)發(fā)
    發(fā)表于 12-20 07:22

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第4章、Linux內(nèi)核模塊

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第4章、Linux內(nèi)核模塊
    發(fā)表于 10-27 14:15 ?0次下載
    《<b class='flag-5'>Linux</b>設(shè)備驅(qū)動(dòng)<b class='flag-5'>開(kāi)發(fā)</b>詳解》第4章、<b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核模塊</b>

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

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

    嵌入式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次下載
    嵌入式<b class='flag-5'>LINUX</b>系統(tǒng)<b class='flag-5'>內(nèi)核</b>和<b class='flag-5'>內(nèi)核模塊</b>調(diào)試教程

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

    --enable”,能創(chuàng)建Linux內(nèi)核模塊,包括c源代碼文件,Makefile,Yocto的bb文件。相關(guān)文件放在目錄“ project-spec / meta-user / recipes-modules”中
    的頭像 發(fā)表于 03-02 11:10 ?4377次閱讀

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

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

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

    Linux應(yīng)用開(kāi)發(fā)中,為使應(yīng)用程序更加靈活地執(zhí)行用戶的預(yù)期功能,我們有時(shí)候會(huì)通過(guò)命令行傳遞一些參數(shù)到main函數(shù)中,使得代碼邏輯可以依據(jù)參數(shù)執(zhí)行不同的任務(wù)。同樣,Linux內(nèi)核也提供了
    發(fā)表于 06-07 16:23 ?2140次閱讀

    linux驅(qū)動(dòng)程序如何加載進(jìn)內(nèi)核

    ,需要了解Linux內(nèi)核的基本概念和API。以下是一些關(guān)鍵概念: 1.1 內(nèi)核模塊Linux內(nèi)核模塊
    的頭像 發(fā)表于 08-30 15:02 ?474次閱讀