




已阅读5页,还剩66页未读, 继续免费阅读
(计算机应用技术专业论文)嵌入式linux平台上usb主控驱动的研究.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ii 内 容 摘 要 嵌入式系统是以应用为中心,以计算机为基础,软硬件可裁剪,适用于系统对功 能、可靠性、成本、功耗严格要求的专用计算机系统。实时性是嵌入式系统的基本要 求,其次,还要求代码小,速度快,可靠性高。 嵌入式 linux(embedded linux)是指对 linux 经过裁剪小型化后,可固化在存 储器或单片机中,应用于特定嵌入式场合的专用 linux 操作系统。 驱动程序开发是嵌入式 linux 项目中工作量最大的一部分内容,开发出高质量的 驱动程序是项目成功的关键。本课题研究内容正是嵌入式 linux 平台上的 usb 设备 主控驱动开发。 论文以完成一个嵌入式开发平台为目标, 该平台使用三星公司的 s3c2410 为主芯 片,操作系统选用 linux2.6.23 版本,涉及的工作主要是 linux 内核移植和 usb 驱动 开发。论文的主要内容为: 1) 在深入研究了 linux 底层代码的基础上,给出了搭建开发环境和编写启动代 码的方法,深入阐述了内核的初始化过程。 2) 对 linux 内核的设备驱动模型和驱动架构进行了深入分析,研究了 usb 协议 和 usb 主机端驱动在 linux 上的实现过程,并把 usb 协议栈移植到了论文所述的平 台上。 这部分内容包括 usb 的基本通讯协议、 usb 主控制器接口、 ohci 规范和 usb 协议栈的构建方法。 3) 论文介绍了 usb 键盘项目的研发过程和技术细节。 通过完成这个嵌入式 linux 开发平台的项目, 作者阅读并改写了大量的内核源代 码,对内核的底层实现机制和 usb 驱动编写做了深入的探索与研究。本论文对在其 它平台进行内核移植或驱动开发也可以起到借鉴作用。 关键词:嵌入式系统 关键词:嵌入式系统 linux 内核 模块 内核 模块 usb 注意:注意: “内“内 容容 摘摘 要”与正文之间空一行;要”与正文之间空一行; 关键词与正文之间不要空行、两个关键词之间空二格。关键词与正文之间不要空行、两个关键词之间空二格。 iii abstract the embbeded system has been widely used in numerous filds,such as industry control system,information hold appliances,the communication equipments,medical instruments and intelligence instruments and so on. it typically designed for a specific application which requires limited resources and powers with high reliability an embedded linux system simply designates an embedded system based on the linux kernel and does not imply the use of any specific library or user tools with this kernel.due to concerns such as cost and size embedded linux system are likely use flash memeory instead of a hard drive and modified to be a real time operating system. device drivers take on a special role in the linux kernel.mapping those calls which are sets of standardized calls that are independent of the specific driverto device-specific operations that act on real hardware is then the role of the device driver. this programming interface is such that drivers can be built separately from the rest of the kernel and plugged in at runtime when needed. this modularity makes linux drivers easy to write. a usb device is a very complex thing, as described in the official usb documentation (available at ). fortunately, the linux kernel provides a subsystem called the usb core to handle most of the complexity. and this project mainly do some research on how to build embbeded linux system,with a usb controller,which allowed a usb keyboard wroking on it.the technology including: usb specification,bus,ohci,usb host interface,data strcutures,linux kernel and module. key words: embedded linux device drivers modularity usb i 三峡大学学位论文原创性声明 本人郑重声明:所呈交的学位论文,是本人在导师的指导下,独立进行研究工作 所取得的成果,除文中已经注明引用的内容外,本论文不含任何其他个人或集体已经 发表或撰写过的作品成果。 对本文的研究做出重要贡献的个人和集体均已在文中以明 确方式标明,本人完全意识到本声明的法律后果由本人承担。 学位论文作者签名: 日 期: 1 引 言 引 言 嵌入式系统是以应用为中心,以计算机为基础,软硬件可裁剪,适用于系统对功 能、可靠性、成本、功耗严格要求的专用计算机系统。实时性是嵌入式系统的基本要 求,其次,还要求代码小,速度快,可靠性高。 嵌入式 linux(embedded linux)是指对 linux 经过裁剪小型化后,可固化在存 储器或单片机中,应用于特定嵌入式场合的专用 linux 操作系统。 随着 usb 技术越来越多地被应用到嵌入式领域,人们对身边所使用的嵌入式系 统提出了新的要求,希望在嵌入式系统中增加 usb 主机功能,使嵌入式系统具有移 动存储功能, 如挂接各种移动存储设备、直接与 usb 打印机连接打印数码相片等。 驱动程序开发是嵌入式 linux 项目中工作量最大的一部分内容, 开发出高质量的 驱动程序是项目成功的关键。 由于嵌入式系统的高速发展和广泛应用,为技术创新带来了广阔的空间。linux 内核由于本身具有的特点使得其特别适合嵌入式环境,在工业界被广泛应用,因此在 该平台上做一些研究工作也是本课题的一个出发点。 研究由源代码针对应用的环境做 修改和新的设计并进行编译移植的等一整套过程,显得特别具有实用价值。同时由于 嵌入式环境的特点,要求系统不能集成太多的外设接口,而另一方面嵌入式环境的动 态性要求系统要与多种设备进行通信,并且这些设备都是动态配置的。这样就显出了 应用与成本的矛盾。要解决这个矛盾就需要寻找到一种统一动态设备管理接口,既能 动态地与多种设备打交道,又能使得系统的外设接口多样性减少到最低。 综合各方面的因素,考虑在基于 linux 内核的系统上,利用 usb 接口的特性,来 解决这个问题。本课题将 linux 内核移植到特定的平台上,并针对应用环境研究 usb 驱动的开发一般过程。 2 1 绪论 1.1 嵌入式系统概述 嵌入式系统(embedded system)是指以应用为中心,以计算机技术为基础,软件硬件 可剪裁,适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系 统。它主要由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户应用软件等 部分组成。它具有“嵌入性”“专用性”与“计算机系统”的三个基本要素。 嵌入式系统的特点: 1)面向特定应用的特点。 嵌入式系统与通用型系统的最大区别就在于嵌入式系统 大多工作在为特定用户群设计的系统中, 因此它通常都具有低功耗、体积小、集成度 高等特点,并且可以满足不用应用的特定需求。 2)嵌入式系统的硬件和软件都必须进行高效地设计,量体裁衣、去除冗余,力争 在同样的硅片面积上实现更高的性能, 这样才能在具体应用中对处理器的选择更具有 竞争力。 3)嵌入式系统是将先进的计算机技术、半导体技术和电子技术与各个行业的具 体应用相结合后的产物。这一点就决定了它必然是一个技术密集、资金密集、高度分 散、不断创新的知识集成系统,从事嵌入式系统开发的人才也必须是复合型人才。 4)为了提高执行速度和系统可靠性,嵌入式系统中的软件一般都固化在存储器 芯片或单片机本身中,而不是存储于磁盘中。 5)嵌入式开发的软件代码尤其要求高质量、 高可靠性,由于嵌入式设备所处的环 境往往是无人职守或条件恶劣的情况下,因此,其代码必须有更高的要求。 6)嵌入式系统本身不具备二次开发能力,即设计完成后用户通常不能对其中的 程序功能进行修改,必须有一套开发工具和环境才能进行再次开发。 嵌入式系统作为一类特殊的计算机系统,一般包括以下 3 个方面:硬件设备、 嵌入 式操作系统和应用软件。硬件设备包括嵌入式处理器和外围设备。其中的嵌入式处理 器(cpu)是嵌入式系统的核心部分,它与通用处理器最大的区别在于,嵌入式处理器大 多工作在为特定用户群所专门设计的系统中,它将通用处理器中许多由板卡完成的任 务集成到芯片内部,从而有利于嵌入式系统在设计时趋于小型化,同时还具有很高的 效率和可靠性。如今,全世界嵌入式处理器已经超过 1000 多种,流行的体系结构有 30 多个系列,其中以 arm、powerpc、mc 68000、mips 等使用得最为广泛。 外围设备是嵌入式系统中用于完成存储、通信、调试、显示等辅助功能的其他部 件。目 前常用的嵌入式外围设备按功能可以分为存储设备(如 ram、sram、flash 等) 、通信设备(如 rs-232 接口、spi 接口、以太网接口等)和显示设备(如显示屏 等)3 类。 3 1.2 嵌入式操作系统 七十年代晚期出现了用作嵌入式系统的现成的操作系统, 现在有许多可行的选择 方案。例如 vxworks、psos、neculeus 和 windows ce。 1.2.1 嵌入式 linux 嵌入式 linux(embedded linux)是指对标准 linux 经过小型化裁剪处理之后, 能够 固化在容量只有几 kb 或者几 mb 字节的存储器芯片或者单片机中, 是适合于特定嵌 入式应用场合的专用 linux 操作系统。在目前已经开发成功的嵌入式系统中,大约有 一半使用的是 linux。这与它自身的优良特性是分不开的。 嵌入式 linux 同 linux 一样,具有低成本、多种硬件平台支持、优异的性能和良 好的网络支持等优点。另外,为了更好地适应嵌入式领域的开发,嵌入式 linux 还在 linux 基础上做了部分改进,如下所示。 1) 改善的内核结构 linux 内核采用的是整体式结构(monolithic),整个内核是一个单独的、非常大的 程序,这样虽然能够使系统的各个部分直接沟通,提高系统响应速度,但与嵌入式系 统存储容量小、资源有限的特点不相符合。因此,在嵌入式系统经常采用的是另一种 称为微内核(microkernel)的体系结构, 即内核本身只提供一些最基本的操作系统功能, 如任务调度、内存管理、中断处理等,而类似于文件系统和网络协议等附加功能则运 行在用户空间中,并且可以根据实际需要进行取舍。这样就大大减小了内核的体积, 便于维护和移植。 2) 提高的系统实时性 由于现有的 linux 是一个通用的操作系统, 虽然它也采用了许多技术来加快系统 的运行和响应速度,但从本质上来说并不是一个嵌入式实时操作系统。因此,利用 linux 作为底层操作系统,在其上进行实时化改造,从而构建出一个具有实时处理能 力的嵌入式系统,如 rt-linux 已经成功地应用于航天飞机的空间数据采集、科学仪 器测控和电影特技图像处理等各种领域。 1.2.2vxworks vxworks操作系统是美国windriver公司于1983年设计开发的一种嵌入式实时操 作系统(rtos),它是在当前市场占有率最高的嵌入式操作系统。vxworks 的实时性 做得非常好,其系统本身的开销很小,进程调度、进程间通信、中断处理等系统公用 程序精练而有效,使得它们造成的延迟很短。另外 vxworks 提供的多任务机制,对 任务的控制采用了优先级抢占(linux 2.6 内核也采用了优先级抢占的机制)和轮转调 度机制,这充分保证了可靠的实时性,并使同样的硬件配置能满足更强的实时性要求。 另外 vxworks 具有高度的可靠性,从而保证了用户工作环境的稳定。同时,vxworks 4 还有很完备强大的集成开发环境,这也大大方便了用户的使用。 但是,由于 vxworks 的开发和使用都需要交高额的专利费,因此大大增加了用 户的开发成本。同时,由于 vxworks 的源码不公开,造成它部分功能的更新(如网络 功能模块)滞后。 1.2.3qnx qnx 是业界公认的 x86 平台上最好的嵌入式实时操作系统之一,它具有独一无 二的微内核实时平台,是建立在微内核和完全地址空间保护基础之上的,它同样具有 实时性强、稳定可靠的优点。 1.2.4windows ce windows ce 是微软开发的一个开放的、可升级的 32 位嵌入式操作系统,是基 于掌上型电脑类的电子设备操作系统。它是精简的 windows 95。windows ce 的图形 用户界面相当出色。windows ce 具有模块化、结构化和基干 win32 应用程序接口以 及与处理器无关等特点。它不仅继承了传统的 windows 图形界面,并且用户在 windows ce 平台上可以使用 windows 95/98 上的编程工具(如 visual basic、visual+ 等)、也可以使用同样的函数、使用同样的界面风格,使绝大多数 windows 上的应用 软件只需简单的修改和移植就可以在 windowsce 平台上继续使用。 但与 vxworks 相 同,windowsce 也是比较昂贵的。 1.2.5palm os paml os 在 pda 和掌上电脑有着很大的用户群。plam os 最明显的特点在精简, 它的内核只有几千个字节,同时用户也可以方便地开发定制,具有较强的可操作性。 1.3 arm 嵌入式处理器及设计平台 arm(advanced risc machines) ,是对一类微处理器的通称,是基于复杂指令 集(risc)处理器。基于 arm 技术的微处理器应用约占据了 32 位 risc 微处理器 75以上的市场份额,arm 技术正在逐步渗入到我们生活的各个方面。 采用 risc 架构的 arm 处理器一般具有如下特点: 固定长度的指令格式,指令归整、简单、基本寻址方式有 23 种; 使用单周期指令,便于流水线操作执行; 大量使用寄存器,数据处理指令只对寄存器进行操作,只有加载/存储指令可以 访问存储器,以提高指令的执行效率。 arm 处理器共有 37 个寄存器,被分为若干个组,这些寄存器包括: 31 个通用寄存器,包括程序计数器(pc 指针) ,均为 32 位的寄存器; 6 个状态寄存器,用以标识 cpu 的工作状态及程序的运行状态,均为 32 位。 arm 微处理器支持两种指令集:arm 指令集和 thumb 指令集。 5 arm 指令为 32 位的长度,thumb 指令为 16 位长度。thumb 指令集为 arm 指 令集的功能子集, 但与等价的 arm 代码相比较, 可节省 3040以上的存储空间, 同时具备 32 位代码的所有优点。 除此以外,arm 体系结构还采用了一些特别的技术,在保证高性能的前提下尽 量缩小芯片的面积,并降低功耗: 所有的指令都可根据前面的执行结果决定是否被执行,从而提高指令的执行效 率。 可用加载/存储指令批量传输数据,以提高数据的传输效率。 可在一条数据处理指令中同时完成逻辑处理和移位处理。 在循环处理中使用地址的自动增减来提高运行效率。 本课题以武汉创维特公司生产的 jxarm9-2410 教学系统为原型,使用的硬件平 台 s3c2410 内部集成了一个 usb 主机控制器,完全兼容 ochi 1.0、usb 1.1 标准, 支持低速和全速 usb 设备。 图图 1.1 jxarm9-2410 结构图结构图 s3c2410x 片上资源: arm920t 核、工作频率 203mhz; 16kb 数据 cache, 16kb 指令 cache,mmu,外部存储器控制器; lcd 控制器(支持黑白、灰度、color stn、tft 屏) ,触摸屏接口; nand flash 控制器,sd/mmc 接口支持,4 个 dma 通道; s3c44b0x flash(bios) s3c44b0x flash(bios) usb 接口usb 接口 rs-232接口rs-232接口 jtag 调试端口jtag 调试端口 lcd显示 及触摸屏 lcd显示 及触摸屏 键盘接口键盘接口 以太网接口以太网接口 音频接口音频接口 基于arm920t的 32位微处理器 samsung s3c2410x 最小系统 基于arm920t的 32位微处理器 samsung s3c2410x 最小系统 usb 接口usb 接口 rs-232接口rs-232接口 jtag 调试端口jtag 调试端口 lcd显示 及触摸屏 lcd显示 及触摸屏 以太网接口以太网接口 音频接口 64mb sdram 系统内存音频接口 64mb sdram 系统内存 32m字节32m字节 16m字节 nand flash 16m字节 nand flash 6 3 通道 uart、1 个多主 i2c 总线控制器、1 个 iis 总线控制器; 4 通道 pwm 定时器及一个内部定时器; 117 个通用 i/o 口; 24 个外部中断源; 两个 usb 主/一个 usb 从; 8 通道 10 位 adc; 实时时钟及看门狗定时器等。 从基地址 0 x49000000 开始分别提供了 ohci 的 hcrevision、hccontrol、 hccommonstatus、 hcinterruptstatus、 hcinterruptenable、 hcinterruptdisable、 hchcca、 hcperiodcuttented、 hccontrolheaded、 hccontrolcurrented、 hcbulkheaded、 hcbulk currented 、 hcdonehead 、 hcrminterval 、 hcfmremaining 、 hcfmnumber 、 hcperiodicstart、hclsthreshold、hcrhdescriptora、hcrhdescriptorb、hcrhstatus、 hcrhportstatus1、hcrhportstatus2 寄存器。 1.4 嵌入式软件开发流程 由嵌入式系统本身的特性所影响,嵌入式系统开发与通用系统的开发有很大的区 别。嵌入式系统的开发主要分为系统总体开发、嵌入式硬件开发和嵌入式软件开发 3 大部分。 在系统总体开发中,由于嵌入式系统与硬件依赖程序非常紧密,往往某些需求只 能通过特定的硬件才能实现,因此需要进行处理器选型,以更好地满足产品的需求。 另外,对于有些硬件和软件都可以实现的功能,就需要在成本和性能上做出抉择。往 往通过硬件实现会增加产品的成品,但能大大提高产品的性能和可靠性。 再次,开发环境的选择对于嵌入式系统的开发也有很大的影响。这里的开发环境包 括嵌入式操作系统的选择以及开发工具的选择等。比如,对开发成本和进度限制较大 的产品可以选择嵌入式 linux,对实时性要求非常高的产品可以选择 vxworks 等。 嵌入式软件开发总体流程它同通用计算机软件开发一样,分为需求分析、软件概 要设计、软件详细设计、软件实现和软件测试。其中嵌入式软件需求分析与硬件的需 求分析合二为一。 1.4.1 交叉编译 嵌入式软件开发所采用的编译为交叉编译。 所谓交叉编译就是在一个平台上生成 可以在另一个平台上执行的代码。 编译的最主要的工作就在将程序转化成运行该程序 的 cpu 所能识别的机器代码,由于不同的体系结构有不同的指令系统。因此,不同 的 cpu 需要有相应的编译器,而交叉编译就如同翻译一样,把相同的程序代码翻译称 不同的 cpu 对应语言。要注意的是,编译器本身也是程序,也要在与之对应的某一 个 cpu 平台上运行。嵌入式系统交叉编译环境如图 1.2 所示。 7 图图 1.2 嵌入式系统交叉编译环境 嵌入式系统交叉编译环境 这里一般把进行交叉编译的主机称为宿主机,也就是普通的通用计算机,而把程 序实际的运行环境称为目标机,也就是嵌入式系统环境。由于一般通用计算机拥有非 常丰富的系统资源、使用方便的集成开发环境和调试工具等,而嵌入式系统的系统资 源非常紧缺,没有相关的编译工具,因此,嵌入式系统的开发需要借助宿主机(通用 计算机)来编译出目标机的可执行代码。 1.4.2 交叉调试 嵌入式软件经过编译和链接后即进入调试阶段, 调试是软件开发过程中必不可少 的一个环节, 嵌入式软件开发过程中的交叉调试与通用软件开发过程中的调试方式有 很大的差别。 在常见软件开发中,调试器与被调试的程序往往运行在同一台计算机上,调试器 是一个单独运行着的进程,它通过操作系统提供的调试接口来控制被调试的进程。而 在嵌入式软件开发中,调试时采用的是在宿主机和目标机之间进行的交叉调试,调试 器仍然运行在宿主机的通用操作系统之上, 但被调试的进程却是运行在基于特定硬件 平台的嵌入式操作系统中,调试器和被调试进程通过串口或者网络进行通信,调试器 可以控制、访问被调试进程,读取被调试进程的当前状态,并能够改变被调试进程的 运行状态。 嵌入式系统的交叉调试有多种方法,主要可分为软件方式和硬件方式两种。它们 一般都具有如下一些典型特点。 1) 调试器和被调试进程运行在不同的机器上,调试器运行在 pc 机或者工作站上 (宿主机),而被调试的进程则运行在各种专业调试板上(目标机)。 2) 调试器通过某种通信方式(串口、并口、网络、jtag 等)控制被调试进程。 3) 在目标机上一般会具备某种形式的调试代理, 它负责与调试器共同配合完成对 目标机上运行着的进程的调试。这种调试代理可能是某些支持调试功能的硬件设备, 也可能是某些专门的调试软件(如 gdbserver)。 4) 目标机可能是某种形式的系统仿真器,通过在宿主机上运行目标机的仿真软件, 整个调试过程可以在一台计算机上运行。此时物理上虽然只有一台计算机,但逻辑上 仍然存在着宿主机和目标机的区别。 1.5 usb 设备 8 通用串行总线(universal serial bus,usb)是连接外部设备的一个串口总线 标准,在计算机上使用广泛,但也可以用在机顶盒和游戏机上,补充标准 on-the-go (otg)使其能够用于在便携设备之间直接交换数据。 usb 最初是由英特尔与微软公司倡导发起, 其最大的特点是支持热插拔和即插即 用。当设备插入时,主机枚举此设备并加载所需的驱动程序,因此使用远比 pci 和 isa 总线方便。 usb 速度比并行端口(例如 epp、lpt)与串行接口(例如 rs-232)等传统电脑 用标准总线快上许多。原标准中 usb 1.1 的最大传输带宽为 12mbps,usb 2.0 的最大 传输带宽为 480mbps。近期推出的 usb 3.0 更从 480mbps 提升到 4.8gbps 以上。 usb 可以连接的外设有鼠标、键盘、游戏手柄、游戏杆、扫描仪、数码相机、打 印机、硬盘和网络部件。对数码相机这样的多媒体外设 usb 已经是缺省接口;由于大 大简化了与计算机的连接, usb 也逐步取代并口成为打印机的主流连接方式。 2004 年 已经有超过 1 亿台 usb 设备;到 2007 年高清晰度数字视频外设是仅有的 usb 未能实 现的外设类别。 1.6 小结 在本课题开始前,现有的实验器材均已具备,开发板接口齐全,资料丰富。同时 基于 linux 的操作系统也日益成熟,因此达到设计目标的可能性非常高。 在书写开题报告的时候,查阅了很多资料,了解到在嵌入式平台上利用 linux 系统作开发已经比较普遍,有很多成功的范例。在设计的时候有很多内容可以借鉴。 利用 linux 平台可以加快开发速度。 由于 linux 的开源特性,特别有利于技术创新并打破技术垄断,并在教学和科研 上特别有意义,因此在构思设计课题时考虑了这个因素。选用这个平台。 9 2 基于 linux 系统的嵌入式开发软件环境 前文已经讲到过,linux 有很多特性,可被裁剪来适应多样性的计算环境,特别 是对电源和成本要求苛刻的环境。本章将描述这些特性,对 linux 内核编程及编译、 移植的一般过程做研究。 2.1 2.1 linux 特性 linux 是指一套免费使用和自由传播的类 unix 操作系统。 人们通常所说的 linux 是指 linus torvalds 所写的 linux 操作系统内核。 linux 内核是一个庞大而复杂的操作 系统的核心,但是却采用子系统和分层的概念很好地进行了组织。 gnu 是为了推广自由软件的精神以实现一个自由的操作系统,然后从应用程序 开始,逐步实现其内核。而当时 linux 的优良性能备受 gnu 的认可,gnu 就决定采 用 linux 内核。在共同努力下,linux 这个完整的操作系统诞生了。其中的程序开发 共同遵守 general public license(gpl)协议,这是最开放也是最严格的许可协议方式, 这个协议规定了源码必须可以无偿的获取并且修改。因此,从严格意义上说,linux 应该叫做 gnu/linux,其中许多重要的工具如 gcc、gdb、make、emacs 等都是 gnu 贡献。 linux 已经有超过 250 种发行版本,且可以支持所有体系结构的处理器,如 x86、 powerpc、arm、xscale 等,也可以支持带 mmu 或不带 mmu 的处理器。到目前为止, 它的内核版本也已经从原先的 0.0.1 发展到现在的 2.6.xx。 2.1.1linux 作为嵌入式操作系统的优势 从 linux 系统的发展过程可以看出,linux 从最开始就是一个开放的系统,并且 它始终遵循着源代码开放的原则,它是一个成熟而稳定的网络操作系统,作为嵌入式 操作系统有如下优势。 1) 低成本开发系统 linux 的源码开放性允许任何人可以获取并修改 linux 的源码。这样一方面大大 降低了开发的成本,另一方面又可以提高开发产品的效率。并且还可以在 linux 社 区中获得支持,用户只需向邮件列表发一封邮件,即可获得作者的支持。 2) 可应用于多种硬件平台 linux 可支持 x86、powerpc、arm、xscale、mips、sh、68k、alpha、sparc 等 多种体系结构,并且已经被移植到多种硬件平台。这对于经费、时间受限制的研究与 开发项目是很有吸引力的。linux 采用一个统一的框架对硬件进行管理,同时从一个 硬件平台到另一个硬件平台的改动与上层应用无关。 3) 可定制的内核 linux 具有独特的内核模块机制,它可以根据用户的需要,实时地将某些模块插 10 入到内核中或者从内核中移走,并能根据嵌入式设备的特点进行裁剪。经裁剪的 linux 内核最小可达到 150kb 以下,尤其适合嵌入式领域中资源受限的实际情况。当 前的 2.6 内核加入了许多嵌入式友好特性, 如构建用于不需要用户界面的设备的小占 板面积内核选项。 4) 性能优异 linux 系统内核精简、高效和稳定,能够充分发挥硬件的功能,因此它比其他操作 系统的运行效率更高。在个人计算机上使用 linux,可以将它作为工作站。它也非常 适合在嵌入式领域中应用,对比其他操作系统,它占用的资源更少,运行更稳定,速度 更快。 5) 良好的网络支持 linux 是首先实现 tcp/ip 协议栈的操作系统,它的内核结构在网络方面是非常完 整的,并提供了对包括十兆位、百兆位及千兆位的以太网,还有无线网络、token ring(令牌环)和光纤甚至卫星的支持, 这对现在依赖于网络的嵌入式设备来说无疑是 很好的选择。 2.1.2linux 内核简介 现在从一个比较高的高度来审视一下 gnu/linux 操作系统的体系结构。可以从 图 2.1 基于图 2.1 基于 gnu/linux 操作系统的基本体系结构 操作系统的基本体系结构 两个层次上来考虑操作系统。 最上面是用户(或应用程序)空间。这是用户应用程序执行的地方。用户空间之 下是内核空间,linux 内核正是位于这一层。 gnu c library(glibc)也在这一层。它提供了连接内核的系统调用接口,还提 供了在用户空间应用程序和内核之间进行转换的机制。这点非常重要,因为内核和用 户空间的应用程序使用的是不同的保护地址空间。 每个用户空间的进程都使用自己的 11 虚拟地址空间,而内核则占用单独的地址空间。 linux 内核可以进一步划分成 3 层。最上面是系统调用接口,它实现了一些基本 的功能,例如 read 和 write 操作。系统调用接口之下是内核代码,可以更精确地定义 为独立于体系结构的内核代码。 这些代码是 linux 所支持的所有处理器体系结构所通 用的。 在这些代码之下是依赖于体系结构的代码, 构成了通常称为 bsp (board support package)的部分。这些代码用作给定体系结构的处理器和特定于平台的代码。 linux 内核的属性 linux 内核实现了很多重要的体系结构属性。在或高或低的层次上,内核被划分 为多个子系统。linux 也可以看作是一个整体,因为它会将所有这些基本服务都集成 到内核中。 这与微内核的体系结构不同, 后者会提供一些基本的服务, 例如通信、 i/o、 内存和进程管理, 更具体的服务都是插入到微内核层中的。 每种内核都有自己的优点, 这里不对此进行讨论。 linux 内核在内存和 cpu 使用方面具有较高的效率,并且非常稳定。但是对于 linux 来说, 最为有用的是在这种大小和复杂性的前提下, 依然具有良好的可移植性。 linux 编译后可在大量处理器和具有不同体系结构约束和需求的平台上运行。 进程管理 进程管理的重点是进程的执行。在内核中,这些进程称为线程,代表了单独的处 理器虚拟化 (线程代码、 数据、 堆栈和 cpu 寄存器) 。 在用户空间, 通常使用进程 这 个术语,不过 linux 实现并没有区分这两个概念(进程和线程)。内核通过 sci 提供 了一个应用程序编程接口(api)来创建一个新进程(fork、exec 或 portable operating system interface posix函数),停止进程(kill、exit),并在它们之间进行通信和 同步(signal 或者 posix 机制)。 进程管理还包括处理活动进程之间共享 cpu 的需求。内核实现了一种新型的调 度算法,不管有多少个线程在竞争 cpu,这种算法都可以在固定时间内进行操作。 这种算法就称为 o(1)调度程序。 o(1)调度程序也可以支持多处理器 (称为对称多处理 器或 smp)。 内存管理 内核所管理的另外一个重要资源是内存。为了提高效率,如果由硬件管理虚拟内 存,内存是按照内存页方式进行管理的(对于大部分体系结构来说都是 4kb) 。linux 包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。 linux 提供了对 4kb 缓冲区的抽象,例如 slab 分配器。这种内存管理模式使用 4kb 缓冲区为基数,然后从中分配结构,并跟踪内存页使用情况,比如哪些内存页 是满的,哪些页面没有完全使用,哪些页面为空。这样就允许该模式根据系统需要来 12 动态调整内存使用。 虚拟文件系统 虚拟文件系统(vfs)是 linux 内核中非常有用的一个方面,因为它为文件系统提供 了一个通用的接口抽象。vfs 在 sci 和内核所支持的文件系统之间提供了一个交换 图图 2.2 vfs 在用户和文件系统之间提供了一个交换层在用户和文件系统之间提供了一个交换层 层。 在 vfs 上面,是对诸如 open、close、read 和 write 之类的函数的一个通用 api 抽象。在 vfs 下面是文件系统抽象,它定义了上层函数的实现方式。它们是给定文 件系统(超过 50 个)的插件。文件系统的源代码可以在./linux/fs 中找到。 文件系统层之下是缓冲区缓存,它为文件系统层提供了一个通用函数集(与具体 文件系统无关)。这个缓存层通过将数据保留一段时间(或者随即预先读取数据以便 在需要是就可用)优化了对物理设备的访问。缓冲区缓存之下是设备驱动程序,它实 现了特定物理设备的接口。 网络堆栈 网络堆栈在设计上遵循模拟协议本身的分层体系结构。internet protocol (ip)是传 输协议(通常称为传输控制协议或 tcp)下面的核心网络层协议。tcp 上面是 socket 层,它是通过 sci 进行调用的。 socket 层是网络子系统的标准 api,它为各种网络协议提供了一个用户接口。 设备驱动程序 linux 内核中有大量代码都在设备驱动程序中,它们能够运转特定的硬件设备。 linux 源码树提供了一个驱动程序子目录,这个目录又进一步划分为各种支持设备, 13 例如 bluetooth、i2c、serial 等。 依赖体系结构的代码 尽管 linux 很大程度上独立于所运行的体系结构, 但是有些元素则必须考虑体系 结构才能正常操作并实现更高效率。 ./linux/arch 子目录定义了内核源代码中依赖于体 系结构的部分,其中包含了各种特定于体系结构的子目录(共同组成了 bsp)。对于 一个典型的桌面系统来说,使用的是 i386 目录。每个体系结构子目录都包含了很多 其他子目录,每个子目录都关注内核中的一个特定方面,例如引导、内核、内存管理 等。这些依赖体系结构的代码可以在./linux/arch 中找到。 linux 2.6 于 2003 年 11 月发布出来, 很快有许多新的特性和新的驱动被添加到其 中。因此在 2.4 版本中获得对新硬件的支持变地越来越困难。本课题所使用硬件驱动 代码至少与 2.6.26 兼容。 所支持的硬件列表在源代码树中的 arch/文件夹中。 32 位架构: arm, avr32, cris, frv, h8300, i386, m32r, m68k, m68knommu, mips, parisc (can have a 64 bit kernel but always a 32 bit userspace), powerpc, ppc, s390, sh, sparc, um, v850, xtensa 64 bit 架构: alpha, ia64, mips, powerpc, sh64, sparc64, x86_64 内核代码 linux 内核主要用 c 实现,但还使用了一些汇编代码来解决 cpu 和机器的初始 化,异常处理及临界库例程处理。根据 sloccount 关于 linux2.6.22 的报告,linux 内 核中所使用的代码量的统计如下: ansic: 5215716 (95.78%) asm: 216350 (3.97%) perl: 4215 (0.08%) yacc: 2637 (0.05%) sh: 2233 (0.04%) cpp: 2129 (0.04%) lex: 1510 (0.03%) python: 331 (0.01%) lisp: 218 (0.00%) awk: 96 (0.00%) 在编译的时候需要使用 gnu c 扩展来编译内核,因此不能使用 ansi c 标准编 14 译器,但可以使用支持 gnu 编译器。 2.1.3linux 内核开发模式 linux 每 2 到 3 年发布一个稳定版本,使用偶数来命名,例如:1.0,2.0,2.2,2.4。 另外还不定期推出整合有新功能和较大变化的开发版本,在小数点后使用奇数来命 名,例如:2.1,2.3,2.5。 从 2.6.0 开始,内核开发者能够逐步在内核中添加新的特性,而不需要在现存的 子系统中做大的变动。只有当 2.6 不再能够容纳关键性改变的时候才会开辟新的开发 分支版本,如 2.7 或 2.9。这样更多的新特性会以更快的速度发布出来。从 2.6.14 开 始,内核开发者接受新的开发模式。当一个 2.6.x 版本发布后,留有一个 2 周的时间 窗口, 在期间整合比较重要的附加功能。 窗口关闭后会产生一个测试版本 2.6. (x1) rc1。紧接着调试期开始,会持续 6-10 周。期间会以固定的间隔发布测试版本 2.6. (x1)rcy。当测试结果能确定内核足够稳定,则发布 2.6.(x1) ,同时进入下 一开发周期。 linux 每个发布都会有关于变化的说明列表,这个列表非常巨大,因此很难全局 来描述所有的变化。 2.1.4 版权问题 linux 源代码以 gnu general public license version 2 (gpl v2)授权形式发布。发 布时的限制: 对于任何包含 linux 和自由版权的软件的设备,必须将代码发布给终端用户。对 于任何在 gpl 版权下软件的修改也必须给予 gpl 授权。专有的驱动必须静态地编译 到内核中。在专有驱动中不能利用 gpl 授权下的代码。 利用类似的自由软件代码,可以自由地获得社区的支持,包括代码检查和测试。 代码能被自由地传播。闭源驱动通常只能支持一个特定的版本。当自由的驱动代码被 接受到主流代码树中后,它们会被开发者们维护,如安全修改和改进都不会带来成本 上的开销。用户也能容易地访问代码。代码会被很多用户审视。 2.1.5 小结 linux 内核代码开源,更新周期快,并且子系统分层清晰,支持多种计算平台。 这些特点使得其易于修改来适应一些特殊的计算环境。 15 2.2 嵌入式 linux 开发环境的构建 交叉编译的概念在前文中已经详细讲述过,搭建交叉编译环境是嵌入式开发的第 一步,也是必备一步。搭建交叉编译环境的方法很多,不同的体系结构、不同的操作 内容甚至是不同版本的内核,都会用到不同的交叉编译器。 在开发主机上为了编译 linux 的内核及编辑和编写能运行在 arm 平台上的程序 需要在开发主机上建立交叉开发环境, 这些工作包括安装, 配置内核, 配置文件系统, 构造 bootloder,及使用 nfs 更新文件系统。这些都需要一下软件资源: arm-linux-toolchains.tgz(交叉编译工具) jflash.tgz(flash 烧写工具) root-for-nfs-v5.5.tgz (nfs 服务器) 这些工具是开源软件可以免费地得到源代码包,并能在本地安装编译。在开发主 机上(采用 ubuntu8.04 为操作系统)的文件目录做如下规划: 交叉编译器装在:/usr/local/ kernel,bootloder 放在:/home/arm/ 用于启动的 nfs 文件系统放在:/home/armnfs/ 准备工作: #sudo mkdir /home/armnfs #sudo chmod 777 /home/armnfs #mkdir /arm 前两条命令的目的是在/home 下建立 armnfs 目录,为了开发的方便,把这个目录 设成所有用户可 rwx。然后把上面提到的资源全部拷贝到/arm/下。 安装标准的 c 开发环境: #sudo apt-get install gcc g+ libgcc1 libg+ make gdb 安装交叉编译器 #cd / #sudo tar zxvf /home/volans/arm/arm-linux-toolchains.tgz 在执行完成后查看是否存在/usr/local/arm 文件夹,把交叉编译器的路径加入到 path,以方便使用: #sudo vi /etc/bash_bashrc 在文件中添加如下代码: if -d /usr/local/arm ; then path=/usr/local/arm/2.95.3/bin:$path fi 16 解压 bootloader,kernel 和 flash 烧写工具 jflash #cd /arm #tar zxvf matrix5-kernel-v5.5.tgz #tar zxvf vivi.tar.gz #tar zxvf jflash.tgz 解压用于启动的 nfs 文件系统 #cd /
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论