译文基于ARM的嵌入式Linux关键技术研究_第1页
译文基于ARM的嵌入式Linux关键技术研究_第2页
译文基于ARM的嵌入式Linux关键技术研究_第3页
译文基于ARM的嵌入式Linux关键技术研究_第4页
译文基于ARM的嵌入式Linux关键技术研究_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、附件C:译文基于ARM的嵌入式Linux关键技术研究摘要:目前,嵌入式Linux已经成为嵌入式系统领域研究的重点。在本文中,我们着重对Linux内核进行分析。在分析的基础上研究和探讨嵌入式Linux的关键技术,如基于ARM的Linux的移植方法,Linux实时性的提升,Linux设备驱动的开发技术等。通过关键技术的研究,我们建立自己的体系,为Linux应用开发的打下一个良好的基础。关键词:嵌入式Linux;关键技术;移植;实时性;设备驱动。I. 引言近年来,随着信息技术的发展,嵌入式系统已被广泛应用于社会生活的各个方面,如移动计算设备,网络设备,家电,仪器等。在各种嵌入式操作系统中,Linux

2、凭借其独特的优势,在嵌入式领域占据着巨大份额,并已成为世界上第二大操作系统。Linux拥有开源和丰富的软件资源,支持多线程,多用户,多进程,具有良好的可移植性,功能强大而稳定。它支持许多的微处理器架构,硬件设备,图形支持和通信协议等1。Linux作为可以修改的底层操作系统,能满足特定应用的不同要求。Linux在嵌入式领域有很大的潜力,深受许多企业和科研单位的青睐。在嵌入式领域,Linux的研究涉及诸多关键技术,如Linux内核的分析和修改,Linux在不同的微处理器上的移植。由于Linux本身的特点,它的实时性是不够的,但在很多嵌入式领域,实时性能的要求都非常高,这就需要对Linux的实时性进

3、行提升,所以实时技术是一种实用且意义重大研究课题。此外,还有嵌入式Linux设备驱动程序开发技术。Linux的这些技术的成熟直接影响有关领域的具体应用,因此,嵌入式Linux技术的研究具有很好的价值和实际意义。II. Linux的内核架构Linux内架结构主要包括五个子系统,进程调度模块,内存管理模块,文件系统模块,进程间通信模块,网络接口模块,如图1所示。图1. Linux内核模块和关系图图1描述了各子系统之间的关系2。由于每个子系统需要依靠进程调度来挂起或恢复进程,所以进程调度在模块的中心。 进程调度和内存管理之间的关系:进程调度和内存管理之间的相互依存,在多道程序设计环境,进程必须建立以

4、确保程序的运行,进程的创建需要首先将程序和数据装入内存。 进程间通信和内存管理之间的关系:进程间通信子系统依赖内存管理子系统以支持内存共享通信机制,它允许两个进程不仅有一个私有空间,还可以存取共同的内存区域。 虚拟文件系统和网络接口之间的关系:虚拟文件系统使网络接口支持网络文件系统(NFS),使内存管理支持RAMDISK设备。 虚拟文件系统和内存管理之间的关系:内存管理使虚拟文件系统支持交换,交换进程被调度器周期性调度。当进程访问的内存映像快要溢出时,内存管理将请求发送到文件系统,并挂起目前正在运行的进程。III. Linux内核的移植嵌入式Linux移植分以下步骤:获得源代码;建设交叉编译环

5、境;移植的Linux引导程序(UBOOT或VIVI),然后配置和编译内核,移植和加载嵌入式文件系统,开发和调试应用程序,下载程序;在本文中,主要介绍Linux内核的移植。A. 修改Makefile修改内核源代码根目录下的makefile文件,从而指定要为ARM架构编译的目标代码需,编译使用的是ARM-LINUX交叉编译器。在设计时,可以修改makefile文件,在其中添加以下两行代码。ARCH?=armCROSS COMPILE?= arm-linux-然后,设置PATH环境变量来寻找交叉编译器工具链,然后将其添加/.bashrc。#Vi /.bashrcexport PATH =/bin:$

6、PATHB. 设置闪存分区闪存分区的支持是成功移植Linux内核的关键。我们需要修改如下三个文件:1) 添加以下内容到文件arc/arm/machs3c2410/devs.c中。#include<linuxlmtdlpartitions.h>#include <linuxlmtdlnand.h>#include <asmlarchlnand.h>建立NAND闪存的分区表,该表分为四个区域,分别存储引导程序,内核,rootfs和用户文件系统;添加NAND闪存分区,并同时建立NAND闪存芯片的支持,最后,NAND闪存芯片添加完成并支持了NAND闪存驱动。另外,还

7、要修改arch/arm/machs3c2410/devs.C文件中的s3c_device_nand结构体变量,同时添加对dev成员的赋值。2) 指定启动时初始化内核启动时,可以依据对分区的设置进行初始配置,然后修改arch/am4mach-s3c2410/machsmdk2410.e文件下的smdk2410_devices,指明初始化时包括在前面所设置的flash分区信息,并添加如下语句:&s3c_device_nand。3) 禁止Flash ECC校验内核一般都是通过UBOOT写到Nand Flash的。UBOOT则通过软件ECC算法来产生ECC校验码,这与内核校验的ECC码不一样,

8、内核中的ECC码是由S3C2410中Nand Flash控制器产生的。所以这里选择禁止内核ECC校验。修改drivers/mtd/nand/s3c2410.c下的s3c2410_nand_init_chip()函数,可在该函数体最后加上如下一条语句:chip->eccmode=NAND_ECC_NONE;C. 配置内核配置内核时,配置必要的功能和移除不必要的模块1) 添加devfs配置当内核启动时,为了使内核支持devfs,且在/sbin/init运行之前能自动挂载/dev为devfs文件系统,应修改fs/Keonfig文件,找到menu"Pseudo filesystems&

9、quot;并添加如下语句:config DEVFS_FSbool " Idev file system support (OBSOLETE)"default yconfig DEVFS_MOUNTbool "Automatically mount at boot"default ydepends on DEVFS_FS2) 内核配置选项配置Linux内核有好几种方法,比如:make config, make menuconfig, make xconfig. 在本文中,我们采取“make menuconfig”来配置内核。配置时,选择的原则是编译很少使用

10、的功能代码成可装载模块,以减少内核的长度和内存消耗。经常使用和与内核密切相关的函数代码可以直接编译进内核。运行“make menuconfig命令”,我们在smdk2410_defconfig的基础之上配置内核。S3C2410开发板,有几个关键的配置,如配置可加载模块,配置MTD子系统,配置文件系统等3。D. 内核的编译和下载1) 内核编译内核配置好后,就可以编译内核了。在编译内核之前,我们可以使用命令“make clean”,以清除以前编译的残留文件,例如目标文件,模块文件和临时文件,然后使用命令“make dep”,该命令为Linux搜索并输出源代码的依赖,从而生成依赖文件,然后使用命令“

11、make zImage”编译内核。# make zImage编译完成后,两个内核映像文件“Image”和“zImage”将在arch/arm/boot目录生成,Image是正常大小的映像文件,zImage是压缩后的映像文件。2) 内核下载下载内核之前,确保引导程序已被下载到ARM开发板。我们使用USB方式下载,用DNW启动目标板。输入的命令“vivi>loadflash kernel u”,然后选择zImage,就可以完成下载过程。IV. 实时性的改进A Linux的实时性问题一般的Linux不是实时操作系统,应用程序缺乏实时性会是一个严重的问题。约束Linux操作系统实时性的因素,主要

12、包括以下几点(4, 5)。1) 非抢占的内核抢占可描述为以下过程,当出现一个别比目前系统中正在运行进程更高优先级的进程时,系统会立即中断正在运行的进程,并切换到高优先级的进程。2) 进程同步和互斥Linux使用信号的方法来确保进程同步与互斥。由于频繁的锁定和解锁信号的操作会影响系统的整体性能,因此Linux采用粗糙的时钟粒度的策略。信号的锁定和解锁操作会造成一个更长的时间间隔,所以系统往往不能满足许多所需的硬实时应用。3) 优先级反转Linux操作系统不提供优先级继承策略,所以优先级反转现象会使得高优先级的实时进程被低优先级的进程阻塞,从而导致执行时间的不确定性。4) 时钟粒度粗糙时钟管理是操

13、作系统的脉搏,Linux任务调度器的时间精度不能满足一些对时间精度要求严格的实时应用。Linux的时钟频率是100Hz,时钟周期为10ms,时钟精度粗糙,这些都不能满足实时性要求。5) 中断处理在系统调用过程中,Linux经常关闭中断很长一段时间,以保护关键资源。这将增加中断的延迟时间,阻塞要立即处理的高优先级进程,导致实时任务不能按计划及时的执行。总之,Linux是作为一个分时操作系统,必须修改才后才能满足实时性。B Linux内核实时性的改进目前,许多方法被用来实现Linux的实时性。在本文中,通过两个方面改进Linux的实时性:增加内核的实时调度策略5。1) 双内核的方法在这种方法中,我

14、们采用两个内核,它们可以一起工作在相同的硬件平台上,即,在硬件和普通Linux内核之间添加一个小的实时内核,它可以管理中断,并提供一些必要的功能,比如建立低级别的任务,中断服务程序等。如图2所示。图2. Linux实时性支持的双内核结构实时内核层负责硬件管理,并提供实时任务管理,普通Linux内核则作为实时内核调度的最低优先级任务(即空闲任务)6。实时任务直接运行在实时内核上。没有实时任务运行时,调度普通Linux内核。作为实时内核,它并不总是关闭硬件中断或接收中断信号。当需要处理的中断信号时,实时进程将抢占Linux内核。如果需要通过普通的Linux内核处理中断信号,那么实时内核将通过状态标

15、志位和中断标志捕获中断,然后传递中断信号给普通Linux内核。根据双内核结构,Linux内核的修改主要包括几个方面。添加控制点到内核的实时性受影响的位置,从而Linux内核可以被抢占且内核抢占延迟减少。分解系统需要执行较长时间,从而使实时任务随时中断非实时任务。2) 实时任务的调度策略针对不同的应用程序采取不同的实时调度策略。因此,RTOS的调度类型直接关系到其应用范围。下面是普片的实时调度算法(5,6)。PD:基于优先级的调度算法。TD:基于时间的进程调度算法。SD:基于比例共享调度算法。基于优先级的调度算法(PD):调度器在优先级的基础上寻找下一个需要执行的任务,调度算法可以划分成以下两种

16、类型:静态优先级调度算法和动态优先级调度算法。静态优先级调度算法:这种算法给那些系统中得到运行的所有进程都静态地分配一个优先级。静态优先级的分配可以根据应用的属性来进行,比如任务的周期,用户优先级,或者其它的预先确定的策略。动态优先级调度算法:这种算法根据任务的资源需求来动态地分配任务的优先级。EDF算法(最早截止期限优先)是一种典型的动态优先级调度算法,该算法根据就绪队列中的各个任务的截止期限来分配优先级,具有最近的截止期限的任务具有最高的优先级。基于时间的进程调度算法(TD):这种调度算法本质上是一种设计时就确定下来的离线的静态调度方法。在系统设计阶段,每一项任务的开始,切换以及结束时间等

17、,都必须事先做出明确的安排和设计。基于比例的共享调度算法(SD):SD的基本思想可以描述如下:按照一定的权重(使用的CPU比例)调度一组需要调度的任务,让它们的执行时间与它们的权重成正比。我们可以通过两种方法实现基于比例的共享调度算法:当各种就绪进程出现在当前调度队列时,我们规范队列的第一个频率,并调度队列中的进程执行。先后调度就绪队列中的各个进程以使其运行,并根据每个进程权重的分配指定运行时间片。三种调度策略的综合算法。现在我们同时采用三种算法:基于优先级的调度算法,基于时间的进程调度算法和基于比例的共享调度算法。添加几个任务调度属性到每个任务,如任务的优先级别,任务的开始和完成时间,我们采

18、取这些属性作为进程调度的基础5,再实现一个普通的调度框架,它支持各种调度算法,如图3所示。图3. 调度结构从图3我们可以看到,调整这些属性的值,并且依据某种优先级使用这些属性值,调度器以其各自的优势来运用这些类型的调度算法。这三种调度算法可以无缝集成在一起,首先为每个实时任务定义四个调度属性,如优先级,开始时间,结束时间和预算,不同的属性对应不同的调度策略。整个结构分两个模块,调度属性模块和调度选项模块6。属性调度模块分配多个属性值给每个实时任务,并通过这几个属性的值决定属性优先级,然后根据优先级别选择不同的调度策略去执行任务。V. 设备驱动程序开发技术A. Linux设备驱动程序的分类和通用

19、性1) Linux设备驱动程序的分类Linux支持三种类型的硬件设备:字符设备,块设备和网络设备7。字符设备通常直接传输来自用户进程的不带缓存的数据。块设备的读写则以块为单位,块可以被随机访问。网络设备在Linux中有着特殊的处理,它没有被映射到文件系统的设备节点,但要通过套接字接口获取。字符设备和块设备的主要不同在于,当发送读/写请求给字符设备时,实际硬件I/O的操作立即发生;块设备使用一个系统内存作为操作实际I/O的缓冲存储。2) Linux设备驱动程序的通用性实际上,所有的嵌入式Linux设备驱动程序都有一些共同特征。主要包括以下几点7。读/写。几乎所有的设备都有数据输入和输出。每个驱动

20、必须负责读/写操作,而读/写由驱动程序完成。OS定义读/写接口后,驱动程序就能完成特定的功能。当驱动需要实现时,接口的读/写功能需要注册到OS。中断。操作系统必须提供响应驱动中断的能力。首先我们必须注册中断处理到系统,在硬件中断发生后,操作系统将调用驱动的处理程序。时钟。在开发设备驱动时,经常用到时钟,操作系统必须为驱动提供计时机制,经过预订时间后,已注册的时钟函数将被调用。B. 嵌入式Linux设备驱动的元素驱动程序的开发是Linux内核的开发。在完成一个设备驱动后,用户可以动态加载或不加载设备驱动到内核8。1) 模块初始化函数:Init_module()。该函数是一个默认函数,在各个内核模

21、块加载后会首先调用,它是模块的一个入口点。Init_module()的作用是为稍后调用模块函数作准备。一般来说,设备的注册在此函数内完成,模块加载后,内核会知道设备的存在。2) 模块卸载函数Cleanup_module()。该函数在模块从内核卸载时会调用,它将卸载之前注册的函数。Cleanup_module()必须完全卸载内核里注册的功能函数,此函数会撤销所有init_module()的完成的事件。否则,当下次调用这个模块时,会造成重复函数名称的错误。3) 设备驱动接口:file_operations。操作系统使用file_operations 结构体来访问设备驱动函数,控制硬件。于各个设备操

22、作,设备驱动包含本身对应的函数入口。结构体file_operations 主要包含几个功能诸如打开、读、写、释放以及其他功能成员。C. 设备驱动的框架和开发流程1) 设备驱动框架在Linux设备驱动和内核之间的接口可以分为三个部分:系统的启动代码,设备接口和内核接口。如图4所示。图4. 设备驱动框架根据图4(8,9),我们可以看出驱动与内核之间的接口通过数据结构“file_operations” 实现的;驱动与系统启动之间的接口使用驱动来初始化各种设备;设备接口描述了驱动与设备之间如何交互。驱动程序有用一个数据结构“file_operations”,其中包含的多数指针指向驱动。在启动系统时,内

23、核调用每个驱动的初始化函数来传输驱动的主要设备号和内核程序中的地址结构体指针。然后内核通过主要的设备驱动号索引和访问驱动的子程序,完成open(),read(),write()或其他操作。2) 嵌入式Linux设备驱动程序的开发流程。通常使用以下的开发流程。定义主设备号和次设备号,也可以动态得到它们。执行驱动程序的初始化和删除功能,如果驱动程序使用模块的风格,它会执行模块初始化和删除功能。设计需要实现的文件操作,定义文件操作结构。执行所需的文件操作调用,如读,写等。执行中断服务,把“equest_irq”注册到内核。编译驱动程序到内核中且使用命令“insmod”加载。生成设备节点文件。VI.

24、结论Linux操作系统已经被成功地应用于嵌入式领域,凭借着其强大的功能,开源等优点,成为嵌入式领域中的热点。本文已经深入分析了Linux内核,讨论了基于ARM平台的内核移植技术。根据Linux的实时性的一些问题,我们提出了一些项目的改进;此外,还讨论了Linux设备驱动程序的通用性和开发流程。参考文献1 Chen Lijun,"Understanding Linux kernel source code deeply"M,Beijing: Posts & Telecom Press. 2002.2 KAMAL R,"Embedded Systems Arc

25、hitecture,Programming andDesign" M,The McGraw2HiIl Companies.2006.3 Yang shuiqing,"Embedded Linux System Development for ARM"M,Publishing House of Electronics industry.2009.4 David Kalinsky,"Basic Concepts of Real-Time Operating Systems",D.Kalinsky Associates.2003.11.5 RED-Linux:for Real-Time and Embe

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论