日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux内核模块编程入门( 最简单的内核模块编程)

發(fā)布時間:2023/12/10 linux 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux内核模块编程入门( 最简单的内核模块编程) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

第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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。