版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第5 5章章 构建第一个驱动程序构建第一个驱动程序万事开头难,写驱动程序也一样,本章将构建第一个万事开头难,写驱动程序也一样,本章将构建第一个驱动程序。驱动程序和模块的关系非常密切,所以这里将详驱动程序。驱动程序和模块的关系非常密切,所以这里将详细讲解模块的相关知识。而模块编程成败与否的先决条件是细讲解模块的相关知识。而模块编程成败与否的先决条件是要有统一的内核版本,所以这里将讲解怎样升级内核版本。要有统一的内核版本,所以这里将讲解怎样升级内核版本。最后为了提高程序员的编程效率,这里将介绍两种集成开发最后为了提高程序员的编程效率,这里将介绍两种集成开发环境。环境。5.1 5.1 开发环境配置
2、之内核升级开发环境配置之内核升级构建正确的开发环境,对写驱动程序非常重要。错误构建正确的开发环境,对写驱动程序非常重要。错误的开发环境,编写出的驱动程序不能正确运行。特别是关于的开发环境,编写出的驱动程序不能正确运行。特别是关于内核版本的问题,内核版本不匹配,会使驱动程序根本不能内核版本的问题,内核版本不匹配,会使驱动程序根本不能在系统中运行,所以需要对内核进行升级。本节我们将对在系统中运行,所以需要对内核进行升级。本节我们将对Fedora Core 9进行内核升级,首先将说明为什么要升级内核进行内核升级,首先将说明为什么要升级内核。5.1.1 5.1.1 为什么升级内核为什么升级内核 内核是
3、一个提供硬件抽象层、磁盘及文件系统控制、内核是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。根据内核是否被修改过,可以将多任务等功能的系统软件。根据内核是否被修改过,可以将内核分为标准内核和厂商内核两类。内核分为标准内核和厂商内核两类。5.1.2 5.1.2 内核升级内核升级尽管在尽管在Fedora Core 9中可以使用中可以使用“软件包管理器工具软件包管理器工具”对内核进行升级,但是毕竟是开发厂商编译的内核有其局对内核进行升级,但是毕竟是开发厂商编译的内核有其局限性。里面添加了很多驱动开发系统不需要的模块,而驱动限性。里面添加了很多驱动开发系统不需要的模块,而驱动开发需要
4、的模块却没有开启。因此,学会自己手动编译升级开发需要的模块却没有开启。因此,学会自己手动编译升级内核也是很必要的。这里,我们将内核升级为内核也是很必要的。这里,我们将内核升级为linux 2.6.29.4。5.1.3 make menconfig5.1.3 make menconfig的注意事项的注意事项在升级内核的过程中,第在升级内核的过程中,第6步需要非常的注意。第步需要非常的注意。第6步步是对内核进行配置,特别是对是对内核进行配置,特别是对CPU进行配置。标准内核源码进行配置。标准内核源码对对CPU的默认配置是:的默认配置是:Pentium-Pro,其是高性能奔腾处理,其是高性能奔腾处理
5、器。在很多情况下,如果使用这个器。在很多情况下,如果使用这个CPU配置编译内核,那么配置编译内核,那么很可能会出现系统引导时无法识别很可能会出现系统引导时无法识别CPU的错误。所以建议将的错误。所以建议将CPU类型改为目前通用的类型改为目前通用的X586类型。类型。5.2 Hello World5.2 Hello World驱动程序驱动程序本节将带领读者编写第一个驱动模块,该驱动模块的功能本节将带领读者编写第一个驱动模块,该驱动模块的功能是在加载时,输出是在加载时,输出“Hello, World”;在卸载时,输出;在卸载时,输出“Goodbye, World”。这个驱动模块虽然非常简单,但是也
6、包含。这个驱动模块虽然非常简单,但是也包含了驱动模块的重要组成部分。在本节的开始,将先对模块的重了驱动模块的重要组成部分。在本节的开始,将先对模块的重要组成部分进行介绍。要组成部分进行介绍。5.2.1 5.2.1 驱动模块的组成驱动模块的组成一个驱动模块主要有如下部分组成,如图一个驱动模块主要有如下部分组成,如图5.2所示。图所示。图5.2表示的是一个规范的驱动模块应该包含的结构。这些结表示的是一个规范的驱动模块应该包含的结构。这些结构在图中的顺序也是在源文件中的顺序。不按照这样的顺序构在图中的顺序也是在源文件中的顺序。不按照这样的顺序来编写驱动模块也不会出错,只是大多数开发人员都喜欢这来编写
7、驱动模块也不会出错,只是大多数开发人员都喜欢这样的顺序规范。下面对主要的结构部分进行说明。样的顺序规范。下面对主要的结构部分进行说明。5.2.2 Hello World5.2.2 Hello World模块模块任何一本关于编程的书,几乎都以任何一本关于编程的书,几乎都以“Hello World”开始。开始。现在,来看一下最简单的一个驱动模块。现在,来看一下最简单的一个驱动模块。5.2.3 5.2.3 编译编译Hello WorldHello World模块模块在对在对Hello World模块进行编译时,需要满足一定的条模块进行编译时,需要满足一定的条件:件:1编译内核模块的条件编译内核模块的
8、条件2Makefile文件文件3Makefile文件的执行过程文件的执行过程4编译模块编译模块5.2.4 5.2.4 模块的操作模块的操作Linux为用户提供了为用户提供了modutils工具,用来操作模块。这个工具,用来操作模块。这个工具集主要包括工具集主要包括:insmod命令加载模块。命令加载模块。rmmod命令卸载模块。命令卸载模块。modprobe命令是比较高级的加载和删除模块命令,其可命令是比较高级的加载和删除模块命令,其可以解决模块之间的依赖性问题。以解决模块之间的依赖性问题。lsmod命令列出已经加载的模块和其信息。命令列出已经加载的模块和其信息。modinfo命令命令用于查询
9、模块的相关信息,比如作者,版权等。用于查询模块的相关信息,比如作者,版权等。5.2.5 Hello World5.2.5 Hello World模块加载后文件系统的变化模块加载后文件系统的变化当使用当使用insmod hello.ko加载模块后文件系统会发生什么加载模块后文件系统会发生什么样的变化呢?文件系统存储着有关模块的属性信息。程序员样的变化呢?文件系统存储着有关模块的属性信息。程序员可以从这些属性信息中了解目前模块在系统中的状态,这些可以从这些属性信息中了解目前模块在系统中的状态,这些状态对开发调试非常重要。状态对开发调试非常重要。5.3 5.3 模块参数和模块之间通讯模块参数和模块之
10、间通讯为了增加模块的灵活性,可以给模块添加参数。模块为了增加模块的灵活性,可以给模块添加参数。模块参数可以控制模块的内部逻辑,从而使模块可以在不同的情参数可以控制模块的内部逻辑,从而使模块可以在不同的情况下,完成不同的功能,下面首先对模块参数进行介绍。况下,完成不同的功能,下面首先对模块参数进行介绍。5.3.1 5.3.1 模块参数模块参数用户空间的应用程序可以接受用户的参数,设备驱动用户空间的应用程序可以接受用户的参数,设备驱动程序有时候也需要接受参数。例如一个模块可以实现两种相程序有时候也需要接受参数。例如一个模块可以实现两种相似的功能,这时可以传递一个参数到驱动模块,以决定其使似的功能,
11、这时可以传递一个参数到驱动模块,以决定其使用哪一种功能。参数需要在加载模块时指定,例如用哪一种功能。参数需要在加载模块时指定,例如inmod xxx.ko param=1。5.3.2 5.3.2 模块的文件格式模块的文件格式ELFELF了解模块以何种格式存储在硬盘中,对于理解模块间了解模块以何种格式存储在硬盘中,对于理解模块间怎样通讯时非常有必要的。怎样通讯时非常有必要的。5.3.3 5.3.3 模块之间的通讯模块之间的通讯模块是为了完成某种特定任务而设计的。其功能比较的单模块是为了完成某种特定任务而设计的。其功能比较的单一,为了丰富系统的功能,所以模块之间常常进行通信。其之间一,为了丰富系统
12、的功能,所以模块之间常常进行通信。其之间可以共享变量,数据结构,也可以调用对方提供的功能函数。可以共享变量,数据结构,也可以调用对方提供的功能函数。5.3.4 5.3.4 模块之间的通讯实例模块之间的通讯实例本实例通过两个模块来介绍模块之间的通信。模块本实例通过两个模块来介绍模块之间的通信。模块add_sub提供了两个导出函数提供了两个导出函数add_integer()和和sub_integer(),分别完成两个数字的加法和减法。模块分别完成两个数字的加法和减法。模块test用来调用模块用来调用模块add_sub提供的两个方法,完成加法或者减法操作。提供的两个方法,完成加法或者减法操作。1ad
13、d_sub模块模块2test模块模块3编译模块编译模块4测试模块测试模块5.4 5.4 将模块加入内核将模块加入内核当编译了模块,如果希望模块随系统一起启动,那么当编译了模块,如果希望模块随系统一起启动,那么需要将模块静态编译进内核。将模块静态编译入内核,需要需要将模块静态编译进内核。将模块静态编译入内核,需要完成一些必要的步骤。完成一些必要的步骤。5.4.1 5.4.1 向内核添加模块向内核添加模块向向Linux内核中添加驱动模块,需要完成内核中添加驱动模块,需要完成4个工作:个工作:(1)编写驱动程序文件。)编写驱动程序文件。(2)将驱动程序文件放到)将驱动程序文件放到Linux内核源码的
14、相应目录中,如果内核源码的相应目录中,如果没有合适的目录,可以自己建立一个目录来存放驱动程序文件。没有合适的目录,可以自己建立一个目录来存放驱动程序文件。(3)在目录的)在目录的Kconfig文件中添加新驱动程序对应的项目编译文件中添加新驱动程序对应的项目编译选择。选择。(4)在目录的)在目录的Makefile文件中添加新驱动程序的编译语句。文件中添加新驱动程序的编译语句。5.4.2 Kconfig5.4.2 Kconfig内核源码树的目录下都有两个文件内核源码树的目录下都有两个文件Kconfig和和Makefile。分。分布到各目录的布到各目录的Kconfig文件构成了一个分布式的内核配置数
15、据文件构成了一个分布式的内核配置数据库,每个库,每个Kconfig文件分别描述了所属目录源文档相关的内核文件分别描述了所属目录源文档相关的内核配置菜单。在内核配置配置菜单。在内核配置make menuconfig(或或xconfig等等)时,从时,从Kconfig中读出菜单,用户选择后保存到中读出菜单,用户选择后保存到.config这个内核配置文这个内核配置文档中。在内核编译时,主目录中的档中。在内核编译时,主目录中的Makefile调用这个调用这个.config文文件,就知道了用户的选择。件,就知道了用户的选择。5.4.3 Kconfig5.4.3 Kconfig的语法的语法Kconfig语
16、法较为简单,其语法在语法较为简单,其语法在Documentation/kbuild/kconfig-language.txt文件中做了介绍。文件中做了介绍。归纳起来归纳起来Kconfig的语法主要包括以下几个方面:的语法主要包括以下几个方面:1主要语法总览主要语法总览2菜单入口(菜单入口(config)3菜单结构(菜单结构(menu)4选择菜单(选择菜单(choice)5注释菜单(注释菜单(comment)5.4.4 5.4.4 应用实例:在内核中新增加应用实例:在内核中新增加add_subadd_sub模模块块下面讲解一个综合实例,假设我们将要在内核中添加下面讲解一个综合实例,假设我们将要在内核中添加一个一个add_sub模块。考虑模块。考虑add_sub模块的功能,决定将该模模块的功能,决定将该模块加到内核源码的块加到内核源码的drivers目录中。在目录中。在drivers目录中增加一个目录中增加一个add_sub_Kconfig子目录。子目录。5.4.5 5.4.5 对对add_subadd_sub模块进行配置模块进行配置当将当将add_sub模块的源文件加入到内核源代码中后,需模块的源文件加入到内核源代码中后,需要对其进行配置,才能编译模块。要对其进行配置,才能编译模块。5.5
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025采购类合同范本样式
- 2025年短视频代运营合同协议(效果)
- 2025关于个人的房屋租赁合同范本
- 2025年工业电钻采购质量成本控制策略报告
- 2025年新能源行业绿色建筑技术应用研究报告
- 2025工程承包劳务合同协议
- 2025年共享汽车充电服务市场竞争策略分析报告
- 2025年互联网广告代理合同付款补充协议
- 2025船舶购买买卖合同
- 粮油店活动策划方案
- 福建省莆田市第二中学2024-2025学年高二上学期期中考试物理试题(解析版)
- 小儿鼾症课件教学课件
- 国家开放大学本科(非英语专业)学士学位英语统一考试样题
- 中国建设银行建信消费金融有限责任公司招聘笔试真题2023
- 幼儿园课件运动项目知多少
- 2024年新人教版部编本一年级上册美术教学工作计划及教学进度2
- 2024-2030年中国脂肪乳注射液行业发展分析及竞争格局与发展趋势预测研究报告
- 危险作业清单
- 工业园标准化厂房建设工程监理投标大纲(框架结构 技术标)
- 中国纺织文化智慧树知到期末考试答案章节答案2024年武汉纺织大学
- 金蝶云星空财务云整体解决方案
评论
0/150
提交评论