版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Linux內核模塊編程,主要參考書目,Linux設備驅動開發(fā)詳解(第2版) 宋寶華 編著 人民郵電出版社,主要參考書目,Linux設備驅動程序(第三版) 魏永明 耿岳 等 譯 中國電力出版社,主要參考書目,精通Linux驅動程序開發(fā) Sreekrishnan 編著 人民郵電出版社,可裝載內核模塊,為了使系統(tǒng)功能能夠更靈活的擴充,Linux支持內核的動態(tài)擴展,即在系統(tǒng)運行時給內核增加新的功能(即模塊module)。 模塊(module)是一段可以被動態(tài)鏈接的目標代碼(.ko),它可由insmod命令動態(tài)的裝載并鏈接到正在運行的內核。鏈接后,它就成了內核的一部分,直到用rmmod命令解除鏈接并卸載
2、。 Linux驅動程序就是一種特殊的內核模塊。,內核模塊與應用程序的不同,內核模塊工作在內核空間(supervisor space),而應用程序工作在用戶空間(user space) 內核模塊是一個由多個回調函數(shù)組成的“被動”代碼集合體,采用了“事件驅動模型”;而應用程序總是從頭至尾的執(zhí)行單個任務。 內核模塊不能調用C標準函數(shù)庫(glibc庫),只能調用linux內核導出的內核函數(shù)。 內核模塊在編程時必須考慮可重入性(reentrant) 內核模塊可使用的棧很小(一般只有4096字節(jié))。,內核模塊程序源碼的構成,最簡單的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ù),通過insmod或modprobe命令加載內核模塊時,模塊的加載函數(shù)會自動被內核執(zhí)
4、行,完成模塊的相關初始化工作,通常包括:(1)向內核注冊一些數(shù)據結構;(2)申請軟硬件資源;(3)初始化硬件 模塊加載函數(shù)必須用宏“module_init”指定,它返回整型值。若初始化成功則返回0,若失敗則返回一個負值作為錯誤碼。 “_init”和“_exit”都是宏,利用了gcc的擴展關鍵字,分別要求編譯器將所聲明函數(shù)的目標代碼放入“init.text”段和“exit.text”段中(兩個特殊的ELF段)。 static關鍵字為了將該函數(shù)名的可見性控制在本文件內。,#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)最終展開為: static initcall_t _initcall_#fn#id _used _attribute_(_section_(.initcall level .init) = fn initcall_t是一個指向函數(shù)的指針類型 typedef int (*initcall_t)(void) 所以module_init本質上是將一個函數(shù)指針變量放在了一名為.initcall6.init ELF節(jié)中。,Executable and Linking Format,模塊卸載函數(shù),模塊卸載函數(shù)必須用宏“module_ex
7、it”指定,無返回值。 當通過rmmod命令卸載某模塊時,模塊的卸載函數(shù)會自動被內核執(zhí)行,完成與模塊裝載函數(shù)相反的功能。(注銷一些內核數(shù)據結構,釋放資源等)。,內核打印函數(shù)printk,printk(fmt, args ) 級別 KERN_EMERG 用于緊急消息, 常常是那些崩潰前的消息. KERN_ALERT 需要立刻動作的情形. KERN_CRIT 嚴重情況, 常常與嚴重的硬件或者軟件失效有關. KERN_ERR 用來報告錯誤情況; 設備驅動常常使用 KERN_ERR 來報告硬件故障. KERN_WARNING 有問題的情況的警告, 這些情況自己不會引起系統(tǒng)的嚴重問題. KERN_NOT
8、ICE 正常情況, 但是仍然值得注意. 在這個級別一些安全相關的情況會報告. KERN_INFO 信息型消息. 在這個級別, 很多驅動在啟動時打印它們發(fā)現(xiàn)的硬件的信息. KERN_DEBUG 用作調試消息. 不能打印浮點數(shù),printk消息流向,/etc/syslog.conf中可配置syslogd的分發(fā)規(guī)則,例如可以加入: kern.* /tmp/kernel_debug.txt /proc/kernel/printk文件中設置了一個優(yōu)先級,高于該優(yōu)先級的消息才能顯示到控制臺中,模塊許可證聲明,模塊許可證聲(MODULE_LICENSE)明描述內核模塊的許可權限 如果不聲明LICENSE,模
9、塊被加載時,將收到內核被污染(kernel tainted)的警告,編譯內核模塊的條件,已安裝了GCC工具鏈 有一份內核源碼,且至少被編譯過一次。 內核模塊程序在編譯過程中要使用內核源碼的頭文件(在include目錄)和編譯內核時生成的符號文件。,內核模塊的編譯,可以編寫一個最簡單的Makefile:,obj-m := hello.o,并采用如下命令編譯:,make C /lib/modules/$(shell uname -r)/build M= $(shell pwd) modules,或采用如下較復雜的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,內核模塊的編譯,如果我們想由兩個源文件(比如file1.c和file2.c )構造出一個名稱為module.ko的模塊, 則makefile的obj-m變量可如下編寫:,obj-m := module.o module-objs := file1.o file2
11、.o,內核模塊的加載與卸載,使用insmod命令或modprobe加載模塊:,insmod ./hello.ko,使用rmmod命令卸載模塊:,rmmod hello,使用lsmod命令查看內核中已加載的內核模塊的信息 通過查看/proc/modules文件也可查看內核中已加載的內核模塊的信息。 通過查看/sys/module目錄也可查看內核中已加載的內核模塊的信息。,modprobe會考慮要裝載的模塊是否引用了一些當前內核不存在的符號。如果有這類引用,modprobe會在當前模塊路徑中搜索定義了這些符號的其他模塊,并同時將這些模塊也裝載到內核。(/lib/modules modules.de
12、p /ect/modprob.conf),內核模塊參數(shù),module_param(參數(shù)名,參數(shù)類型,參數(shù)讀/寫權限) 內核支持的模塊參數(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ù),可通過insmod或modprobe在裝載模塊時為其傳入參數(shù): insmo
13、d hello_ext.ko howmany=5 whom=Students modprobe也可以從它的配置文件(/etc/modprobe.conf)讀取參數(shù)的值,最簡單的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時需要用到編譯export.c時生成的符號文件module.symv
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二四年商業(yè)廣告燈箱安裝施工合同
- 2025年度大曰金地產樓盤銷售代理合同全案策劃執(zhí)行合同4篇
- 2025年私人住房買賣合同書含物業(yè)管理服務條款范本2篇
- 2025年度高端鈦礦資源批量采購合同
- 二零二五版鍋爐設備買賣合同附安全使用操作手冊3篇
- 2025年度醫(yī)療設備租賃合同擔保與維修保養(yǎng)服務范本4篇
- 二零二五年度屋頂防水隔熱一體化合同
- 2025年BEC商務英語專業(yè)課程研發(fā)與授權使用合同3篇
- 二零二五版智慧城市基礎設施用地租賃合同3篇
- 預應力專項施工方案
- 物流無人機垂直起降場選址與建設規(guī)范
- 冷庫存儲合同協(xié)議書范本
- AQ/T 4131-2023 煙花爆竹重大危險源辨識(正式版)
- 武術體育運動文案范文
- 設計服務合同范本百度網盤
- 2024年市級??谱o士理論考核試題及答案
- 肺炎臨床路徑
- 供應商供貨服務方案(2篇)
- JB∕T 3077-2019 汽輪機圖形符號
- 《藥物臨床試驗機構備案評估指南及檢查細則(試行)》
- 河北省2022年中考數(shù)學真題及答案
評論
0/150
提交評論