- 1、本文档共25页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第三章-Linux内核模块资料
Linux内核及编程 第3章 Linux内核模块 计算机科学技术系 李伟民 2012年8月 Linux内核及编程 提纲 Linux内核模块的概念和结构 - Linux内核模块的概念 - Linux内核模块的程序结构 Linux内核模块的结构介绍及编程方法 Linux内核模块 Linux内核模块简介 为什么需要内核模块? 添加进内核的两种方式: (1)编译到内核,它的特点如下: 方便、速度快,机器一启动就可以使用这个功能,但是生成的内核会很 大,假如我们要在内核中新增或删除功能,不得不重新编译内核。 (2)编译成模块,它的特点如下: 不被编译入内核,从而控制了内核的大小;模块可以动态加载,一旦被 加载,它就和内核中其它部分完全一样。但是得自己来调用这些模块。 Linux内核模块 Linux内核模块简介 什么是内核模块? 具有独立功能的程序,它可以被单独编译,但不能独立运行。它在运行时被链接到内核作为内核的一部分在内核空间运行。 Linux设备驱动一般以模块形式出现。 内核模块的特点 需要提供入口和出口函数等。 不能独立运行,这些函数由内核在需要的时候来调用。 使用Linux内核里定义的函数,不能使用glibc的库。 这些函数可以用来完成硬件访问等操作。 Linux内核模块 内核模块与应用程序对比 应用程序是一个进程 编程从主函数main()开始。 主函数main返回即是进程结束。 驱动程序是一系列内核函数 函数入口和出口不一样。 使用Linux内核的函数。 这些函数由内核在适当的时候来调用。 这些函数可以用来完成硬件访问等操作。 Linux内核模块 Linux内核模块简介 模块的版本依赖 一个模块可能要支持不同版本的内核,不同内核版本的接口可能不一样(网络、头文件)。 可以在linux/version.h中找到版本定义,有一个KERNEL_VERSION(宏)。判断大于某个版本调用哪个接口,小于某个版本调用哪个接口(网络设备中常见) Linux内核模块 Linux内核模块简介 名字空间污染 当存在大量的函数和全局变量,并且它们的名字没有明确的含义以至于难以区别时,就会发生名字空间污染,程序员需要花费更多的时间和精力去记住这些已经保留的名字并为新符号寻找一个不重复的名字。 名字空间冲突可能造成很多问题,比如加载模块失败等 解决办法:将所有符号定义为静态变量;对于非全局变量和符号前加上一个内核中唯一的前缀。 Linux内核模块 Linux内核模块简介 一个简单的内核模块 #include linux/init.h #includelinux/module.h static int hello_init(void) { /*初始化代码*/ } static void hello_exit(void) { /*释放资源*/ } module_init(hello_init); module_exit(hello_exit); MODULE_AUTHOR(author); MODULE_DESCRIPTION(the description); MODULE_LICENSE(GPL); init.h的目的是指定初始化和清除函数 module.h包含有可装载模块需要的大量符号和函数定义 Linux内核模块 Linux内核模块简介 内核模块常用命令 insmod:调用insmod程序,把需要插入的模块以目标代码的形式插入到内核中。在插入的时候,insmod自动调用sys_init_module()函数运行。注意,只有超级用户才能使用这个命令。 lsmod:调用lsmod程序将显示当前系统中正在使用的模块信息。实际上这个程序的功能就是读取/proc/modules文件中的数据。 Insmod和modprobe主要区别: modprobe比insmod命令要强大,它在加载某模块时,会同时加载该模块所依赖的其他模块。 modinfo模块名:可以获取模块信息。 Linux内核模块 Linux内核模块结构介绍 初始化函数 static int _ _init hello_init(void) { /*初始化代码*/ } module_init(hello_init); 应当声明成静态的(static), 因为它们不会在特定文件之外可见 表明该函数只是在初始化时使用。模块加载器在模块加载后会丢掉这个初始化函数, 这样可将该函数占用的内存释放出来,以作他用。 原型:#define __init __attribute__ ((__section__(“.init.text”))) 定义会在模块目标代码中增加一个特殊的段, 用于说明内核模块初始化函数所在的位置。没有这个定义, 初始化函数不会被调用。 Li
您可能关注的文档
- 第七章第三节矿产资源和工业资料.ppt
- 第三单元分数加减法(一)-第3课时-同分母分数加减法课件资料.ppt
- 建筑工地临时用电培训概要.ppt
- 第三单元师长情谊第7课3资料.ppt
- 第三单元工程管理资料.ppt
- 建筑施工组织概要.doc
- 第三单元第7课资料.ppt
- 建筑施工组织课件概要.ppt
- 第三单元物理新课标苏科版资料.ppt
- 建筑施工用脚手架安全技术概要.ppt
- 2025年成都市玩偶生产荧光涂鸦互动玩偶开发可行性研究报告.docx
- 2025年成都市海绵生产用于体育馆室外运动场地透水改造可行性研究报告.docx
- 2025年天津市体操鞋企业团建运动应用报告.docx
- 2025年上海市溶洞极限运动(速降)场地开发可行性研究报告.docx
- 2025年上海市涵洞工程施工技术应用可行性研究报告.docx
- 2025年上海市体育场馆设施扎带安全防护可行性研究报告.docx
- 2025年上海市牦牛育肥产业园区建设可行性研究报告.docx
- 2025年旅拍宠物陪伴拍摄项目可行性研究报告.docx
- 2025年上海市进口食品节庆主题快闪店可行性研究报告.docx
- 2025年上海市洗选厂尾矿综合利用产业化可行性研究报告.docx
文档评论(0)