




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Linux操作系统精讲大连理工大学软件学院邱铁综合楼413, Tel: 04仆87571 632E_mail: qiutie务考教材:Linux应用与开发典型实例精讲邱铁、于玉龙、徐子川编著.清华大学出版社.2010.5 第13章模块机制警作 学习本章要达到的目标:1. 了解内核编程应注意的事项;2.熟悉模块的符号表导入与导出功能;3.熟悉模块的参数使用方法;4.理解Linux内核的模块机制;5.熟悉Linux内核的模块的编写方法及模块 m akef ile的书写格式。13.1关于内核编程_ Linux可以运行在两种模式下:A用户模式(user mode)A 内核模式(kernel mode)
2、 o内核模式下编程还存在一些限制:!>不能使用浮点运算。库进施區间等竈尽可能保持代码的清洁。1 3.2 Linux的模块机制 Linux操作系统使用了一种全新的机制 模块(M odule)机制。用户可以根据需要,在不需要对内核重新编 译的情况下,模块可以动态地载入内核或从 内核中移出。1 3.2.1 Linux内核结构操作系统采用两种体系结构:> 微内核(Micro kernel)最常用的功能模块被设计成内核模式运行的一 个或一组进程,而其它大部分不十分重要的功能模 块都作为单独的进程在用户模式下运行>单内核(Monolithic kernel,有时也叫宏内核 Macro k
3、ernel)内核一般作为一个大进程的方式存在。该进程 内部又可以被分为若干模块,在运行的时候,它是 一个独立的二进制映象Linux内核结构:模块Ti 7rmmod内核空间为了弥补单一体系结构的 这一缺陷,Linux操彳乍系 统使用了模块机制。如图insmod 13.1所示,模块可通 过insm od命令插入内 核,也可以通过rm m od 命令从内核中删除。13.2.2模块的实现模块的编译模块许可声明模块安装与初始化模块的编译在Iinux2.6内核中,模块的编译需要配置 过的内核源代码;编译过程首先会到内核源码目录下,读取顶 层的Makefile文件,然后再返回模块源码 所在目录;经过编译、链
4、接后生成的内核模 块文彳牛的后缀为-ko;模块的编译 2.6内核模块的M akefile模板:ifneq ($(KERNELRELEASE),)mymodule-objs:= mymodule l.o my module 2.o #依赖关系obj-m +二mymodule.o#编译链接后将生成mymodule. o模块elsePWD := $(shell pwd)KVER := $(shell uname -r)KDIR := /lib/modules/$(KVER)/buildall:$(MAKE) -C $(KDIR) M=$(PWD)#此处将再次调用 makeclean:rm -rf *
5、.o *.mod.c 乞ko .symvers order markers * endif当在命令行执行make命令时,将调用Makefile 文件。KERNELRELEASE是 在内核源码的顶层M ak ef i I e中定义的一个 变量,在第一次读取执行此Makefile时,$( KERNELRELEASE)未被设置,因此第 一行ifneq失败,从else后窃开始执行,设 置KDI R,PWD等变量。模块的编译如果make的目标是clean,直接执行clean标号后的操作,执行完clean后面的rm命令后就结束To当make的目标为all时,-C$(KDI R)指明 跳转到内核源码目录下读
6、取那里的Makefile; M=$(PWD)表明然后返回到当前目录继续读 执行当前的Makefile,祀就是第二次调用m akeo当从内核源码目录返回时,$(KERNELRELEASE)已被定义,此时第一行 ifneq成功,make蒋醒续读取else之前的内容。 ifneqrt容为kbuild语法的语旬,指唄模瑛济 码中各文件之间的依赖关系,以及要生成的目标模 琬名O声明模块的许可丐从Linux内核2.4.10开始,动态加载的模块 必须通过MODULE_LI CENSE宏声明此模 块的许可证否则在动态加载此模块时,会收到内核被污 染”module license *unspecified
7、9; taints kernel.”的警告。声明模块的许可证被内核接受的许可证有”GPL”,”GPLv2”,HGPL and additional rights", "DualBSD/GPL", "Dual MPL/GPL”,nProprietary",其中最常用的的是“GPL”和"Dual BSD/GPL"o书写格式如下:> MODULE_LI CENSE(nGPLH);> MODULE_LI CENSE(H DualBSD/ GPI?);模块的初始化与退出在Linux2.6内核中,内核模块需要调用宏m odu
8、le_init()与module_exit()去注册初始化与退出函数。可以釆用以下模板格式:#include <linux/mod ule.h>MODULE_LICENSE(nGPLH); /声明模块的许可证/*声明模块安装初始化和退出函数勺static int _init mod_init_xxx(void);static void _exit mod_exit_xxx(void);module_init(mod_init_xxx);mod ule_exit(mod_exit_xxx);八定义模块安装初始化函数灯int mod_init_xxx(void)八可以在这里添加初始化代
9、码勺return 0;八定义模块退出函数Wvoid mod_exit_xxx(void)八可以在这里添加释放代码勺MODULE_AUTHOR( uxxxM); /注明模块作者MODULE_DESCRIPTION(nxxxxxH);注明模块功能描述MODULE. VERSION(” Ver x.xn);注明模块版本13.2.3 Linux模块导出符号表在内核中,导出内核函数需要使用特殊的指 令:EXPORT_SYMBOL()和 EXPORT_SYMPOL_GPL() o导出的内核函数可以被其它模块调用,而未 导出的函数模块则无法被其它模块调用。导出的内核符号表被看作是导出的内核接 口,也可以看作
10、内核API o内核符号的导出格式EXPORT_SYMBOL(symbol_name);EXPORT SYMBOL GPL(symbol name); /只适用丁包含 GPL 许可权的模块13.2.4模块参数 Linux操作系统内核提供了一种模块带参数的制三定义一个模块参数可通过m odule_param () 完成: module_param(name5 type, perm );13.2.5模块使用计数内核需要记录加载到系统里的每一个模块的使用情况在口nux操作系统2.4内核中使用两个宏来完成对模块引用计数的操作:/*使模块使用计数器加1,表示模块的使用者增加一个*/MOD INC USE
11、COUNT;夕/*使模块使用计数器减1,表示模块的使用者减少一个*/MOD_DEC_USE_COUNT;在Linux操作系统2.6内核中,使用下面的两个函数来完成对模块引用计数的操作:/*使模块使用计数器加I,表示模块的使用者增加-个;若返回为0,表示调用失败,希望 使用的模块没有被加载或正在被卸载中*/int try_module_get(struct module module);/*使模块使用计数器减1,表示模块的使用者减少一个,没有返回值旬void module_put(struct module module)1 3.3内核调试函数printk printk是内核使用的函数,因为内核
12、没有 链接标准C函数库,其实printk()接口和 printf()基本相似,它可以在控制台显示多 达1 024个字符。 printk()函数执行时首先设法获取控制台 信号量,然后将要输出的字符存储到控制台 的日志缓冲区,再调用控制台驱动程序来刷 新缓冲区。 printk()的语法格式为:printk(记录级别籲格式化输出信息"); “记录级别''是在include/ linux/ kernel.h 中的简单宏定 义记录级别在内核源代码中的宏定义68 ttdefine upper_32_bits<n> <<Li32XC<n> >
13、;> 16 >> 16)>6970ttdef ineKERN_EHERGM<0>M/*system is unusable*/71ttdefineKERH_ALERT/*action must be takenimmediately*/72ttdef ineKERN_CRITM<2>M/*critical condition占*/73ttdef ineKERN_ERRy严/*error conditions*/74ttdefineKERNJJfiRNING/*warning conditions*/75ttdef ineKERN_NOTICE/*
14、normal hut sign ificant condition*/76ttdefineKERN_INFOM<6>,p/*infopmational*/77ttdef ineKERN_DEBUGyX/*debug-leuel messages*/格式输出实例分析printk(“没有等级信息,则采用默认级别! n”); printk(KERN_INFO “内核提示信息5 J; printk(KERN_DEBUG “内核调试信息亍);13.4应用实例训练_在应用实例训练中,实现:模块间的相互调用模块间的参数数传递13.4.1编写模块源徉序编写m odu le.c文件7/rl. P&q
15、uot;T rtft 上一L#include <linux/init.h>#include <linux/module.h>MODULE_LICENSE(nDual BSD/GPL”); 声明许可证static int _init mod_init_modtest(void);static void _exit mod_exit_modtest(void);module_i nit(mod_init_modtest); 指定模块初始化函数 mod_init_modtest module_exit(mod_exit_modtest); 指定模块退出函数 mod_exit_
16、modtest int sum_op(int numdata);int factorial_op(int N); =J乘操作。口定义要导出的函数,其中sum_op()用于计算比某一数字小 的所有正整数的和,factorial_op()用手任賢棄一数字的阶 /*数字求和函数r int sum_op(int num data)口 char i = 0; char ret = 0; printk( KERN_I NFOHsum operati on rT); w hile( i < = numdata) ret + = i+ + ;return ret; /数字求阶乘函数r int facto
17、rial_op(int N)口 char i= 1 ; int Nx= 1 ; printk(KERN_l NFOnfactorial operation nH); if( N = 0) return Nx; for( ;i< = N;i+ + ) Nx= Nx* i; return Nx;口 /*导出这两个函数*/ EXPORT_SYMBOL(sum_op); EXPORT_SYMBOL(factorial_op);编写模块的安装初始化及退出函数/*安装初始化模块可int mod_init_modtest(void)printk(KERNNFO"Module_export_s
18、ymbol init !nn);return 0;/*退出模块*/void mod_exit_modtest(void)printk(KERN_DJFO1'Module_export_symbol was deleted!n");对模块的作者、功能描述和版本相关信息作 说明:MODULE_AUTHOR(nbook author");MODULE_DESCRIPTION(nmodulel:Module_export_symbol sum_opfactorial_opn);MODULE_VERSION(nVer 1.0”);建立Makefile文件,其编写格式与前面的模
19、板格式相同编写m odulel .c文件/*安装初始化模块*/int mod_init_modtest 1 (void)int result = 0;printk(KERNJNFOnHello,I am module 1 !nn); printk(KERN_INFOn %s,Welcome to use this sum_op !nn ,user_name); result = sum_op( num_operator);printk(KERN_INFOH 1 +.+ %d 二 %dnH ,num_operator,result); return 0;/*退出模块*/void mod_exit
20、_modtest 1 (void)旻Iprintk(KERN_INFOnModule 1:Goodbye %snfuser_name);对模块的参数、作者、功能描述和版本相关 信息作说明:/*定义模块参数 user_name、num_operator, module_param(user_name,charp,S_IRUGO); module_param(num_operatorJnt,S_IRUGO);MODULE_AUTHOR(”book authorn);MODULE_DESCRIPTION(nSimple Module 1 ,used to sum_opn);MODULE_VERSIO
21、N(nVer 1.0n);编写m odule2.c文件在模块初始函数中调用了m odu le中定义的 对参数进行求阶乘操作的函数:/*安装初始化模块*/int mod_init_modtest2(void)int result = 0;printk(KERN_INFOnHello,I am module 2 !nH);printk(KERN_INFOn %s,Welcome to use this factorial_op !nn ,user_name); result = factorial_op(num_operator);printk(KERN_INFOH %d!= %dnn,num_o
22、perator,result);return 0;对模块的参数、作者、功能描述和版本相关 信禺说明:/*定义模块参数 user_name、num_operator,*/ module_param(user_name,charp,S_IRUGO); module_param(num_operator,int,S_IRUGO);MODULE_AUTHOR(nbook author0);MODULE_DESCRIPTION(nSimple Module 2 ,used to factorial_opn); MODULE_VERSION(nVer 1.0n);13 42模块编译、兰装及退出 执行mak
23、e命令,进行编译module.c文 件,其执行过程如图13.3所示。文件(E)编辑隹)查看 终端仕)标签(旦)帮助(旦)rootlocalhost:/home/fe2000/linux book/expl3/module# roottalocalhost:/home/fe2000/linux book/expl3/module# makemake -C /lib/modules/2.6.24-21-generic/build M=/home/fe200G/'Linux_book/expl3/iriodul.e makel:正在进入目录 /usr/src/linux-headers-2.
24、6.24-21-generic*LD/home/fe2000/linux book/expl3/inodule/built-in.oCC M /home/fe2000/linux_book/expl3/iTiodiile/modul.e. oBuilding modules, stage 2.RODPOST 1 modulesCC/home/fe2000/l.inux_book/expl3/iriodule/modul.e. mod. oLD M /home/f e2000/linux_book/expl3/module/modul.e. komakeL:正在离开目录 /us/sc/linux
25、-h巳ades-2.6.24-2L-g巳neric'rootlocalhost:/home/fe2000/linux book/expl3/module# roottalocalhost: /home/fe2000/linux book/expl3/inodule# |安装模块_在root权限下,分别执行以下三条命令安 装编译成功的模块。insmod module.koins mod modulel.ko user_name=book_userl num_operator=6 insmod module2.ko user_name=book_user2 num_operator=6模块
26、成功安装后如图13.4所示,从图中可以看出,模块m odulel和module2的使甬者数量另0,而模块m odule被module 1和m odule2使用,因此,其使用者数量为2。文件(E)编辑(日 查看(乂)终端 标签(R)帮助(旦)rootlocalhost:/home/fe20Q0/linux_book/expl3/n(iiodule2# IsmodModuleSizeUsed bymodul已234600module34600module32002 miOdule2RniiOdulelnls iso8859 149921nls_cp43766561vfat144641fat5455
27、61 vfatusb storage736641libusual191081 usb stoage1915325122drin824523 i915执行下面的指令查看系统信息:dm esg | tail -10LJ回应rootlocalhost : /home/fe20O0/Unux_ book/expl3/module2#oot©localhost:/home/f£2O®0/linux_book/expl3/nnodLil已2# dlmesg | tail -10文件(日 编辑(E)查看(乂)终端 标签(旦)帮助(H)Hodule_export_symbol w
28、as deleted!Module export symbol init !Hello,I am module 1 !book userlrV/elcome to use this sum op!sum operation1 +. .+ 6 二 21Hello,I am module 2 !book user2.Welcome to use this factorlal op! factorial operation6!=720rootlocalhost: /home/fe2Q00/linux_book/expl3/module2#rootilocalhost: /home/fe2000/li
29、nux_book/expl3/module2# 口13.4.3 Linux kernel2.6.26 以后版本模块编译到了Linux kernel2.6.26版本及以后内 核版本,如还按照以前版本进行编译,就会 出现错误文件(E) 孵(旦査看(Y)终端(工)帮助但)rootlocalhost:/hom/user/linux_book_test/expl3/modulel#QQtlo£alliQst:/rQmeuge£/l£nux book test/exglmodule# mke rootlocalhost:/home/user/linux_book test/e
30、xp!3/modulel# rootlocalhost :/home/user7linux_book test/expl3/nnodulel# 0从输出信息可以看出,虽然m odulel.ko 文件生成了,但有一行警告信息: WARNI NG: ”sum_op”/ home/ user/ linux_book_test/ e xp1 3/ m oduIe1 / m odu Ie1 .ko undefined !如果不理采这条信息,接着将m odulel .ko插入内核,则显示信息如图1 3.9所示在Linux kernel2.6.28版本上插入 m odu Ie1 .korootlocalho
31、st: /home/user/|nux_booHesVexpl3/modulelW) W) ii(V) Mrootlocdlhost:/ho胆/user7linuxooltHt/expl3 加)dulM# rootlocalhost:/hofne/user/linux book test/expl3/modulel# insmod moduleLkoinsmod: error inserting 'moduleLko1: 4 Unknown symbol in modulerootocalhost:/hone/user/Unux_book_test/expl3/inodulel#rootocalhost7home/user/Uniix_book_test/expl3/modulel# |输岀提示信息Unknown symbol in module55 说明符号sum_op对于模块modulel来说是不可 见的。要想解决上述问题,可以把m odule.ko模块文件夹中的M odu le.sy m vers文件放到 m
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 四川省阆中中学2020-2021学年下学期高二年级期中教学质量检测历史试卷
- 模拟试卷01:2023-2024学年七年级语文上学期期末模拟考试(深圳专用)(参考答案)
- 2025-2026学年重庆市合川中学九年级(上)第一次月考化学试卷(含答案)
- 出口货运代理协议合同
- 供货合同延期补充协议
- 兄弟赡养老人合同范本
- 节能设备维护创新创业项目商业计划书
- 农作农物回收合同范本
- 老年保险产品创新创业项目商业计划书
- 兄弟装修保价合同范本
- 艾媒咨询:2024年“农夫山泉舆论风波”事件舆情监测分析报告
- 艾弗森模板课件
- 部队涉枪涉弹安全教育课件
- 汽车连接器测试规范完整版
- 工程管理专业的学生考研方向
- 实验室简介完
- 大学班主任工作手册-(实用模板-建议收藏)
- 六年级道德与法治上册 (公民意味着什么)新课件
- 中华文化精粹
- 短视频创作PPT完整全套教学课件
- 2023年中国出版集团公司集团总部招聘考试题库及答案
评论
0/150
提交评论