- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
2.7. 初始化和关停 2.7. 初始化和关停 如已提到的, 模块初始化函数注册模块提供的任何功能. 这些功能, 我们指的是新功能, 可以由应⽤ 序存取的或者⼀整个驱动或者⼀个新软件抽象. 实际的初始化函数定义 常常如: static int __init initialization_function(void) { /* Initialization code here */ } module_init(initialization_function); 初始化函数应当声明成静态的, 因为它们不会在特定⽂件之外可见; 没有硬性规定这个, 然⽽, 因为没有函数能输出给内核其他部分, 除⾮明确请求. 声明中的 init 标志可能看 起来有点怪; 它是⼀个给内核的暗⽰, 给定的函数只是在初始化 ⽤. 模块加载者在模 块加载后会丢掉这个初始化函数, 它的内存可做其他⽤途. ⼀个类似的标签 (initdata) 给只在初始化时⽤的数据. 使⽤ init 和 initdata 是可选的, 但是它带来的⿇烦是值得的. 只是要确认不要⽤在那些在初始化完成后还使⽤的函数(或者数据结构)上. 你可能还会 遇到 devinit 和 devinitdata 在内核源码⾥; 这些只在内核没有配置⽀持 hotplug 设备时 转换成 __init 和 _initdata. 我们会在 14 章谈论 hotplug ⽀持. 使⽤ moudle_init 是强制的. 这个宏定义增加了特别的段到模块⽬标代码中, 表明在哪⾥ 找到模块的初始化函数. 没有这个定义, 你的初始化函数不会被调⽤. 模块可以注册许多的不同设施, 包括不同类型的设备, ⽂件系统, 加密转换, 以及更多. 对每⼀个设施, 有⼀个特定的内核函数来完成这个注册. 传给内核注册函数的参数常常 是⼀些数据结构的指针, 描述新设施以及要注册的新设施的名⼦. 数据结构常常包含模 块函数指针, 模块中的函数就是这样被调⽤的. 能够注册的项⽬远远超出第 1 章中提到的设备类型列表. 它们包括, 其他的, 串⼜, 多样 设备, sysfs ⼊⼜, /proc ⽂件, 执⾏域, 链路规 . 这些可注册项的⼤部分都⽀持不直接和 硬件相关的函数, 但是处于软件抽象区域⾥. 这些项可以注册, 是因为它们以各种⽅式 (例如象 /proc ⽂件和链路规 )集成在驱动的功能中. 对某些驱动有其他的设施可以注册作为补充, 但它们的使⽤太特别, 所以不值得讨论它 们. 它们使⽤堆叠技术, 在内核符号表⼀节中讲过. 如果你想深⼊探求, 你可以在内核 源码⾥查找 XPORTSYMBOL , 找到由不同驱动提供的⼊⼜点. ⼤部分注册函数以 register 做前缀, 因此找到它们的另外⼀个⽅法是在内核源码⾥查找 register_ . 2.7.1. 清理函数 每个⾮试验性的模块也要求有⼀个清理函数, 它注销接⼜, 在模块被去除之前返回所有 资源给系统. 这个函数定义为: static void __exit cleanup_function(void) { /* Cleanup code here */ } module_exit(cleanup_function); 清理函数没有返回值, 因此它被声明为 void . exit 修饰符标识这个代码是只⽤于模块卸 载( 通过 编译器把它放在特殊的 ELF 段). 如果你的模块直接建⽴在内核⾥, 或者如 果你的内核配置成不允许模块卸载, 标识为 exit 的函数被简单地丢弃. 因为这个原因, ⼀个标识 __exit 的函数只在模块卸载或者系统停⽌时调⽤; 任何别的使⽤是错的. 再⼀ 次, moudle_exit 声明对于使得内核能够找到你的清理函数是必要的. 如果你的模块没有定义⼀个清理函数, 内核不会允许它被卸载. 2.7.2. 初始化中的错误处理 你必须记住⼀件事, 在注册内核设施时, 注册可能失败. 即便最简单的动作常常需要内 存分配, 分配的内存可能不可⽤. 因此模块代码必须⼀直检查返回值, 并且确认要求的 操作实际上已经成功. 如果在你注册⼯具时发⽣任何错误, ⾸先第⼀的事情是决定模块是否能够⽆论如何继 续初始化它⾃⼰. 常常, 在⼀个注册失败后模块可以继续操作, 如果需要可以功能降级. 在任何可能的时候, 你的模块应当尽⼒向前, 并提供事情失败后具备的能⼒. 如果证实你的模块在⼀个特别类型的失败后完全不能加载, 你必须取消任何在
您可能关注的文档
最近下载
- 2025年湖北省武汉市中考英语试题(附答案和音频).pdf VIP
- 高教社2025马工程教育学原理第二版教学课件第6章 学校教育制度.pptx VIP
- 2025喀什经济开发区兵团分区招聘(10人)笔试备考题库及答案解析.docx VIP
- 2024《南京地土建四工区施工组织设计》开题报告文献综述7100字.docx VIP
- 借 条(标准版)模板.pdf VIP
- 济源市建筑垃圾绿色低碳资源化利用项目环评报告表.pdf VIP
- [英语]动词的种类.ppt VIP
- 钢结构设计基础钢檩条设计檩条的布置连接与构造檀秋芬04课件讲解.pptx VIP
- 动词的种类动词的种类.ppt VIP
- 西门子S7-1500通过报文111实现对汇川SV660F伺服驱动器位置控制.docx VIP
有哪些信誉好的足球投注网站
文档评论(0)