第5章 构建第一个驱动程序解析.ppt

  1. 1、本文档共23页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第5章 构建第一个驱动程序解析

第5章 构建第一个驱动程序 万事开头难,写驱动程序也一样,本章将构建第一个驱动程序。驱动程序和模块的关系非常密切,所以这里将详细讲解模块的相关知识。而模块编程成败与否的先决条件是要有统一的内核版本,所以这里将讲解怎样升级内核版本。最后为了提高程序员的编程效率,这里将介绍两种集成开发环境。 5.1 开发环境配置之内核升级 构建正确的开发环境,对写驱动程序非常重要。错误的开发环境,编写出的驱动程序不能正确运行。特别是关于内核版本的问题,内核版本不匹配,会使驱动程序根本不能在系统中运行,所以需要对内核进行升级。本节我们将对Fedora Core 9进行内核升级,首先将说明为什么要升级内核。 5.1.1 为什么升级内核 内核是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。根据内核是否被修改过,可以将内核分为标准内核和厂商内核两类。 5.1.2 内核升级 尽管在Fedora Core 9中可以使用“软件包管理器工具”对内核进行升级,但是毕竟是开发厂商编译的内核有其局限性。里面添加了很多驱动开发系统不需要的模块,而驱动开发需要的模块却没有开启。因此,学会自己手动编译升级内核也是很必要的。这里,我们将内核升级为linux 2.6.29.4。 5.1.3 make menconfig的注意事项 在升级内核的过程中,第6步需要非常的注意。第6步是对内核进行配置,特别是对CPU进行配置。标准内核源码对CPU的默认配置是:Pentium-Pro,其是高性能奔腾处理器。在很多情况下,如果使用这个CPU配置编译内核,那么很可能会出现系统引导时无法识别CPU的错误。所以建议将CPU类型改为目前通用的X586类型。 5.2 Hello World驱动程序 本节将带领读者编写第一个驱动模块,该驱动模块的功能是在加载时,输出“Hello, World”;在卸载时,输出“Goodbye, World”。这个驱动模块虽然非常简单,但是也包含了驱动模块的重要组成部分。在本节的开始,将先对模块的重要组成部分进行介绍。 5.2.1 驱动模块的组成 一个驱动模块主要有如下部分组成,如图5.2所示。图5.2表示的是一个规范的驱动模块应该包含的结构。这些结构在图中的顺序也是在源文件中的顺序。不按照这样的顺序来编写驱动模块也不会出错,只是大多数开发人员都喜欢这样的顺序规范。下面对主要的结构部分进行说明。 5.2.2 Hello World模块 任何一本关于编程的书,几乎都以“Hello World”开始。现在,来看一下最简单的一个驱动模块。 5.2.3 编译Hello World模块 在对Hello World模块进行编译时,需要满足一定的条件: 1.编译内核模块的条件 2.Makefile文件 3.Makefile文件的执行过程 4.编译模块 5.2.4 模块的操作 Linux为用户提供了modutils工具,用来操作模块。这个工具集主要包括: insmod命令加载模块。 rmmod命令卸载模块。 modprobe命令是比较高级的加载和删除模块命令,其可以解决模块之间的依赖性问题。 lsmod命令列出已经加载的模块和其信息。modinfo命令用于查询模块的相关信息,比如作者,版权等。 5.2.5 Hello World模块加载后文件系统的变化 当使用insmod hello.ko加载模块后文件系统会发生什么样的变化呢?文件系统存储着有关模块的属性信息。程序员可以从这些属性信息中了解目前模块在系统中的状态,这些状态对开发调试非常重要。 5.3 模块参数和模块之间通讯 为了增加模块的灵活性,可以给模块添加参数。模块参数可以控制模块的内部逻辑,从而使模块可以在不同的情况下,完成不同的功能,下面首先对模块参数进行介绍。 5.3.1 模块参数 用户空间的应用程序可以接受用户的参数,设备驱动程序有时候也需要接受参数。例如一个模块可以实现两种相似的功能,这时可以传递一个参数到驱动模块,以决定其使用哪一种功能。参数需要在加载模块时指定,例如inmod xxx.ko param=1。 5.3.2 模块的文件格式ELF 了解模块以何种格式存储在硬盘中,对于理解模块间怎样通讯时非常有必要的。 5.3.3 模块之间的通讯 模块是为了完成某种特定任务而设计的。其功能比较的单一,为了丰富系统的功能,所以模块之间常常进行通信。其之间可以共享变量,数据结构,也可以调用对方提供的功能函数。 5.3.4 模块之间的通讯实例 本实例通过两个模块来介绍模块之间的通信。模块add_sub提供了两个导出函数add_integer()和sub_integer(),分别完成两个数字的加法和减法。模块test用来调用模块add_sub提供的两个方法,完成加法或者减法

文档评论(0)

2299972 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档