《基于ARM9的流媒体播放器的设计.docx》由会员分享,可在线阅读,更多相关《基于ARM9的流媒体播放器的设计.docx(37页珍藏版)》请在三一办公上搜索。
1、基于嵌入式ARM920T的视频播放器设计摘要嵌入式技术已经成为了后PC时代的核心技术,而基于嵌入式技术的便携式视频播放器由于体积小、重量轻、携带方便等特点,具有极广的市场前景,所以嵌入式视频播放器成为了现在IT行业研究的热点。本文提出了一种基于ARM9处理器,以嵌入式Linux为底层操作平台的嵌入式视频播放器的设计方案。本文首先介绍了视频播放器软硬件的整体设计方案,然后详细介绍了如何通过移植Bootload、Linux内核和制作根文件系统来完成搭建视频播放器底层操作平台的工作,最后通过移植开源的多媒体播放器软件MPlayer和设计相关控件完成了整个视频播放器的设计工作。最后,总结了论文所做的工
2、作,指出了嵌入式播放器所需要进一步解决和完善的问题。关键词:嵌入式,视频播放器,嵌入式Linux,ARM920TDesign of Video Player Based on Embedded ARM920TAbstractEmbedded technology has become the core technology of the post-PC era, and based on embedded technology of portable video player for small volume, light weight, convenient to carry have a
3、very wide prospect of market, and so embedded video player to become a research focus of the IT industry. This paper puts forward a kind of embedded video player design scheme,the scheme is based on the ARM9 processor ,and the Embedded Linux as the underlying operating platform.This paper first intr
4、oduced the video player overall design scheme of software and hardware ,then detailed in detail how to transplant Bootloader, Linux kernel and make a root file system to complete the work to build a video player underlying operating platform ,finally ,through transplantation of open source multimedi
5、a player software MPlayer and design controls to complete the design work of the video player.Finally, summarize the work of this paper, points out the embedded player which need to be solved and perfected problem.Keywords: Embedded,Video player,Embedded Linux,ARM目录第一章 引言11.1研究背景11.2发展状况和研究意义11.3本文组
6、织结构2第二章 播放器总体设计方案介绍32.1 播发器硬件系统架构32.2 播发器软件系统架构3第三章 系统开发平台的构建4 3.1 软件开发环境介绍43.2 Bootloader的移植53.3 Linux内核的移植73.3.1 Linux内核移植步骤73.3.2 Flash驱动的移植83.3.3 LCD驱动的移植113.3.4 UDA1341音频驱动的移植153.4 根文件系统的制作153.4.1 根文件系统介绍163.4.2 根文件系统构建16第四章 视频播放器的设计与实现184.1 MPlayer多媒体播放器介绍184.2 MPlayer的移植194.3播放器按键驱动程序设计204.4播
7、放器控制程序的设计214.5视频播放器的测试23第五章 总结23参考文献24附录A26第一章 引言1.1研究背景伴随着半导体技术、计算机技术、网络技术和软件技术的飞速发展,现如今,我们已经进入了后PC时代。在这一阶段电子产品的发展趋势是智能化、数字化、网络化、便携轻巧、易于操作,而嵌入式技术(Embedded Technology)的发展为人们提供了一个很好的解决方案。所谓嵌入式是指以应用为中心,以计算机技术为基础,软件、硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统1。嵌入式技术已经被广泛的应用于科学研究、工程设计、军事领域和文艺商业的方方面面,嵌入式产
8、品更是随处可见,比如消费电子产品、车载电子设备、智能家电、MP3、MP4等。如今人们随着生活水平的提高,对视听享受方面的要求也越来越高,人们不单仅仅满足于在电脑上或电视上欣赏高品质的音视频,也渴望能够随时随地的欣赏音乐观看电影,所以基于嵌入式技术的便携式多媒体播放器也成为了现今IT界研究的热点之一。面对广阔的市场需求,海内外的各大厂商也在积极研发自己的产品以抢占市场。基于这一背景,本文提出了一款基于嵌入式Linux操作系统和ARM处理器的视频播放器设计方案。1.2发展状况和研究意义自从2002年法国的爱可视推出全球第一款MP4多媒体Jukebox以来,基于嵌入式技术的便携式视频播放器已经发展了
9、十年,经过这十年的发展,视频播放器技术已日趋成熟,市面上的产品支持的视频格式也越来越多,功能也越来越强大,很多MP4都集成了上网、游戏、个人事务处理甚至是视频录制、数码照相等功能。目前。很多提供视频播放器处理器的半导体厂商都推出有自己的视频播放器硬件解决方案,这些方案可以概括为以下四类:一类是以德州仪器、飞利浦为代表的基于CPU+DSP芯片的解决方案;一类则是以Intel和AMD为代表的基于通用CPU的解决方案;第三种则是以飞思卡尔和深圳安凯为代表的基于MCU芯片的解决方案;第四种是基于双CPU的解决方案4。在软件方面基本上市面上的便携式视频播放器都带有嵌入式操作系统,主要的操作系统有Vxwo
10、rks、Palm OS、Windows CE、Linux、Android以及厂家自己开发的操作系统。生产厂商在设计自己的产品时如果采用上述的硬件方案,都要支付一笔不菲的授权费用,而在嵌入式操作系统的选择上也只有Linux是开源免费的,所以产品成本比较高。ARM处理器具有体积小、功耗低、低成本、高性能等优点,并且支持Linux系统6。所以可以选用ARM处理器配合Linux进行产品的设计,这样可以充分的利用Linux开源的特性,根据需要修改和移植一些免费的开源软件,这样不仅能降低产品研发的难度,加快产品的上市时间,还能省去一笔不菲的软硬件授权费用。1.3本文组织结构本文介绍了一款便携式视频播放器的
11、设计工作,该视频播发器是以ARM处理器为硬件开发平台,嵌入式Linux作为操作系统,通过移植Linux上的一款优秀的开源视频播放器软件MPlayer来实现的。本文共分五章,内容安排如下:第一章,引言。介绍了本文的选题背景,当前国内外的发展状况以及研究意义,并对论文的主要工作进行了简单介绍。第二章,播放器总体设计方案介绍。主要介绍播放器的硬件整体架构和软件系统的层次结构。第三章,系统开发平台的构建。本章详细介绍了Linux系统移植到ARM处理器的过程,Linux的移植主要包括三个方面:Booterloader的移植、Linux内核的移植和根文件的制作。第四章,视频播放器的设计与实现。介绍MPla
12、yer的移植过程和播放器相关控件的设计工作。第五章,总结。第二章 播放器总体设计方案介绍2.1 播发器硬件系统架构本设计将选用国嵌公司生产的GQ2440开发板作为硬件平台,GQ2440是一款ARM9开发板。GQ2440采用的是三星公司生产的S3C2440A处理芯片,主频400MHz,最高可达533MHz。图2.1为视频播放器的硬件系统框图,其中S3C2440处理器除了负责对音视频文件进行解码工作外,还要负责对整个视频播放器进行管理和控制;LCD为播放器的视频输出模块;UDA1341芯片为音频的输出模块,负责将经处理器解码后得到的音频数据转换为模拟信号,并传递给麦克风等输出装置;Flash存储器
13、负责对Linux内核、根文件系统、应用软件和视频文件的存储工作;按键用于完成对视频播放器的控制工作。S3C 2440处理器LCD显示音频(UDA1341)SDRAMFLASH电源按键图2.1 播放器硬件系统框架2.2 播发器软件系统架构由于Linux具有源代码开放、可移植性好、资源丰富、可靠、稳定、免费等特点,所以本文将选用嵌入式Linux作为视频播放器的底层操作平台。而视频播器软件是通过移植Linux下一款优秀的开源视频播放软件MPlayer来实现的。如图2.2所示为视频播放器的整个软件系统层次图。其中Linux内核中的设备驱动负责完成LCD显示器、UDA1314声卡芯片等设备的驱动工作,M
14、Player为视频播放器,处于应用层,利用其完成对各种音视频文件的解码工作。 硬件平台Linux内核 设备驱动应用层MPlayer图2.2 视频播放器软件系统层次第三章 系统开发平台的构建3.1 软件开发环境介绍在嵌入式系统中,由于硬件资源的有限性、差异性,所以需要开发者根据不同的硬件资源对嵌入式的操作系统作出相应的剪裁,从而定制出能够运行在特定目标平台上的嵌入式操作系统。构建一个嵌入式Linux操作系统主要包括三个方面的工作:移植Bootloader,移植Linux内核,构建Linux根文件系统。由于嵌入式系统的特殊性,其硬件资源十分有限,所以不可能在嵌入式操作系统上安装开发工具,也就不可能
15、直接在嵌入式系统上直接进行软件的开发,所以有了交叉开发模型。交叉开发模式是指先在主机上编写程序,然后通过交叉编译工具编译程序,生成目标平台上可运行的二进制文件,最后下载到具体的目标平台上进行运行7。交叉开发模型如图3.1所示。图3.1 交叉开发模型本文是以红帽公司发行的Red Hat Enterprise Linux 5作为宿主机的操作系统进行相关软件开发的,使用的交叉编译工具链为友善之臂公司提供的arm-linux-gcc-4.3.2。3.2 Bootloader的移植Bootloader是在操作系统运行之前执行的一小段程序,它在系统上电时开始执行,初始化硬件设备、建立内存空间的映射表,从而
16、建立适当的系统软硬件环境,为最终调用操作系统内核做好准备6。可以把Bootloader当成PC机的BIOS来理解。嵌入式系统的硬件存在很大的差异性, Bootloader对硬件有很大的依赖性,并且Bootloader引导的操作系统也可能不同,所以在嵌入式世界中建立一个通用的Bootloader是不可能的,不过由于大部分Bootloader任然具有很多共性,所以某些Bootloader也能支持多种不同架构的处理器和操作系统。例如,U-Boot就可以同时支持PowerPC、ARM、MIPS和X86等体系结构。U-Boot是遵循GPL条款的开放源码项目。而今U-Boot作为一个主流Bootloade
17、r,已经成功地被移植到包括PowerPC、ARM、X86、MIPS、NIOS、XScale等主流体系结构上的百种开发板,成为功能最多、灵活性最强,开发性最积极的开源Bootloader。本文将选取U-Boot作为开发板的Bootloader。在开始移植U-Boot之前,应该分析手上的U-Boot源代码已经支持的开发板,选择出硬件配置最接近的开发板作为参考。选择的原则为,首先选择MCU相同的开发板,如果没有,则选择MPU相同的开发板作为参考,这样能大大的降低移植的难度。本文使用的U-Boot版本为u-boot-2009.06,由于U-Boot目前还不支持S3C2440处理器,所以移植的时候可以我
18、们将以SBC2410开发板为参考,移植的工作就是针对S3C2440和s3c2410的不同,以及SBC2410和GQ2440开发板外设的不同做相应的修改。以下为移植的详细步骤:(1)添加新的配置选项。在U-Boot的顶层目录的Makefile文件中定义了所有开发板的配置选项,首先应该为开发板添加新的配置选项,参照SMDK2410的配置,加入如下语句:gq2440_config:unconfig$(MKCONFIG)$(:_config=) arm arm920t gq2440 NULL s3c24x0开发板配置选项中各项的含义如下:arm:表示CPU的架构是ARM体系结构。arm920t:表示C
19、PU的内核类型,对应cpu、arm920t子目录。NULL:这位用于表示开发商者或经销商。S3c24x0:片上系统定义。(2)在board目录下创建开发板目录,并添加文件。在board目录下存放着许多U-Boot支持的开发板的子目录,进行移植时要为具体的开发板建立目录并添加相应文件。这里建立gq2440目录并把用于参考移植的sbc2410x目录下的内容全部拷贝到gq2440目录下,此外还要把拷贝过来的文件内容进行修改,进入gq2440目录,把sbc2410x.c文件重命名为gq2440.c。gq2440.c是本文选用的开发板GQ2440相关的代码,它是由sbc2410x.c直接复制来的所以需要
20、针对GQ2440开发板的硬件特性做修改。(3)为开发板添加新的配置文件。当我们修改好gq2440.c文件后,还应该进入include/configs目录为我们的开发板添加配置文件,可以直接复制一份SBC2410x开发板的配置文件sbc2410x.h,再把它重命名为gq2440.h,然后再根据GQ2440开发板的具体情况进行修改。(4)配置和编译。当完成前面的步骤后就可以进行编译了,执行:make gq2440_config命令将会配置好开发板,接着执行:make CROSS_COMPILE=arm-linux- 命令系统将开始编译U-Boot,编译成功后会得到U-Boot的映像,即可把其下载到
21、开发板上。3.3 Linux内核的移植内核移植主要是指操作系统从一种硬件平台转移到另一种硬件平台上运行。对于嵌入式系统来说,有各种体系结构的处理器平台,使用的外围硬件也不一样。嵌入式Linux严重依赖于具体硬件,所以只要硬件平台有略微差别,也需要做一些移植的工作。3.3.1 Linux内核移植步骤在移植内核前需要在主机上安装好Linux操作系统,以完成对内核代码的配置和编译的工作,本文采用主机安装虚拟机并在虚拟机安装Linux的方法。作为主机,虚拟机安装的是Ret Hat公司发行的 Ret Hat Enterprise Linux 5。本文使用的硬件开发板是GQ2440,GQ2440是参照友善
22、之臂公司设计的Mini2440进行扩展设计的,硬件电路完全相同,自从Linux-2.6-31开始,Linux内核已经官方支持Mini2440,但官方的支持还是很有限。其实Mini2440是参考三星公司的SMDK2440设计而来的,它们的核心电路基本是一样的,而且内核对SMDK2440的支持非常丰富,所以本文将使用Mini2440的配置并以SMDK2440为参考进行移植Linux内核的移植。以下将对移植的步骤进行详细的讲解。(1) 获取源代码。Linux的源代码是开源的,可以到Linux的官方网站: http:/www.kernel.org/上去下载Linux源代码,本文使用的源代码为Linux
23、-2.6-32.2。下载好源代码后我们可以把源代码解压到指定目录,例如执行以下命令我们可以把Linux解压到/home/wusong 目录:tar xvzf linux-2.6-32.2.tar.gz C /home/wusong。解压完后,在/home/wusong目录下将生成一个 Linux-2.6.32.2目录。(2)指定交叉编译变量。Linux内核缺省配置的目标平台是X86的,要使内核能在运行在ARM平台上,需要进入Linux-2.6.32.2目录,修改总目录里的Makefile文件。打开Makefile文件找到以下信息:export KBUILD_BUILDHOST: = $(SUB
24、ARCH)ARCH? = $(SUBARCH)CROSS_COMPILE? =把它改为:export KBUILD_BUILDHOST: = $(SUBARCH)ARCH? = armCROSS_COMPILE? = arm-linux-其中,ARCH是指定目标平台为ARM,CROSS_COMPILE是指定交叉编译器,这里指定为系统默认的交叉编译器。(3) 替换BSP。Linux对于特定的硬件平台的软件就叫做BSP (Board Support Package)。我们进入linux-2.6.32.2/arch/arm/mach-s3c2440 目录可以看到有一个mach-mini2440.c文
25、件,这就是外国的开发者对Mini2440设计的BSP,因为它对Mini2440的支持十分有限,所以可以不使用它,把它删掉。而以SMDK2440的BSP为参考,把linux-2.6.32.2/arch/arm/mach-s3c2440 目录下得mach-smdk2440.c复制一份,重命名为mach-mini2440.c,既可使用新的mach-mini2440.c作为GQ2440的BSP。(4)修改BSP。在GQ2440开发板上使用的晶振是12MHz,而SMDK2440使用的是16.9344MHz,所以我们要修改BSP指定的系统时钟源,打开mach-mini2440.c,把static void
26、 _init smdk2440_map_io(void)函数内的16934400改为12000000。再把smdk2440_machine_init(void)函数中的smdk_machine_init()函数删掉。这时候可以回到Linux-2.6.32.2的源代码根目录下分别执行如下命令:#make mini2440_defconfig;#make zImage;mini2440_defconfig是官方自带的对mini2440的配置。执行make zImage命令后将开始编译内核,编译完成后将在在arch/arm/boot目录下生成内核文件在zImage。这时把zImage下到开发板里,通
27、过串口终端可以看到内核是能正常启动的,但由于大部分驱动都没添加,也没有根文件系统,所以还无法登陆,开发板上资源也还不能正常使用。所以接下来还应该为具体的硬件移植相应的硬件驱动程序。3.3.2 Flash驱动的移植Flash存储器在嵌入式系统中是必不可少的,它是Bootloader、Linux内核、文件系统和数据的最佳载体。在Linux内核中,引入了MTD(Memory Technology Device,内存技术设备)层为NOR Flash和NAND Flash设备提供统一的接口,从而使得Flash驱动的设计工作大为简化9。在GQ2440开发板上有256M的NAND Flash存储芯片。Lin
28、ux内核在MTD的下层实现了通用的NAND驱动(主要通过 driver/mtd/nand/nand_base.c文件实现),所以要实现NAND Flash的驱动并不需要太大的工作量。S3C2440的NAND Flash驱动是以platform驱动的形式实现的,在执行probe()函数时,初始化nand_chip实例并运行nand_scan()函数扫描NAND Flash设备,最后调用add_mtd_partitions()函数添加BSP文件中定义的分区表。因此只要在mach-mini2440.c中定义和注册分区表和相关硬件信息即可完成NAND Flash的移植工作。首先应在mach-mini2
29、440.c加入的是NAND Flash的分区表的代码:static struct mtd_partition friendly_arm_default_nand_part = 0 = .name= bootloader,.size= 0x00040000,.offset= 0,1 = .name= param,.offset = 0x00040000,.size= 0x00020000,2 = .name= Kernel,.offset = 0x00060000,.size= 0x00500000,3 = .name= rootfs,.offset = 0x00560000,.size= 10
30、24 * 1024 * 1024, /,4 = .name= nand,.offset = 0x00000000,.size= 1024 * 1024 * 1024, /;接下来还应把开发板的NAND Flash设置表和NAND Flash本身的一些特性注册进内核,分别在mach-mini2440.c中加入以下代码:static struct s3c2410_nand_set friendly_arm_nand_sets = 0 = .name= NAND,.nr_chips= 1,.nr_partitions= ARRAY_SIZE(friendly_arm_default_nand_par
31、t),.partitions= friendly_arm_default_nand_part,;static struct s3c2410_platform_nand friendly_arm_nand_info = .tacls= 20,.twrph0= 60,.twrph1= 20,.nr_sets= ARRAY_SIZE(friendly_arm_nand_sets),.sets= friendly_arm_nand_sets,.ignore_unset_ecc = 1,;为了使NAND Flash正常工作,还需把NAND Flash设备注册到系统中,把Nand Flash设备注册到系统
32、只要将其放入mach-mini2440.c中定义的mini2440_devices数组即可。除此外我们还应该把NAND Flash的一些特性传递给驱动,首先在driver/mtd/nand目录下找到NAND Flash的驱动程序:s3c2410.c,打开文件,在函数static int s3c2410_nand_setrate(struct s3c2410_nand_info*info)中添加如下代码:struct s3c2410_platform_nand * plat = info-platform ;再在mach-mini2440.c中的函数static void _init mini2
33、440_machine_init(void)里面添加如下代码:S3c_device_nand.dev.platform_data = &mini2440_nand_info ;最后重新编译内核即可完成了NAND Flash驱动的移植。3.3.3 LCD驱动的移植对嵌入式视频播放器来说。LCD显示器自然是必不可少的,Linux-2.6.32.2内核已经支持S3C2440的LCD控制器驱动,只要在mach-mini2440.c中注册具体的LCD硬件参数即可完成LCD驱动的移植工作。GQ2440开发板使用的是统宝的3.5英寸真彩色TFT液晶屏,分辨率为320x240,带触摸屏的。图3.2为TFT屏的
34、时序图:图3.2 TFT屏时序上图中的VCLK、HSYNC、VSYNC分别为像素时钟信号、行同步信号和帧同步信号,VDEN为数据有效标志信号,VD为图像的数据信号。图3.3给出的是S3C2440的LCD控制器的方框图,S3C2440的LCD控制器是用与传输视频数据和产生必要的控制信号,如VFRAME、VLINE、VCL、VM等,此外还有视频数据端口VD23:0。图3.3 LCD控制器方框图图3.4给出了LCD控制器中应该设置的TFT屏的参数,其中的上边界和下边界即为帧切换的回扫时间,左边界和右边界即为行切换的回扫时间,水平同步和垂直同步分别是行和帧同步本身需要的时间。xres和yres则分别是
35、屏幕的水平和垂直分辨率。图3.4 TFT显示屏参数因为linux-2.6.32.2已经支持S3C2440的LCD控制器驱动,所以只需在mach-mini2440.c中根据具体的LCD显示器填充两个结构体以完成对LCD显示器平台信息的注册就可以了。这两个结构体是s3c2410fb_mach_info和s3c2410_fb_display。其中s3c2410fb_mach_info用于表示LCD显示器的平台信息。s3c2410_fb_display用来表示LCD设备的机器信息,例如LCD显示器的宽度、高度和每个像素占多少位等信息6。因此根据GQ2440开发板使用的LCD显示器的特性在mach-mi
36、ni2440.c中加入如下代码:#if defined(CONFIG_FB_S3C2410_S320240)#define LCD_WIDTH 320#define LCD_HEIGHT 240#define LCD_PIXCLOCK 100000#define LCD_RIGHT_MARGIN 8#define LCD_LEFT_MARGIN 5#define LCD_HSYNC_LEN 6#define LCD_UPPER_MARGIN 8#define LCD_LOWER_MARGIN 3#define LCD_VSYNC_LEN 10#endif#if defined (LCD_WID
37、TH)static struct s3c2410fb_display arm2440_lcd_cfg _initdata = #if !defined (LCD_CON5).lcdcon5= S3C2410_LCDCON5_FRM565 | S3C2410_LCDCON5_INVVLINE | S3C2410_LCDCON5_INVVFRAME | S3C2410_LCDCON5_PWREN | S3C2410_LCDCON5_HWSWP,#else.lcdcon5= LCD_CON5,#endif.type= S3C2410_LCDCON1_TFT,.width= LCD_WIDTH,.he
38、ight= LCD_HEIGHT,.pixclock= LCD_PIXCLOCK,.xres= LCD_WIDTH,.yres= LCD_HEIGHT,.bpp= 16,.left_margin= LCD_LEFT_MARGIN + 1,.right_margin= LCD_RIGHT_MARGIN + 1,.hsync_len= LCD_HSYNC_LEN + 1,.upper_margin= LCD_UPPER_MARGIN + 1,.lower_margin= LCD_LOWER_MARGIN + 1,.vsync_len= LCD_VSYNC_LEN + 1,;static struc
39、t s3c2410fb_mach_info arm2440_fb_info _initdata = .displays= &arm2440_lcd_cfg,.num_displays= 1,.default_display = 0,.gpccon = 0xaa955699,.gpccon_mask = 0xffc003cc,.gpcup = 0x0000ffff,.gpcup_mask = 0xffffffff,.gpdcon = 0xaa95aaa1,.gpdcon_mask = 0xffc0fff0,.gpdup = 0x0000faff,.gpdup_mask = 0xffffffff,
40、.lpcsel= 0xf82,;#endif然后还要在driver/video/Kconfig中加入如下配置信息:config FB_S3C2410_T240320Boolean “3.5 inch 240X320 Toppoly LCD”depends on FB_S3C2410Help 3.5 inch 240X320 Toppoly LCD接着可以使用make menuconfig命令进入内核配置,选择相应的选项并退出保存,然后重新编译内核即完成了LCD驱动的移植工作。3.3.4 UDA1341音频驱动的移植GQ2440开发板上使用的是UDA1341音频芯片,Linux-2.6.32.2
41、已经完美的支持UDA1341的驱动,所以只要在mach-mini2440.c文件中注册UDA1341平台设备的控制端口就可以了,在mach-mini2440.c中添加如下代码:static struct s3c24xx_uda134x_platform_data s3c24xx_uda134x_data = .l3_clk = S3C2410_GPB(4),.l3_data = S3C2410_GPB(3),.l3_mode = S3C2410_GPB(2),.model = UDA134X_UDA1341,;static struct platform_device s3c24xx_uda1
42、34x = .name = s3c24xx_uda134x,.dev = .platform_data = &s3c24xx_uda134x_data,;此外还要把UDA1341设备添加到mini2440_devices数组中以UDA1341设备注册到内核中。接着我们只要使用make menuconfig命令,选择相应的选项并保存退出,再使用make zImage命令重新编译内核即可。3.4 根文件系统的制作对嵌入式系统来说,除了一个嵌入式操作系统以外,还需要一个嵌入式文件系统用来管理和存储数据、程序。在Linux文件系统结构中,内核层的文件系统实现是必须的,Linux启动时,第一个必须挂载的
43、就是根文件系统8。若系统正常挂载根文件系统,则系统会出错而退出启动,所以要为嵌入式系统构建一个根文件系统。3.4.1 根文件系统介绍根文件系统是Linux操作系统运行需要的一个文件系统。在嵌入式领域,使用哪种文件系统需要根据存储芯片的类型来决定,在嵌入式Linux应用中,主要的存储设备为RAM(DRAM,SDRAM)和ROM(Flash存储器),常用的基于Flash存储设备的文件系统类型包括jffs2、Yaffs、Cramfs、Romfs、Ramdisk等,而作为根文件系统一般会选用Yaffs和Cramfs。Yaffs是第一个为NAND Flash存储器设计的嵌入式文件系统,适用于大容量的存储
44、设备,并且在GPL协议下发布,可免费获得其代码9。Yaffs文件系统有4个主要优点:速度快、占用内存少、不支持压缩和只支持Yaffs存储器。Cramfs是Linux的创始人Linus Torvalds参与开发的一种只读的压缩文件系统,也是基于MTD驱动程序的。在Cramfs文件系统中,每一页(4k)被单独压缩,可随机页访问,其压缩比高达2:1,为嵌入式系统节省大量的Flash存储空间10。由于以上特性,Cramfs在前如斯系统中应用广泛,但由于是只读的属性,也使得用户无法进行扩充。基于以上比较本文将选用yaffs作为根文件系统。根文件系统以树形结构来组织目录和文件的结构,系统上电后,根文件系统
45、被挂接到根目录“/”上。根文件系统应该包含的目录和文件遵循FHS标准(Filesystem Hierarchy Standard,文件系统层次标准),这个标准包含了根文件系统中最少应该包含哪些目录和文件,以及这些目录的组织原则13。按照FHS标准,根文件系统顶层目录至少要包含如下的目录:bin、sbin、boot、root、home、etc、dev、opt、mnt、lib、proc、tmp、usr、var。3.4.2 根文件系统构建根文件系统除了应该以FHS标准的格式组织外,还应该包含一些必要的命令。这些命令提供给用户使用,以使用户能方便地操作系统。一般来说构建根文件系统的方法有两种。一种是下
46、载相应的命令的源代码,并移植到处理器架构平台上。第二种方法是使用一些开源的工具构建根文件系统,例如使用BusyBox、TinyLogin和Embutils。BusyBox是最常使用的一个工具,Busybox可以把常见的linux命令打包编译成一个单一的可执行文件7。本文就将使用BusyBox来构建一个根文件系统,下面将详细讲解如何使用BusyBox构建一个根文件系统。(1)配置编译Busybox。Busybox的源代码可以从上下载。本文选用的版本是Busybox-1.3.2版。先把下载到的代码使用如下命令解压:tar jxvf Busybox-1.3.2.tar.bz2然后进入解压后的Busybox-1.3.2目录执行make menuconfig命令对Busybox进行配置,Busybox的配置菜单如图3.5所示:图3.5 Busybox的配置菜单当选好配置选项后,保存并退出。然后打开Makefile文件找到如下内容:ARCH ? = $(SUBARCH)