更多技術干貨內容請穩步到“電子發燒友網”公眾號,回復資料即可免費獲取一份技術資料,在這里每天可以獲取最專業、最前沿的電子技術。
Linux內核是整體性結構,各個子系統緊密聯系,上接用戶控件,下接硬件,作為一個大程序在內核控件運行。
如果將所有的設備驅動和內核功能都集成在內核中,則內核會不斷的龐大,對我們的內核裁剪也會帶來更大的挑戰,為了解決這個問題,Linux內核引入內核模塊機制,通過動態加載內核模塊,從而實現在運行過程中擴展內核的功能。
內核模塊是什么?
1 內核模塊是一種沒有經過鏈接,不能獨立運行的目標文件,是在內核空間中運行的程序。經過鏈接裝載到內核里面成為內核的一部分,可以訪問內核的公用符號(函數和變量)。
2 內核模塊可以讓操作系統內核在需要時載入和執行,在不需要時由操作系統卸載。它們擴展了操作系統內核的功能卻不需要重新啟動系統。
3 如果沒有內核模塊,我們不得不一次又一次重新編譯生成單內核操作系統的內核鏡像來加入新的功能。這還意味著一個臃腫的內核。
模塊機制的優點:
1 減小內核映像尺寸,增加系統靈活性;
2 節省開發時間;修改內核,不必重新編譯整個內核。
3 模塊的目標代碼一旦被鏈入內核,作用和靜態鏈接的內核目標代碼完全等價。
模塊機制的缺點:
1 對系統性能有一定損失;
2 使用不當時會導致系統崩潰;
接下來通過
首先先附上模塊的代碼(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");
內核模塊至少包含兩個函數:
入口函數->初始化函數(xxx_init()):模塊加載時,被調用
出口函數->卸載函數(xxx_exit()):模塊卸載時,被調用
模塊的入口函數名和出口函數名可以任意命名,通過宏module_init()申明入口函數,通過宏module_exit()申明出口函數。模塊需要包含頭文件:#include
內核模塊證書:2.4內核后,引入識別代碼是否在GPL許可下發布的機制 。在使用非公開的源代碼產品時會得到警告。通過宏MODULE_LICENSE(“GPL”),設置模塊遵守GPL證書,取消警告信息。
內核模塊的構建:
管理模塊源碼方法: ① 模塊源碼加入到內核源碼樹中。② 模塊源碼飯仔內核源碼樹之外。
注:本文介紹的是放在內核源碼樹外編譯。
接下來是Makefile的實現:
首先附上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:參數,賦值內核的位置,例如我的內核源碼的路徑:/home/fan/linux-kernrl
2、當終端執行make時,會運行make -C $(KERNEL_DIR) M=`pwd` modules,其中M=`pwd`指向是模塊所在的路徑。
3、當終端執行make clean時,會運行下面兩條命令,將編譯生成的文件刪除
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編譯進內核鏡像中
編譯生成文件:
在終端運行make,則會生成hello_world.ko文件.
將hello_world.ko發送到板子上,然后在板子上運行insmod hello_world.ko, 會調用hello_init()函數運行rmmod hello_world.ko,會調用hello_exit()函數
下圖為運行結果:
本文作者:飯仔DIY,工作之余喜歡電子DIY,開源分享是我寫文章的動力,互相學習才能讓自己不斷強大。
歡迎廣大電子發燒友們投稿,投稿郵箱:liuyong@elecfans.com
-
Linux
+關注
關注
87文章
11320瀏覽量
209849
原文標題:【原創】linux 了解內核模塊的原理 《Rice linux 學習開發》
文章出處:【微信號:elecfans,微信公眾號:電子發燒友網】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論