收藏 分销(赏)

Linux驱动开发入门与实战PPT.ppt

上传人:w****g 文档编号:5887390 上传时间:2024-11-22 格式:PPT 页数:415 大小:1.66MB
下载 相关 举报
Linux驱动开发入门与实战PPT.ppt_第1页
第1页 / 共415页
Linux驱动开发入门与实战PPT.ppt_第2页
第2页 / 共415页
Linux驱动开发入门与实战PPT.ppt_第3页
第3页 / 共415页
Linux驱动开发入门与实战PPT.ppt_第4页
第4页 / 共415页
Linux驱动开发入门与实战PPT.ppt_第5页
第5页 / 共415页
点击查看更多>>
资源描述

1、,Click to edit Master title style,Click to edit Master text styles,Click to edit Master title style,Click to edit Master text styles,Linux,驱动开发入门与实战,第,1,章,Linux,驱动开发概述,设备驱动程序是计算机硬件与应用程序的接口,是软件系统与硬件系统沟通的桥梁。如果没有设备驱动程序,那么硬件设备就只是一堆废铁,没有一点的功能。本章将对,Linux,驱动开发进行简要的概述,使读者理解一些常见的概念。,1.1 Linux,设备驱动的基本概念,本节对中断

2、相关概念进行了简要的分析,并对中断进行了分类。根据不同的中断类型,写中断驱动程序的方法也不一样。下面将主要介绍中断的基本概念和常见分类。,1.1.1,设备驱动程序概述,设备驱动程序(,Device Driver,),简称驱动程序(,Driver,)。它是一个允许计算机软件(,Computer Software,)与硬件(,Hardware,)交互的程序。这种程序建立了一个硬件与硬件,或硬件与软件沟通的界面。,CPU,经由主板上的总线(,Bus,)或其它沟通子系统(,Subsystem,)与硬件形成连接,这样的连接使得硬件设备(,Device,)之间的数据交换成为可能。,1.1.2,设备驱动程序

3、的作用,设备驱动程序是一种可以使计算机和设备通信的特殊程序,可以说相当于硬件的接口。操作系统只有通过这个接口,才能控制硬件设备的工作。假如某设备的驱动程序未能正确安装,便不能正常工作。正因为这个原因,驱动程序在系统中的所占的地位十分重要。一般当操作系统安装完毕后,首要的便是安装硬件设备的驱动程序。,1.1.3,设备驱动的分类,计算机系统的主要硬件由,CP,U,、,存储器和外部设备组成。驱动程序的对象一般是存储器和外部设备。随着芯片制造工艺的提高,为了节约成本,通常将很多原属于外部设备的控制器嵌入到,CPU,内部。所以现在驱动程序应该支持,CPU,中的嵌入控制器。,Linux,将这些设备分为,3

4、,大类:字符设备、块设备、网络设备。,1.2 Linux,操作系统与驱动的关系,Linux,操作系统与设备驱动之间的关系如图所示。用户空间包括应用程序和系统调用两层。应用程序一般依赖于函数库,而函数库是由系统调用来编写的,所以应用程序间接地依赖于系统调用。,1.3 Linux,驱动程序开发,Linux,驱动程序的开发与应用程序的开发有很大的差别。这些差别导致了编写,Linux,设备驱动程序与编写应用程序有本质的区别,所以对于应用程序的设计技巧很难直接应用在驱动程序的开发上。本节将对,Linux,驱动程序的开发进行简要的讲解。,1.3.1,用户态和内核态,Linux,操作系统分为用户态和内核态。

5、用户态处理上层的软件工作。内核态用来管理用户态的程序,完成用户态请求的工作。驱动程序与底层的硬件交互,所以工作在内核态。,1.3.2,模块机制,模块是可以在运行时加入内核的代码,这是,Linux,的一个很好的特性。这个特性使内核可以很容易的扩大或者缩小,一方面扩大内核可以增加内核的功能,另一方面缩小内核可以减小内核的大小。,1.3.3,编写设备驱动程序需要了解的知识,Linux,操作系统有三四百万行代码,其中驱动程序代码就有四分之三左右。所以对于驱动开发者来说,学习和编写设备驱动程序都是一个漫长的过程。在这个过程中,读者应该掌握如下的一些知识:,(,1,)驱动开发人员应该有良好的,C,语言基础

6、。,(,2,)驱动开发人员应该有良好的硬件基础。,(,3,)驱动开发人员应该对,Linux,内核源代码有初步的了解。,(,4,)驱动开发人员应该有多任务程序设计的能力。,1.4,编写设备驱动程序的注意事项,大部分程序员都比较熟悉应用程序的编写,但是对于驱动程序的编写可能不是很熟悉。关于应用程序的很多编程经验不能直接的应用于驱动程序的编写中来。下面给出编写驱动程序的一些注意事项,希望引起读者注意。,1.4.1,应用程序开发与驱动程序开发的差异,在,Linux,上的程序开发一般分为两种,一种是内核及驱动程序开发,另一种是应用程序开发。这两种开发种类对应,Linux,的两种状态,分别是内核态和用户态

7、。内核态用来管理用户态的程序,完成用户态请求的工作;用户态处理上层的软件工作。驱动程序与底层的硬件交互,所以工作在内核态。,1.4.2 GUN C,开发驱动程序,GUN C,语言最开始起源于一个,GUN,计划,,GUN,的意思是“,GUN is not UNIX”,。,GUN,计划开始于,1984,年,这个计划的目的是开发一个类似,UNIX,并且软件自由的完整操作系统。这个计划一直进行,直到,Linus,开发,Linux,操作系统时,,GNU,计划已经开发出来了很多高质量的自由软件。其中就包括著名的,GCC,编译器,,GCC,编译器能够编译,GUN C,语言。,Linus,考虑到,GUN,计划

8、的自由和免费,所以选择了,GCC,编译器来编写内核代码,之后的很多开发者也使用这个编译器,所以直到现在,驱动开发人员也使用,GUN C,语言来开放驱动程序。,1.4.3,不能使用,C,库来开发驱动程序,与用户空间的应用程序不同,内核不能调用标准的,C,函数库,主要的原因在于对于内核来说完整的,C,库太大了。一个编译的内核大小可以是,1M,左右的字节,而一个标准的,C,语言库大小可能操作,5M,字节。这对于存储容量较小的嵌入式设备来说,是不实用的。缺少标志,C,语言库,并不是说驱动程序就只能做很好的事情了。,1.4.4,没有内存保护机制,当一个用户应用程序由于编程错误,试图访问一个非法的内存空间

9、,那么操作系统内核会结束这个进程,并返回错误码。应用程序可以在操作系统内核的帮助下,恢复过来,而且应用程序并不会对操作系统内核有太大的影响。但是如果当操作系统内核访问了一个非法的内存,那么就有可能苹的诤说拇或者数据。这将导致内核处于未知的状态,内核会通过,oops,错误给用户一些提示,但是这些提示都是不支持,难以分析的。,1.4.5,小内核栈,用户空间的程序可以从栈上分配大量的空间来存放变量,甚至用栈存放巨大的数据结构或者数组都没问题。之所以能这样做是因为应用程序是非常驻内存的,它们可以动态的申请和释放所有可用的内存空间。内核要求使用固定常驻的内存空间,因此要求尽量少的占用常驻内存,而尽量多的

10、留出内存提供给用户程序使用。因此内核栈的长度是固定大小的,不可动态增长的,32,位机的内核栈是,8KB,;,64,位机的内核栈是,16KB,。,1.4.6,重视可移植性,对于用户空间的应用程序来说,可移植性一直是一个重要的问题。一般可移植性通过两种方式来实现。一种方式是定义一套可移植的,API,,然后对这套,API,在个这两个需要移植的平台上分别实现。应用程序开发人员,只要使用这套可移植的,API,,就可以写出可移植的程序。在嵌入式领域,比较常见的,API,套件是,QT,。另一种方式是使用类似,JAVA,、,actionscript,等可移植到很多操作系统上的语言。这些语言一般通过虚拟机来执行

11、,所以可以移植到很多平台上。,1.5 Linux,驱动的发展趋势,随着嵌入式技术的发展,使用,Linux,的嵌入式设备也越来越多。同样地,工业上对,Linux,驱动的开发也越来越重视。本节对,Linux,驱动的发展做简要的介绍。,1.5.1 Linux,驱动的发展,Linux,和嵌入式,Linux,软件在过去几年里已经越来越普遍的为,IT,业、半导体公司、嵌入式系统所认可和接受,它已经成为一个可以替代微软的,Windows,和众多传统的,RTOS,的重要的操作系统。,Linux,内核和基本组件和工具已经是成熟的软件,面向行业,应用和设备的嵌入式,Linux,工具软件和嵌入式,Linux,操作系

12、统平台是未来发展的必然趋势。符合标准,遵循开放是大势所趋,人心所向,嵌入式,Linux,也不例外。,1.5.2,驱动的应用,计算机系统已经融入到了各行各业、各个领域;计算机系统在电子产品中无处不在,从手机、游戏机、冰箱、电视、洗衣机等小型设备,到汽车、轮船、火车、飞机等大型设备都有它的身影。这些设备都需要驱动程序来使之运行,可以说驱动程序的运用前景是非常广泛的。每一天都有很多驱动程序需要去编写,所以驱动程序开发人员的前途是无比光明的。,1.5.3,相关学习资源,学习,Linux,设备驱动程序,单单只是学习理论是不够的,还需要自动动手来写各种设备的驱动程序。写驱动程序不仅需要读者的软件知识,还需

13、要读者的硬件知识。在这里,推荐一些国内外优秀的驱动开发网站,希望读者的学习有所帮助。,(,1,),Linux,内核之旅网站:,嵌入式处理器和开发板简介,在实际的工程项目中,,Linux,驱动程序一般是为嵌入式系统而写的。因为嵌入式系统因用途、功能、设计厂商不同,硬件之间存在很多的差异。这些差异性,不能通过写一个通用的驱动程序来完成,需要针对不同的设备书写不同的驱动程序。要写驱动程序,必须了解处理器和开发板的相关信息,本章将对这些信息进行详解讲解。,2.1,处理器的选择,本节对处理器的概念进行了简要的讲解,并介绍了一些常用的处理器种类,以使读者对嵌入式系统的处理器有初步的认识。,2.1.1,处理

14、器简述,处理器是解释并执行指令的功能部件。每个处理器都有一个独特的诸如,mov,、,add,或,sub,这样的操作命令集,这个操作集被称为指令系统。在计算机诞生初期,设计者喜欢将计算机称为机器,所以该指令系统有时也称作机器指令系统。,2.1.2,处理器的种类,处理器作为一种高科技产品,其技术含量非常高,目前全世界只有少数厂商能够设计。这些厂商主要有,Intel,、,AMD,、,ARM,、中国威盛、,Cyrix,、,IBM,和龙芯等。目前,处理器在嵌入式领域应用十分广泛,各大厂商都推出了自己的嵌入式处理器,主要的嵌入式处理器有:英特尔的,PXA,系列处理器、,StrongARM,系列处理器、,M

15、IPS,处理器、摩托罗拉龙珠,(DragonBall),系列处理器、日立,SH3,处理器和德州仪器,OMAP,系列处理器。了解这些嵌入式处理器的特性,是驱动开发人员必须补的一课,所以本节对这些常用的处理器进行简要的介绍。,1,英特尔的,PXA,系列处理器,2,StrongARM,系列处理器,3,MIPS,处理器,4,摩托罗拉龙珠,(DragonBall),系列处理器,5,日立,SH3,处理器,6,德州仪器,OMAP,系列处理器,2.2 ARM,处理器,ARM,处理器价格便宜,功能相对较多,是目前最为流行的嵌入式处理器之一。,ARM,处理器分为很多种类,适用于不同的应用。本节对其进行详细介绍。,

16、2.2.1 ARM,处理器简介,ARM,处理器是目前最为流行的处理器之一,下面对该处理器的一些常识进行介绍。,1,ARM,处理器,2,ARM,处理器的特点,2.2.2 ARM,处理器系列,ARM,处理器当前有,6,个产品系列:,ARM7,、,ARM9,、,ARM9E,、,ARM10,、,ARM11,和,SecurCore,,其中,ARM11,为最近推出的产品。进一步产品来自于合作伙伴,例如,Intel Xscale,微体系结构和,StrongARM,产品。,ARM7,、,ARM9,、,ARM9E,、,ARM10,是,4,个通用处理器系列。每个系列提供一套特定的性能来满足设计者对功耗、性能、体积

17、的需求。,SecurCore,是第,5,个产品系列,是专门为安全设备而设计的。目前中国市场应用较成熟的,ARM,处理器以,ARM7TDMI,和,ARM9,核为主。主要的厂家有,SAMSUNG,、,ATMEL,、,OKI,等知名半导体厂商。,2.2.3 ARM,处理器的应用,虽然,8,位微控制器仍然占据着低端嵌入式产品的大部分市场,但是随着应用的增加,,ARM,处理器的应用也越来越广泛。,2.2.4 ARM,处理器的选型,随着国内外嵌入式应用领域的发展,,ARM,芯片必然会获得广泛的重视和应用。但是,由于,ARM,芯片有多达十几种的芯核结构,,100,多家芯片生产厂家,以及千变万化的内部功能配置

18、组合,给开发人员在选择方案时带来一定的困难。本节将从应用的角度,介绍,ARM,芯片选择的一般原则。,2.2.5 ARM,处理器选型举例,在选择处理器的过程中,应该选择合适的处理器。所谓合适就是在能够满足功能的前提下,选择价格尽量便宜的处理器,这样开发出来的产品更具有市场竞争力。消费者也可以从合适的搭配中,找到性价比高的产品,满足消费者的需求。,2.3 S3C2440,开发板,S3C2440,开发板上集成了一块,S3C2440,处理器。,S3C2440,处理器是,ARM,处理器中的一款。其广泛使用在无线通信、工业控制、消费电子领域。本节将对,S3C2440,开发板进行详细的介绍。,2.3.1 S

19、3C2440,开发板简介,目前大多数拥有,ARM,处理的开发板都是基于,S3C2440,处理器的。基于,S3C2440,的开发板由于资料全面、扩展功能好、性能稳定三大特点,深受广大嵌入式学习者和嵌入式开发工程师喜爱。这种开发板由于性能较高,一般可以应用于车载手持、,GIS,平台、,Data Servers,、,VOIP,、网络终端、工业控制、检测设备、仪器仪表、智能终端、医疗器械、安全监控等产品中。,2.3.2 S3C2440,开发板的特性,基于,S3C2440,开发板包含了许多实用的特性,这些特性都是驱动开发人员练习驱动开发的好的材料。下面对这些开发板一般都具有的特性进行介绍。,1,CPU,

20、处理器,2,SDRAM,内存,3,FLASH,存储,4,LCD,显示,5,接口和资源,6,系统时钟源,7,实时时钟,8,扩展接口,9,操作系统支持,2.4,小结,本章简单的讲解了驱动开发人员必备的处理器器知识,详细介绍了,S3C2440,处理器构建的开发板。对驱动开放人员来说更为重要的是,处理器选型问题。本章不仅给出了详细的准则,而且对常见应用的选型进行了举例,相信读者从本章中会有所收获。,第,3,章 构建嵌入式驱动程序开发环境,在编写驱动程序之前,需要构建一个合适的开发环境。这个环境包括合适的,Linux,操作系,统、,网络,、,交叉编译工具,、,以及,NFS,服务等。为了使读者顺利地完成开

21、发环境的构建,本章将对这些主要内容进行讲解。,3.1,虚拟机和,Linux,安装,由于驱动开发需要涉及不同操作系统的功能,所以需要安装不同的操作系统。一般开发者偏好在,Windows,系统上安装虚拟机,然后在虚拟机上安装,Linux,系统。这种方式,可以使一台主机模拟多台主机的功能,从而提高开发的效率。这里,首先介绍安装虚拟机的方法。,3.1.1,在,Windows,上安装虚拟机,在,Window,上安装虚拟机,可以有多种选择。目前流行的虚拟机软件有,VMware,和,Virtual PC,。它们都能在,Windows,系统上虚拟出多个计算机,用于安装,Linux,、,OS/2,、,FreeB

22、SD,等其他操作系统。微软在,2003,年,2,月份收购,Connectix,后,很快发布了,Microsoft Virtual PC,。但出于种种考虑,新发布的,Virtual PC,已不再明确支持,Linux,、,FreeBSD,、,NetWare,、,Solaris,等操作系统,只保留了,OS/2,,如果要虚拟一台,Linux,计算机,只能自己手工设置。,3.1.2,在虚拟机上安装,Linux,本节将介绍怎样在虚拟机上安装,Fedora 9.0,,并详细介绍了如何建立,Linux,开发环境。下面对安装步骤进行详细的说明:,(,1,)在虚拟机的光驱上选择,Fedora 9.0,的光盘镜像文

23、件,然后启动虚拟机,进入安装界面,(,2,)然后进入检查安装盘的界面,如果节约时间,这里可以直接跳过(,Skip,),(,3,)当检查完之后,就会进入图形安装界面,这里的安装方法和,Windows,的安装方法类似。在安装过程中,用户可以选择安装的语言、键盘类型(一般为,U.S.English,式键盘)、网络地址等。安装过程较为简单,用户可以根据提示进行选择和设置,这里就不详细讲解了。,3.1.2,设置共享目录,在网络连接畅通的情况下,虚拟机和,Windows,之间可以通过共享文件,来完成两个系统的通信。设置共享文件,需要在,Windows,设置共享文件夹,而且还需要在虚拟机上进行一些设置,这个

24、过程如下所示:,(,1,)在,Windows,系统中共享文件夹,share,,右键单击文件夹,然后选择,【,共享这个文件夹,】,单选框,(,2,)在虚拟机中设置网络连接(,Network connection,)为,Birdged,方式,这种方式可以使同一台机器上的两个操作系统之间能够通信,(,3,)在,Fedora9,中,打开,Connect to Server,对话框,填写相应的服务器,ip,地址、共享文件夹、用户名和密码就能够访问,Windows,上的共享文件夹,3.2,代码阅读工具,Source Insight,单独用一节来讲解代码阅读工具是否值得,答案是值得的。因为,Linux,内核

25、有,500,多万行代码,其中驱动程序占了,2/3,以上。阅读和理解这些代码,对编写设备驱动程序来说是非常有帮助的,所以本节将告诉大家怎样有效的使用代码阅读工具阅读代码。,3.1.2 Source Insight,简介,Source Insight,是一个非常好的代码阅读、编辑和分析的工具。,Source Insight,支持目前大多数流行编程语言,如,C,、,C+,、,ASM,、,PAS,、,ASP,、,HTML,等。这个软件还支持关键字定义,对开发人员来说是非常有用的。,Source Insight,不但能够编写程序,有代码自动提示的功能,而且还能过显示引用树、类图结构、调用关系等等。,3.

26、1.2,阅读源代码,1,建立,Source Insight,工程,2,更新数据库,3,Source Insight,使用示例,3.2,小结,本章简要的介绍了驱动程序开发的一般环境,主要介绍了虚拟机和,Linux,操作系统的安装。另外,在驱动程序开发过程中,,Windows,系统和,Linux,操作系统之间传输数据也非常的重要,所以本章也介绍了文件共享的方法。最后介绍了一个分析和阅读源代码的工具,在实际的应用中非常有用。,第,4,章 构建嵌入式,Linux,操作系统,目前流行的嵌入式操作系统有,Linux,、,WinCE,、,VxWorks,等。,Linux,作为一种免费的类,UNIX,操作系统

27、,由于其功能强大,在嵌入式产品的应用中非常广泛。本章将对,Linux,操作系统做简单的介绍,并简述怎么自己构建一个可以运行的,Linux,操作系统。,4.1 Linux,操作系统的介绍,Linux,操作系统是嵌入式系统的主流操作系统,本节将对,Linux,操作系统进行简要的介绍。同时对,Linux,操作系统适用与嵌入式系统的原因进行简要分析。,4.1.1 Linux,操作系统,Linux,操作系统是一个类,Unix,计算机操作系统。,Linux,操作系统的内核的名字也是“,Linux”,。,Linux,这个词本身只表示,Linux,内核,但在实际上人们已经习惯了用,Linux,来形容整个基于,

28、Linux,内核的操作系统。,Linux,的最初版本由,Linus Torvalds,开发,此后得到互联网上很多计算机高手的支持,目前的版本已经到了,2.6,,已经是一个非常成熟稳定的操作系统。下面从不同方面对,Linux,操作系统进行简要的介绍。,4.1.2 Linux,操作系统的优点,Linux,操作系统有很多优点,具有十分丰富的应用功能。这些功能特别适用于嵌入式系统,这些优点如下所示:,1,价格低廉,2,高效性和灵活性,3,广泛性,4.2.2,内存管理,内存是计算机的主要资源之一,可以将内存理解为一个线性的存储结构。用来管理内存的策略是决定系统性能的主要因素。内核在有限的资源上为每一个进

29、程创建一个虚拟地址空间,并对虚拟地址空间进行管理。为了方便内存的管理,内核提供了一些重要的函数。这些函数包括,kmallo,c,、,kfree,等。另外设备驱动程序需要使用内存分配,不同的分配方式对驱动程序的影响不同,所以需要对内存分配有比较清晰的了解。,4.2.3,文件系统,在,Linux,操作系统中,文件系统是用来组织、管理、存放文件的一套管理机制。,Linux,文件系统的一大优点是,它几乎可以支持所有的文件格式。任何一种新的文件格式,都可以容易的写出相应的支持代码,并无缝的添加入内核中。虽然不同文件格式的文件以不同的存储方式存放在磁盘设备中,但是在用户看来,文件总以树形结构显示给用户。,

30、4.2.4,设备管理,无论是桌面系统还是嵌入式系统,都存在各种类型的设备。操作系统的一个重要功能就是对这些进行统一的管理。由于设备的种类繁多,不同设备的操作方法都不一样,使管理设备成为操作系统中非常复杂的部分。,Linux,系统通过某种方式较好的解决了这个问题,使设备的管理得到了统一。,设备管理的一个主要任务是完成数据从设备到内存的传输。一个完全的数据传输过程是:数据首先从设备传入内存,然后,CPU,对其进行处理,处理完后将数据传入内存或设备中。,4.2.5,网络功能,网络功能也由操作系统来完成。大部分的网络操作与用户进程都是分离的,数据包的接收和发送操作都是由相应的驱动程序来完成的,而与用户

31、进程无关。进程处理数据之前,驱动程序必须先收集,标识和发送或重组数据。当数据准备好后,系统负责用户进程和网络接口之间的数据传送。另外内核也负责实现网络通信协议。,4.3 Linux,源代码结构分析,了解,Linux,源代码结构对理解,Linux,如何实现各项功能是非常重要的。对驱动程序的编写也非常重要,这样,驱动开发人员知道应该在何处找到相关的驱动程序,一方面可以对其进行改写移植,另一个方面可以模仿以往的驱动程序,写出新的驱动程序。,Linux,源代码以目录的方式组织,每一个目录中有相关的内核代码。下面对各个主要的目录进行介绍。,4.3.1 arch,目录,随着,Linux,操作系统的广泛应用

32、,特别是,Linux,在嵌入式领域的发展,越来越多的人开始投身到,Linux,驱动的开发中。面对日益庞大的,Linux,内核源代码,驱动开发者在完成自己的内核代码后,都将面临着同样的问题,即如何将源代码融入到,Linux,内核中,增加相应的,Linux,配置选项,并最终被编译进,Linux,内核。这就需要对,Linux,源代码结构进行详细的介绍,首先介绍,arch,目录。,4.3.2 drivers,目录,drivers,目录中包含了,Linux,内核支持的大部分驱动程序。每种驱动程序都占用一个子目录。,4.3.3 fs,目录,fs,目录中包含了,Linux,所支持的所有文件系统相关的代码。每

33、一个子目录中包含一种文件系统,例如,msdos,和,ext3,。,Linux,几乎支持目前所有的文件系统,如果发现一种没有支持的新文件系统,那么可以很方便的在,fs,目录中添加一个新的文件系统目录,并实现一种文件系统。,4.3.4,其他目录,除了上面介绍的目录外,内核中还有其他一些重要的目录和文件。每一个目录和文件都有自己特殊的功能。,4.4,内核配置选项,自己构建嵌入式,Linux,操作系统,首先需要对内核源代码进行相应的配置。这些配置决定了嵌入式,Linux,操作系统所支持的功能,为了理解编译程序是怎样通过配置文件配置系统的,下面对配置编译过程进行详细的讲解。,4.4.1,配置编译过程,面

34、对日益庞大的,Linux,内核源代码,要手动的编译内核是十分困难的。幸好,Linux,提供了一套优秀的机制,简化了内核源代码的编译。这套机制由以下几个方面组成:,Makefile,文件,Kconfig,文件,配置文件,配置工具,4.4.2,常规配置,常规配置包含关于内核的大量配置,这写配置包含代码成熟度、版本信息、模块配置等。,4.4.3,模块配置,模块作为,Linux,的一种非常重要的组件,其有很多参数和功能可以配置。,4.4.4,块设备层配置,块设备层包含对系统使用的块设备的配置,其主要包含调度器的配置,硬盘设备的配置。,4.4.5 CPU,类型和特性配置,Linux,内核几乎支持所有体系

35、结构上的,CPU,。内核不能自动识别相应的,CPU,类型和一些相关的特性,需要在配置内核时根据实际的情况进行相应的配置。,4.4.6,电源管理配置,电源管理是操作系统中一个非常重要的模块,随着硬件设备省电节能能力的增强,该模块越来越重要。在嵌入式系统中,由于一般以电池供电,有低功耗的要求,所以在为嵌入式系统配置内核时,需要对相应的硬件配置电源管理模块。,4.4.7,总线配置,4.4.8,网络配置,网络是嵌入式系统与外部通信的主要方式。目前,许多嵌入式设备都具有网络功能,为了使内核支持网络功能,需要对其做一些特殊的配置。,4.4.9,设备驱动配置,Linux,内核实现了一些常用的驱动程序,如鼠标

36、、键盘、常见的,U,盘驱动等。这些驱动非常繁多,许多驱动对于嵌入式系统来说,并不需要。在实际的应用中,为了使配置的内核高效和小巧,值需要配置主要的一些驱动程序。,4.4.10,文件系统,文件系统是操作系统的主要组成部分。,Linux,支持很多文件系统,为了内核的高效和小巧性,支持哪些文件系统都是可以配置。,4.5,嵌入式文件系统基础知识,对于嵌入式系统来说,除了一个嵌入式操作系统以外,还需要一个嵌入式文件系统来管理和存储数据和程序。目前,嵌入式,Linux,操作系统支持很多种文件系统,具体使用哪种文件系统需要根据存储介质、访问速度、存储容量等来选择。本章将对嵌入式文件系统的基础知识进行简单的介

37、绍,首先需啊哟对嵌入式系统的存储介质有一定的了解。,4.5.1,嵌入式文件系统,Linux,支持多种文件系统,包括,ext2,、,ext3,、,vfat,、,ntfs,、,iso9660,、,jffs,、,romfs,、,cramfs,和,nfs,等,为了对各类文件系统进行统一管理,,Linux,引入了虚拟文件系统,VFS(Virtual File System),,为各类文件系统提供一个统一的操作界面和应用编程接口。,4.5.1,嵌入式系统的存储介质,Linux,操作系统支持大量的文件系统,在嵌入式领域,使用哪种文件系统需要根据存储芯片的类型来决定。目前市场上,嵌入式系统主流的两种存储介质是

38、,NOR,和,NAND Flash,。,Intel,公司于,1988,年首先开发了,NOR Flash,存储器。,NOR Flash,的特点是芯片内执行(,XIP,,,eXecute In Place,),这样应用程序可以直接在,Flash,闪存内运行,不必再把代码读到系统,RAM,中。,NOR,的传输效率很高,在,14MB,的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响到它的性能。,4.5.2 JFFS,文件系统,瑞典的,Axis Communications,公司基于,Linux2.0,的内核为嵌入式操作系统开发的,JFFS,文件系统。其升级版,JFFS2,是,RedHat

39、,公司基于,JFFS,开发的闪存文件系统,最初是针对,RedHat,公司的嵌入式产品,eCos,开发的嵌入式文件系统,所以,JFFS2,也可以用在,Linux,uCLinux,等操作系统之中。,JFFS,的全称是日志闪存文件系统。,4.5.3 YAFFS,文件系统,YAFFS,是第一个专门为,NAND Flash,存储器设计的嵌入式文件系统,适用于大容量的存储设备;并且是在,GPL,(,General Public License,)协议下发布的,可在其网站免费获得源代码。,YAFFS,文件系统有,4,个优点,分别是速度快、占用内存少、不支持压缩和只支持,NAND Flash,存储器。,4.6

40、,构建根文件系统,当内核启动后,第一件要做的事情就是到存储设备上找到根文件系统。根文件系统包含了使系统运行的主要程序和数据。本节对系统运行所必须的根文件系统进行详细的分析。,4.6.1,根文件系统概述,根文件系统是,Linux,操作系统运行需要的一个文件系统。根文件系统被存储在,Flash,存储器中,存储器被分为多个分区,例如分区,1,、,分区,2,、,分区,3,等,如图,4.6,所示。分区,1,一般存储,Linux,内核映象文件,在,Linux,操作系统中,内核映象文件一般存储在单独的分区中。分区,2,存放根文件系统,根文件系统中存放着系统启动必须的文件和程序。这些文件和程序包括:提供用户界

41、面的,shell,程序,、,应用程序依赖的库,、,配置文件等。,4.6.2 Linux,根文件系统目录结构,根文件系统以树形结构来组织目录和文件的结构。系统启动后,根文件系统被挂接到根目录“,/”,上,这是根目录下就包含了根文件系统的各个目录和文件,例如,/bi,n,、,/sbi,n,、,/mnt,等。根文件系统应该包含的目录和文件遵循,FHS,标准(,Filesystem Hierarchy Standard,,文件系统层次标准)。这个标准包含了根文件系统中最少应该包含哪些目录和文件,以及这些目录和文件的组织原则。,4.6.3 BusyBox,构建根文件系统,要使,Linux,操作系统能够正

42、常的运行起来,至少需要一个内核和根文件系统。根文件系统除了应该以,FHS,标准的格式组织之外,还应该包含一些必要的命令。这些命令提供给用户使用,以使用户能轻易的操作系统。,4.7,小结,本章主要讲解了怎样构建一个嵌入式操作系统的全过程。首先对,Linux,操作系统的特性做了简单的介绍,然后阐述了,Linux,操作系统的主要内核子系统。在,4.3,节,讲解了,Linux,内核源代码的结构,为修改内核,编写驱动程序打下了基础。第,4.4,节,讲解了内核配置的常用选项,这些知识对构建适合自己的嵌入式设备的操作系统内核有非常大的帮助。第,4.5,节,在前述基础上,讲解了嵌入式文件系统的基础知识,特别是

43、,YAFFS,文件系统,这是一种很常用的基于,NAND Flash,的文件系统。最后详细讲解了使用,Busybox,构建一个根文件系统的全过程。,第,5,章 构建第一个驱动程序,万事开头难,写驱动程序也一样,本章将构建第一个驱动程序。驱动程序和模块的关系非常密切,所以这里将详细讲解模块的相关知识。而模块编程成败与否的先决条件是要有统一的内核版本,所以这里将讲解怎样升级内核版本。最后为了提高程序员的编程效率,这里将介绍两种集成开发环境。,5.1,开发环境配置之内核升级,构建正确的开发环境,对写驱动程序非常重要。错误的开发环境,编写出的驱动程序不能正确运行。特别是关于内核版本的问题,内核版本不匹配

44、,会使驱动程序根本不能在系统中运行,所以需要对内核进行升级。本节我们将对,Fedora Core 9,进行内核升级,首先将说明为什么要升级内核。,5.1.1,为什么升级内核,内核是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。根据内核是否被修改过,可以将内核分为标准内核和厂商内核两类。,5.1.2,内核升级,尽管在,Fedora Core 9,中可以使用“软件包管理器工具”对内核进行升级,但是毕竟是开发厂商编译的内核有其局限性。里面添加了很多驱动开发系统不需要的模块,而驱动开发需要的模块却没有开启。因此,学会自己手动编译升级内核也是很必要的。这里,我们将内核升级为,linux

45、 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

46、,World”,。这个驱动模块虽然非常简单,但是也包含了驱动模块的重要组成部分。在本节的开始,将先对模块的重要组成部分进行介绍。,5.2.1,驱动模块的组成,一个驱动模块主要有如下部分组成,如图,5.2,所示。图,5.2,表示的是一个规范的驱动模块应该包含的结构。这些结构在图中的顺序也是在源文件中的顺序。不按照这样的顺序来编写驱动模块也不会出错,只是大多数开发人员都喜欢这样的顺序规范。下面对主要的结构部分进行说明。,5.2.2 Hello World,模块,任何一本关于编程的书,几乎都以“,Hello World”,开始。现在,来看一下最简单的一个驱动模块。,5.2.3,编译,Hello Wo

47、rld,模块,在对,Hello World,模块进行编译时,需要满足一定的条件:,1,编译内核模块的条件,2,Makefile,文件,3,Makefile,文件的执行过程,4,编译模块,5.2.4,模块的操作,Linux,为用户提供了,modutils,工具,用来操作模块。这个工具集主要包括,:,insmod,命令加载模块。,rmmod,命令卸载模块。,modprobe,命令是比较高级的加载和删除模块命令,其可以解决模块之间的依赖性问题。,lsmod,命令列出已经加载的模块和其信息。,modinfo,命令用于查询模块的相关信息,比如作者,版权等。,5.2.5 Hello World,模块加载后

48、文件系统的变化,当使用,insmod hello.ko,加载模块后文件系统会发生什么样的变化呢?文件系统存储着有关模块的属性信息。程序员可以从这些属性信息中了解目前模块在系统中的状态,这些状态对开发调试非常重要。,5.3,模块参数和模块之间通讯,为了增加模块的灵活性,可以给模块添加参数。模块参数可以控制模块的内部逻辑,从而使模块可以在不同的情况下,完成不同的功能,下面首先对模块参数进行介绍。,5.3.1,模块参数,用户空间的应用程序可以接受用户的参数,设备驱动程序有时候也需要接受参数。例如一个模块可以实现两种相似的功能,这时可以传递一个参数到驱动模块,以决定其使用哪一种功能。参数需要在加载模块

49、时指定,例如,inmod xxx.ko param=1,。,5.3.2,模块的文件格式,ELF,了解模块以何种格式存储在硬盘中,对于理解模块间怎样通讯时非常有必要的。,5.3.3,模块之间的通讯,模块是为了完成某种特定任务而设计的。其功能比较的单一,为了丰富系统的功能,所以模块之间常常进行通信。其之间可以共享变量,数据结构,也可以调用对方提供的功能函数。,5.3.4,模块之间的通讯实例,本实例通过两个模块来介绍模块之间的通信。模块,add_sub,提供了两个导出函数,add_integer(),和,sub_integer(),,分别完成两个数字的加法和减法。模块,test,用来调用模块,add

50、_sub,提供的两个方法,完成加法或者减法操作。,1,add_sub,模块,2,test,模块,3,编译模块,4,测试模块,5.4,将模块加入内核,当编译了模块,如果希望模块随系统一起启动,那么需要将模块静态编译进内核。将模块静态编译入内核,需要完成一些必要的步骤。,5.4.1,向内核添加模块,向,Linux,内核中添加驱动模块,需要完成,4,个工作:,(,1,)编写驱动程序文件。,(,2,)将驱动程序文件放到,Linux,内核源码的相应目录中,如果没有合适的目录,可以自己建立一个目录来存放驱动程序文件。,(,3,)在目录的,Kconfig,文件中添加新驱动程序对应的项目编译选择。,(,4,)

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服