第二章 Linux内核与内核模块jiu Linux设备驱动程序 教学课件.pptVIP

第二章 Linux内核与内核模块jiu Linux设备驱动程序 教学课件.ppt

  1. 1、本文档共50页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第二章 Linux内核与内核模块jiu Linux设备驱动程序 教学课件

设备驱动程序 第二章 Linux内核与内核模块 目录 Linux内核的组成 内核的编译及加载 内核模块的程序结构 模块加载和卸载函数 模块参数 导出符号 模块声明与描述 模块的使用计数 模块的编译 模块与GPL 目录 Linux内核的组成 内核的编译及加载 内核模块的程序结构 模块加载和卸载函数 模块参数 导出符号 模块声明与描述 模块的使用计数 模块的编译 模块与GPL Linux内核源代码结构 Linux内核的组成部分 Linux内核主要由以下五个子系统组成: 进程调度 内存管理 虚拟文件系统 网络接口 进程间通信 进程调度 内存管理 虚拟文件系统 Linux内核空间与用户空间 现代CPU内部往往实现了不同的操作模式(级别)。 Linux系统充分利用CPU的这一硬件特性,但它只使用了两级。Linux系统中,内核可进行任何操作,而应用程序则被禁止对硬件的直接访问和对内存的未授权访问。 内核空间和用户空间是用来区分程序执行的两种不同状态,它们使用不同的地址空间。 Linux系统只能通过系统调用和硬件中断完成从用户空间到内核空间的控制转移。 目录 Linux内核的组成 内核的编译及加载 内核模块的程序结构 模块加载和卸载函数 模块参数 导出符号 模块声明与描述 模块的使用计数 模块的编译 模块与GPL 内核模块简介 什么是模块? 从代码特征上来看,模块就是可完成一项独立功能的一组函数的集合。 从使用特征上来看,它在被需要时可以随时安装,而在不需要时又可以随时被卸载。 总之,模块是一个为内核或其他内核模块提供使用功能的代码块。 准确地说,模块就是一个已编译但未连接的可执行文件。 Linux是一个一体化内核,内核中各部件联系紧密,当因为某种原因需要增加、扩充时,用户必须对内核全部重新编译一次,所以,为了弥补这个缺点,Linux建立了模块机制。 内核模块简介 模块机制使得编译出的内核本身并不需要包含所有功能,而在这些功能需要被使用的时候,其对应的代码可被动态地加载到内核中。 模块的特点: 模块本身不被编译入内核映像,从而控制了内核的大小 模块一旦被加载,它就和内核中的其他部分完全一样 内核模块简介 从内核的角度看,模块所包含的代码段一旦被连接到内核,它就可以是内核的一部分,所以它也被叫做内核模块。 从用户角度看,模块是内核的一个外挂的配件,需要时可以将其连接到内核上,以完成用户所要求的任务;不需要时可以将其删除。它给用户提供了扩充内核功能的手段。 一个最简单的内核模块 代码说明 Printk()是内核使用的函数。因为在内核中不能调用C库函数,所以在内核模块中必须使用由内核提供的相关函数。 这个最简单的内核模块只包含内核模块加载函数、卸载函数和对Dual BSD/GPL许可权限的声明以及一些描述信息。 编译它会产生hello.ko目标文件,通过insmod ./hello.ko命令可以加载它,输出hello world enter。 通过rmmod hello命令可以卸载它,输出hello world exit。 内核模块程序结构 一个Linux内核模块主要由以下几部分组成: 模块加载函数(必须) 模块卸载函数(必须) 模块许可证声明(必须) 模块参数(可选) 模块导出符号(可选) 模块作者等信息声明(可选) 目录 Linux内核的组成 内核的编译及加载 内核模块的程序结构 模块加载和卸载函数 模块参数 导出符号 模块声明与描述 模块的使用计数 模块的编译 模块与GPL 模块加载函数 Linux内核模块加载函数一般以_ _init标识声明,典型的模块加载函数的形式: 模块加载函数必须以module_init(函数名)的形式被指定。它返回整型值,若初始化成功,应返回0;失败则返回错误编码。 在Linux内核中,所有标识为_ _init的函数在连接的时候都放在.init.text这个区段内,此外,所有的_ _init函数在.initcall.init区段中还保存了一份函数指针,在初始化时内核会通过这些函数指针调用这些_ _init函数,并在初始化完成后释放init区段。 模块卸载函数 Linux内核模块加载函数一般以_ _exit标识声明,典型的模块卸载函数的形式: 模块卸载函数在模块卸载的时候运行,不返回任何值,必须以module_ _exit(函数名)的形式来指定。 和_ _init一样, _ _exit也可以使对应函数在运行完成后自动回收内存。 模块加载和卸载函数 若模块加载函数注册了XXX,则模块卸载函数应该注销XXX。 若模块加载函数动态申请了内存,则模块卸载函数应释放内存。 若模块加载函数申请了硬件资源的占用,则模块卸载函数应释放这些硬件资源。 若模块加载函数开启了硬件,则卸载函数中一般要关闭硬件。 目录 Lin

文档评论(0)

qiwqpu54 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档