




下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Linux內(nèi)核模塊編程,主要參考書(shū)目,Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解(第2版) 宋寶華 編著 人民郵電出版社,主要參考書(shū)目,Linux設(shè)備驅(qū)動(dòng)程序(第三版) 魏永明 耿岳 等 譯 中國(guó)電力出版社,主要參考書(shū)目,精通Linux驅(qū)動(dòng)程序開(kāi)發(fā) Sreekrishnan 編著 人民郵電出版社,可裝載內(nèi)核模塊,為了使系統(tǒng)功能能夠更靈活的擴(kuò)充,Linux支持內(nèi)核的動(dòng)態(tài)擴(kuò)展,即在系統(tǒng)運(yùn)行時(shí)給內(nèi)核增加新的功能(即模塊module)。 模塊(module)是一段可以被動(dòng)態(tài)鏈接的目標(biāo)代碼(.ko),它可由insmod命令動(dòng)態(tài)的裝載并鏈接到正在運(yùn)行的內(nèi)核。鏈接后,它就成了內(nèi)核的一部分,直到用rmmod命令解除鏈接并卸載
2、。 Linux驅(qū)動(dòng)程序就是一種特殊的內(nèi)核模塊。,內(nèi)核模塊與應(yīng)用程序的不同,內(nèi)核模塊工作在內(nèi)核空間(supervisor space),而應(yīng)用程序工作在用戶空間(user space) 內(nèi)核模塊是一個(gè)由多個(gè)回調(diào)函數(shù)組成的“被動(dòng)”代碼集合體,采用了“事件驅(qū)動(dòng)模型”;而應(yīng)用程序總是從頭至尾的執(zhí)行單個(gè)任務(wù)。 內(nèi)核模塊不能調(diào)用C標(biāo)準(zhǔn)函數(shù)庫(kù)(glibc庫(kù)),只能調(diào)用linux內(nèi)核導(dǎo)出的內(nèi)核函數(shù)。 內(nèi)核模塊在編程時(shí)必須考慮可重入性(reentrant) 內(nèi)核模塊可使用的棧很小(一般只有4096字節(jié))。,內(nèi)核模塊程序源碼的構(gòu)成,最簡(jiǎn)單的Kernel Module,#include #include MODUL
3、E_LICENSE(Dual BSD/GPL); static int _init hello_init(void) / 這是模塊加載函數(shù) printk(KERN_ALERT Hello, worldn); return 0; static void _exit hello_exit(void) / 這是模塊卸載函數(shù) printk(KERN_ALERT Goodbye, cruel worldn); module_init(hello_init); module_exit(hello_exit);,模塊加載函數(shù),通過(guò)insmod或modprobe命令加載內(nèi)核模塊時(shí),模塊的加載函數(shù)會(huì)自動(dòng)被內(nèi)核執(zhí)
4、行,完成模塊的相關(guān)初始化工作,通常包括:(1)向內(nèi)核注冊(cè)一些數(shù)據(jù)結(jié)構(gòu);(2)申請(qǐng)軟硬件資源;(3)初始化硬件 模塊加載函數(shù)必須用宏“module_init”指定,它返回整型值。若初始化成功則返回0,若失敗則返回一個(gè)負(fù)值作為錯(cuò)誤碼。 “_init”和“_exit”都是宏,利用了gcc的擴(kuò)展關(guān)鍵字,分別要求編譯器將所聲明函數(shù)的目標(biāo)代碼放入“init.text”段和“exit.text”段中(兩個(gè)特殊的ELF段)。 static關(guān)鍵字為了將該函數(shù)名的可見(jiàn)性控制在本文件內(nèi)。,#define _init _attribute_ (_section_(“.init.text”) #define _exit
5、 _attribute_ (_section_(“.exit.text”),module_init背后的秘密,#define module_init(x) _initcall(x); #define _initcall(fn) device_initcall(fn) #define device_initcall(fn) _define_initcall(6, fn, 6) #define _define_initcall(level,fn,id) static initcall_t _initcall_#fn#id _used _attribute_(_section_(.initcall
6、level .init) = fn 所以,module_init(x)最終展開(kāi)為: static initcall_t _initcall_#fn#id _used _attribute_(_section_(.initcall level .init) = fn initcall_t是一個(gè)指向函數(shù)的指針類型 typedef int (*initcall_t)(void) 所以module_init本質(zhì)上是將一個(gè)函數(shù)指針變量放在了一名為.initcall6.init ELF節(jié)中。,Executable and Linking Format,模塊卸載函數(shù),模塊卸載函數(shù)必須用宏“module_ex
7、it”指定,無(wú)返回值。 當(dāng)通過(guò)rmmod命令卸載某模塊時(shí),模塊的卸載函數(shù)會(huì)自動(dòng)被內(nèi)核執(zhí)行,完成與模塊裝載函數(shù)相反的功能。(注銷一些內(nèi)核數(shù)據(jù)結(jié)構(gòu),釋放資源等)。,內(nèi)核打印函數(shù)printk,printk(fmt, args ) 級(jí)別 KERN_EMERG 用于緊急消息, 常常是那些崩潰前的消息. KERN_ALERT 需要立刻動(dòng)作的情形. KERN_CRIT 嚴(yán)重情況, 常常與嚴(yán)重的硬件或者軟件失效有關(guān). KERN_ERR 用來(lái)報(bào)告錯(cuò)誤情況; 設(shè)備驅(qū)動(dòng)常常使用 KERN_ERR 來(lái)報(bào)告硬件故障. KERN_WARNING 有問(wèn)題的情況的警告, 這些情況自己不會(huì)引起系統(tǒng)的嚴(yán)重問(wèn)題. KERN_NOT
8、ICE 正常情況, 但是仍然值得注意. 在這個(gè)級(jí)別一些安全相關(guān)的情況會(huì)報(bào)告. KERN_INFO 信息型消息. 在這個(gè)級(jí)別, 很多驅(qū)動(dòng)在啟動(dòng)時(shí)打印它們發(fā)現(xiàn)的硬件的信息. KERN_DEBUG 用作調(diào)試消息. 不能打印浮點(diǎn)數(shù),printk消息流向,/etc/syslog.conf中可配置syslogd的分發(fā)規(guī)則,例如可以加入: kern.* /tmp/kernel_debug.txt /proc/kernel/printk文件中設(shè)置了一個(gè)優(yōu)先級(jí),高于該優(yōu)先級(jí)的消息才能顯示到控制臺(tái)中,模塊許可證聲明,模塊許可證聲(MODULE_LICENSE)明描述內(nèi)核模塊的許可權(quán)限 如果不聲明LICENSE,模
9、塊被加載時(shí),將收到內(nèi)核被污染(kernel tainted)的警告,編譯內(nèi)核模塊的條件,已安裝了GCC工具鏈 有一份內(nèi)核源碼,且至少被編譯過(guò)一次。 內(nèi)核模塊程序在編譯過(guò)程中要使用內(nèi)核源碼的頭文件(在include目錄)和編譯內(nèi)核時(shí)生成的符號(hào)文件。,內(nèi)核模塊的編譯,可以編寫一個(gè)最簡(jiǎn)單的Makefile:,obj-m := hello.o,并采用如下命令編譯:,make C /lib/modules/$(shell uname -r)/build M= $(shell pwd) modules,或采用如下較復(fù)雜的Makefile:,ifneq ($(KERNELRELEASE),) # call
10、from kernel build system obj-m:= hello.o else KERNELDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: make -C $(KERNELDIR) M=$(PWD) modules endif,內(nèi)核模塊的編譯,如果我們想由兩個(gè)源文件(比如file1.c和file2.c )構(gòu)造出一個(gè)名稱為module.ko的模塊, 則makefile的obj-m變量可如下編寫:,obj-m := module.o module-objs := file1.o file2
11、.o,內(nèi)核模塊的加載與卸載,使用insmod命令或modprobe加載模塊:,insmod ./hello.ko,使用rmmod命令卸載模塊:,rmmod hello,使用lsmod命令查看內(nèi)核中已加載的內(nèi)核模塊的信息 通過(guò)查看/proc/modules文件也可查看內(nèi)核中已加載的內(nèi)核模塊的信息。 通過(guò)查看/sys/module目錄也可查看內(nèi)核中已加載的內(nèi)核模塊的信息。,modprobe會(huì)考慮要裝載的模塊是否引用了一些當(dāng)前內(nèi)核不存在的符號(hào)。如果有這類引用,modprobe會(huì)在當(dāng)前模塊路徑中搜索定義了這些符號(hào)的其他模塊,并同時(shí)將這些模塊也裝載到內(nèi)核。(/lib/modules modules.de
12、p /ect/modprob.conf),內(nèi)核模塊參數(shù),module_param(參數(shù)名,參數(shù)類型,參數(shù)讀/寫權(quán)限) 內(nèi)核支持的模塊參數(shù)類型包括: byte、short、ushort、int、uint、long、ulong、charp(字符指針)、bool。,static char *whom = world; static int howmany = 1; module_param(howmany, int, S_IRUGO); module_param(whom, charp, S_IRUGO);,裝載模塊指定參數(shù),可通過(guò)insmod或modprobe在裝載模塊時(shí)為其傳入?yún)?shù): insmo
13、d hello_ext.ko howmany=5 whom=Students modprobe也可以從它的配置文件(/etc/modprobe.conf)讀取參數(shù)的值,最簡(jiǎn)單的Kernel Module, / export.c int add_integer(int a, int b) return a+b; int sub_integer(int a, int b) return a-b; EXPORT_SYMBOL(add_integer); EXPORT_SYMBOL(sub_integer);,extern int add_integer(int a, int b); / import.c extern sub_integer(int a, int b); static int _init hello_init(void) / 這是模塊加載函數(shù) printk(KERN_ALERT “%dn“, add_integer(5, 10); return 0; ,編譯import.c時(shí)需要用到編譯export.c時(shí)生成的符號(hào)文件module.symv
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 聊城工資支付管理辦法
- 工程業(yè)績(jī)提成管理辦法
- 成都公司招商管理辦法
- 擴(kuò)大勞務(wù)酒店管理辦法
- 設(shè)計(jì)咨詢單位管理辦法
- 秋季苗木養(yǎng)護(hù)管理辦法
- 塑膠顆粒原料管理辦法
- 秦皇島民宿業(yè)管理辦法
- 統(tǒng)計(jì)風(fēng)險(xiǎn)披露管理辦法
- 工會(huì)采購(gòu)管理辦法湖北
- 藥品生產(chǎn)偏差管理制度
- 2025至2030中國(guó)大型發(fā)電機(jī)行業(yè)發(fā)展趨勢(shì)分析與未來(lái)投資戰(zhàn)略咨詢研究報(bào)告
- 中國(guó)歌劇舞劇院管理制度
- 2025年?duì)t外精煉工職業(yè)技能理論知識(shí)考試題庫(kù)(含答案)
- 外墻真石漆修補(bǔ)方案(3篇)
- 2025-2030飛機(jī)零部件產(chǎn)業(yè)規(guī)劃研究報(bào)告
- T/CSBME 072-2023車載醫(yī)用X射線計(jì)算機(jī)體層攝影設(shè)備臨床質(zhì)量控制要求
- 道路養(yǎng)管協(xié)議書(shū)
- 2025年河北省專技人員公需課《人工智能時(shí)代的機(jī)遇與挑戰(zhàn)-預(yù)訓(xùn)練大模型與生成式AI》答案
- 靜脈治療個(gè)案匯報(bào)
- 免疫藥物的處方審核思路與用藥指導(dǎo)
評(píng)論
0/150
提交評(píng)論