linux内核模块设计.ppt
《linux内核模块设计.ppt》由会员分享,可在线阅读,更多相关《linux内核模块设计.ppt(27页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Linux 2.6内核模块设计内核模块设计黄松青黄松青内核模块概述内核模块概述vLinux内核是整体式结构,各个子系统联系紧密,作为一个大程内核是整体式结构,各个子系统联系紧密,作为一个大程序在内核空间运行。序在内核空间运行。内核模块概述内核模块概述v太多的设备驱动和内核功能集成太多的设备驱动和内核功能集成在内核中,内核过于庞大。如何在内核中,内核过于庞大。如何解决?解决?Linux内核引入内核模块机制。通过动态加载内核模块,使得在运行过程中扩展内核的功能。不需要的时候,卸载该内核模块。内核模块概述内核模块概述v什么是内核模块?什么是内核模块?内核模块是一种没有经过链接,不能独立运行的目标文件
2、,是在内核空间中运行的程序。经过链接装载到内核里面成为内核的一部分,可以访问内核的公用符号(函数和变量)。内核模块可以让操作系统内核在需要时载入和执 行,在不需要时由操作系统卸载。它们扩展了操作系统内核的功能却不需要重新启动系统。如果没有内核模块,我们不得不一次又一次重新编译生成单内核操作系统的内核镜 像来加入新的功能。这还意味着一个臃肿的内核。内核模块概述内核模块概述v模块机制的优点:模块机制的优点:减小内核映像尺寸,增加系统灵活性;节省开发时间;修改内核,不必重新编译整个内核。模块的目标代码一旦被链入内核,作用和静态链接的内核目标代码完全等价。v模块机制的缺点:模块机制的缺点:对系统性能有
3、一定损失;使用不当时会导致系统崩溃;内核模块概述内核模块概述v内核模块是如何被调入内核工作的内核模块是如何被调入内核工作的?当操作系统内核需要的扩展功能不存在时,内核模块管理守护进程kmod执行modprobe去加载内核模块。modprobe遍历文件/lib/modules/$(version)/modules.dep 来判断是否有其它内核模块需要在该模块加载前被加载。最后modprobe调用insmod先加载被依赖的模块,然后加载该被内核要求的模块。内核模块概述内核模块概述v内核模块的卸载内核模块的卸载 当我们不需要内核模块了当我们不需要内核模块了,为了减少系统资源的开销为了减少系统资源的开
4、销,需要卸载时使用命令需要卸载时使用命令#rmmod module_name 或者或者#modprobe r module_namev查看系统已经加载的模块查看系统已经加载的模块,使用命令使用命令#lsmod实验实验:Hello World模块模块v步骤步骤:新建模块目录新建模块目录 用编辑器用编辑器(vi)编辑源文件编辑源文件 用编辑器编辑用编辑器编辑Makefile 在内核源码树外编译在内核源码树外编译 把模块加到内核源码树并把配置信息同时加入把模块加到内核源码树并把配置信息同时加入实验实验:Hello World模块模块#include /for module_init()#includ
5、e /must be include#include /for printk()static int _init hello_init(void)printk(“Hello worldn”);return 0;static void _exit hello_exit(void)printk(“Hello module exitn”);module_init(hello_init);module_exit(hello_exit);MODULE_LICENSE(“GPL”);MODULE_AUTHOR(“hsq”);实验实验:Hello World模块模块v说明说明:v1)模块入口函数为模块入口函
6、数为hello_init(),由由module_init()宏指定宏指定,在模块被加载的时候被调用向系统在模块被加载的时候被调用向系统 注册注册,就象应用程序的就象应用程序的main()一样一样,主要来主要来 完成模块的初始化工作完成模块的初始化工作v2)入口函数的返回值为入口函数的返回值为0表示成功表示成功,非非0表示失败表示失败v3)模块的退出函数为模块的退出函数为hello_exit(),由由module_exit()宏宏 指定指定,在模块被卸载是被调用向系统注销在模块被卸载是被调用向系统注销,主要来完成主要来完成 资源的清理工作资源的清理工作,它被调用完毕后它被调用完毕后,就模块就被内
7、核清除了就模块就被内核清除了v4)一个模块最少需要有入口和退出函数一个模块最少需要有入口和退出函数实验实验:Hello World模块模块v说明说明:关于关于_init和和_exit宏宏 如果该模块被编译进内核,而不是动态加载,则宏 _init的使用会在初始化完成后丢弃该函数并收回所占内存。如果该模块被编译进内核,宏_exit将忽略“清理收尾”的函数。这些宏在头文件linux/init.h定义,用来释放内核占用的内存。例如启动时看到的信息“Freeing unused kernel memory:236k freed”,正是内核释放这些函数所占用空间时的打印信息。实验实验:Hello Worl
8、d模块模块vprintk()函数函数printk 函数在 Linux 内核中定义并且对模块可用,为内核提供日志功能,记录内核信息或用来给出警告。与标准 C 库函数 printf 的行为相似。每个printk()声明都会带一个优先级。内核总共定义了八个优先级的宏,在linux/kernel.h中定义。若你不指明优先级,DEFAULT_MESSAGE_LOGLEVEL这个默认优先级将被采用。信息添加到文件/var/log/messages,可直接查看,或者用命令dmesg查看。在Xwindows下的终端insmod一个模块,日志信息只会记录在日志文件中,而不在终端打印。实验实验:Hello Wor
9、ld模块模块v写内核程序需要注意写内核程序需要注意:实验实验:Hello World模块模块v内核模块的内核模块的Makefile:CONFIG_HELLO_WORLD?=m ifneq($(KERNELRELEASE),)hello_world-objs:=hello.o obj-$(CONFIG_HELLO_WORLD)+=hello_world.o else KERNELDIR=/root/gec2410-linux-2.6.8.1/PWD:=$(shell pwd)modules:$(MAKE)-C$(KERNELDIR)M=$(PWD)modules endif clean:rm r
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux 内核 模块 设计
限制150内