Linux内核模块编程入门( 最简单的内核模块编程)
第1章簡介
什么是內(nèi)核模塊?
所以,你想編寫一個內(nèi)核模塊。 你知道C,你已經(jīng)編寫了一些正常的程序作為進程運行,現(xiàn)在你想要到達實際操作的位置,一個狂野指針可以消滅你的文件系統(tǒng),核心轉(zhuǎn)儲意味著重啟。
什么是內(nèi)核模塊? 模塊是可以根據(jù)需要加載和卸載到內(nèi)核中的代碼片段。 它們擴展了內(nèi)核的功能,而無需重啟系統(tǒng)。 例如,一種類型的模塊是設(shè)備驅(qū)動程序,它允許內(nèi)核訪問連接到系統(tǒng)的硬件。 沒有模塊,我們必須構(gòu)建單片內(nèi)核并將新功能直接添加到內(nèi)核映像中。 除了擁有更大的內(nèi)核之外,這還有一個缺點,即每次我們想要新功能時都需要我們重建和重啟內(nèi)核。
模塊如何進入內(nèi)核?
您可以通過運行l(wèi)smod來查看已經(jīng)加載到內(nèi)核中的模塊, lsmod通過讀取文件/proc/modules來獲取其信息。
這些模塊如何進入內(nèi)核? 當內(nèi)核需要一個不駐留在內(nèi)核中的特性時,內(nèi)核模塊守護進程kmod [1]執(zhí)行modprobe來加載模塊.modprobe以兩種形式之一傳遞一個字符串:
linux系統(tǒng)整體結(jié)構(gòu)分三個部分?
- linux內(nèi)核模塊編程入門()
這里的printk就是print kernal,意思是輸出到內(nèi)核,輸出到日志文件
當模塊插入執(zhí)行初始化lkp__init()函數(shù)
當模塊卸載執(zhí)行退出函數(shù)lkp__exit()
//任何模塊都要包含的三個頭文件 #include <linux/module.h> //(module<n>模塊; 功能塊)包含了對模塊的版本控制 #include <linux/kernel.h> //包含了常用的內(nèi)核函數(shù) #include <linux/init.h> //包含了宏__init(告訴編譯程序僅初始化的函數(shù)和變量)和__exit() /*模塊的初始化函數(shù)lkp_init()__init是用于初始化的修飾符 */ static int __init lkp_init(void) //加載函數(shù)的入口函數(shù) 相當于 main(void) {printk("<1>Hello,world!from the kernel space...\n");//Linux內(nèi)核下內(nèi)核編程不能使用c的庫 } /* 模塊的退出和清理函數(shù)lkp_exit() //入口相對的出口 */ static void __exit lkp(void) {printk("<1>Goodbye,world!leaving kernel space...\n"); } /*調(diào)用函數(shù) */ module_init(lkp_init); module_exit(lkp_exit); /*模塊的許可證聲明GPL */ MODULE_LICENSE("GPL");?
- 內(nèi)核模塊的Makefile文件
編譯內(nèi)核模塊
內(nèi)核模塊的編譯需要與常規(guī)用戶空間應用程序略有不同。 以前的內(nèi)核版本要求我們關(guān)注這些設(shè)置,這些設(shè)置通常存儲在Makefile中。 雖然按層次結(jié)構(gòu)組織,但許多冗余設(shè)置在次級Makefile中累積并使它們變大并且難以維護。 幸運的是,有一種新方法可以做這些事情,稱為kbuild,外部可加載模塊的構(gòu)建過程現(xiàn)在完全集成到標準內(nèi)核構(gòu)建機制中。 要了解有關(guān)如何編譯不屬于官方內(nèi)核的模塊的更多信息(例如本指南中的所有示例),請參閱文件linux / Documentation / kbuild / modules.txt 。
那么,讓我們看一個簡單的Makefile來編譯一個名為hello-1.c的模塊:
obj-m += hello-1.oall:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modulesclean:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean核心思想:告訴哪個頭文件放在哪些地方
在這個文件里定義了三個變量?
1. 路徑的變量
2.內(nèi)核版本號變量
?3.內(nèi)核源代碼所在路徑變量
- 內(nèi)核模塊插入到內(nèi)核里
?超級用戶的權(quán)限插入
#insmod + 模塊名.ko
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的Linux内核模块编程入门( 最简单的内核模块编程)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: View的绘制-layout流程详解
- 下一篇: linux内核编程--1模块的装载和卸载