已阅读5页,还剩68页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
,7.1嵌入式Linux简介,7.2构建Linux开发环境,2,7.3引导程序移植,3,7.4Linux内核移植,4,7.5构建嵌入式文件系统,5,7.6应用程序开发,6,1,Linux支持的常见的文件系统有:JFS、ReiserFS、Ext、Ext2、Ext3、ISO9660、XFS、Minx、MSDOS、UMSDOS、VFAT、NTFS、HPFS、NFS、SMB、SysV、PROC等。Ext2是Linux事实上的标准文件系统,已经取代了扩展文件系统(或Ext)。Ext支持的文件大小最大为2GB,支持的最大文件名称大小为255个字符。而Ext2fs支持达4TB的内存,文件名称最长可以到1012个字符。,1文件系统简介,JFFS2文件系统JFFS2是专门为像闪存芯片的嵌入式设备创建的,所以整个设计提供了更好的闪存管理。当文件系统已满或接近满时,因为垃圾收集问题JFFS2会大大放慢运行速度。YAFFS/YAFFS2文件系统YAFFS/YAFFS2是专为嵌入式系统使用NAND型闪存而设计的日志型文件系统。与JFFS2相比,它减少了一些功能(例如不支持数据压缩),所以速度更快,挂载时间很短,对内存的占用较小。,1文件系统简介,CramFS文件系统CramFS(CompressedRAMFileSystem)是Linux的创始人LinusTorvalds参与开发的一种基于MTD驱动程序只读的压缩文件系统。CramFS文件系统中,每一页(4KB)被单独压缩,可以随机页访问,其压缩比高达2:1,为嵌入式系统节省大量的Flash存储空间,使系统可通过更低容量的Flash存储相同的文件,从而降低了系统成本。,1文件系统简介,RAMdiskRAMdisk是将一部分固定大小的内存当作分区来使用。它并非实际的文件系统,而是一种将实际的文件系统装入内存的机制,并且可以作为根文件系统。将一些经常被访问而又不会更改的文件(如只读的根文件系统)通过RAMdisk放在内存中,可以明显地提高系统的性能。在Linux的启动阶段,Initrd提供了一套机制,可以将内核映像和根文件系统一起载入内存。,1文件系统简介,网络文件系统网络文件系统(NetworkFileSystem,NFS)是由Sun公司开发并发展起来的一项在不同机器、不同操作系统之间通过网络共享文件的技术。在嵌入式Linux系统的开发调试阶段,可以利用该技术在主机上建立基于NFS的根文件系统,挂载到嵌入式设备,从而可以很方便地修改根文件系统的内容。,一、文件系统简介,二、文件系统组成,1、/dev设备文件在/dev目录下是一些称为设备文件的特殊文件,用于访问系统资源或设备,如软盘、硬盘、系统内存等。/dev/console系统控制台,也就是直接和系统连接的监视器。/dev/hdIDE接口的整块硬盘表示为/dev/hda-z。/dev/fd软驱设备文件。/dev/sdSCSI接口磁盘驱动器。目前,Linux下驱动USB存储设备的方法采用模拟SCSI设备。/dev/tty设备虚拟控制台。如/dev/tty1指的是系统的第一个虚拟控制台,/dev/tty2则是系统的第二个虚拟控制台。/dev/ttyS*串口设备文件。dev/ttyS0是串口1,dev/ttyS1是串口2。,2/rootroot用户主目录。3/usr一般不需要修改的命令程序文件、链接库、手册和其他文档等。4/var包含经常变化的文件,如打印机、邮件、新闻等的脱机目录,日志文件及临时文件等。5/home用户主目录的默认位置。6/proc/prco文件系统并不保存在系统的硬盘中,操作系统在内存中创建这一文件系统目录,它是虚拟的目录,即系统内存的映像,其中包含一些和系统相关的信息,如CPU的信息等。7/bin该目录包含二进制(binary)文件的可执行程序。8/sbin与bin目录类似。,9/etc目录在Linux文件系统中是一个很重要的目录,启动脚本位于/etc/rc.d/init.d中,系统最先运行的服务是那些放在/etc/rc.d目录下的文件,而运行级别在档文件/etc/inittab中指定。(1)/etc/rc或/etc/rc.d启动或改变运行级别时运行的脚本或脚本的目录。(2)/etc/passwd/etc/passwd是存放用户的基本信息的口令文件。(3)etc/fstab指定启动时需要自动安装的文件系统列表。(4)etc/inittabinit的配置文件。,10/boot该目录存放系统启动时所需的各种文件,如内核的镜像文件,引导加载器(BootstrapLoader)使用的文件LILO和GRUB。11/lib标准程序设计库。12/mnt该目录用来为其他文件系统提供安装点。#mounttvfatdev/hda1/mnt/win_D即可将硬盘的第一个分区挂载到Linux下的/mnt/win_D目录中。13/tmp公用的临时文件存储点。14/initrd用来在计算机启动时挂载initrd.img映像文件及加载所需设备模块的目录,需要注意的是,不要随便删除/initrd/目录,如果删除了该目录,将无法重新引导系统。,1)YAFFS文件系统介绍YAFFS意为“YetAnotherFlashFileSystem”,是目前唯一专门为NANDFlash设计的文件系统。JFFS2文件系统能够很好地运行于NORFlash设备中,而YAFFS则是特别为NANDFlash设计的,类似于JFFS2的日志型文件系统。YAFFS文件系统的出现,使得价格低廉的NANDFLASH芯片具有高效性和健壮性。目前,大容量的NANDFlash器件和基于它的YAFFS/YAFFS2文件系统正越来越广泛地运用在嵌入式系统中。基于NANDFlash的YAFFS文件系统原理框图如图所示。,三、构建YAFFS文件系统,基于NANDFlash的YAFFS文件系统原理框图,2)构建支持YAFFS文件系统的Linux内核嵌入式Linux内核本身并不支持YAFFS文件系统,实现Linux内核支持YAFFS文件系统的方法有两种:一种是直接把YAFFS编译到内核,另一种是将YAFFS编译成单独的模块来加载。嵌入式系统中使用NANDFlash器件时通常都采用YAFFS作为根文件系统,所以可以将对YAFFS的支持直接编译到内核;若想采用多文件系统进行试验,则可以将YAFFS文件系统作为模块进行加载,这样可以精简编译内核的大小,提高内核的运行速度。,嵌入式Linux系统将YAFFS编译到内核并作为根文件系统,下面阐述将YAFFS直接编译到内核的方法。首先需要将YAFFS源代码复制到内核fs目录下,进行必要的配置后,重新编译得到一个能够支持YAFFS文件系统的Linux内核。YAFFS源代码可以http:/www.aleph1.co.uk/cgibin/viewcvs.cgi/yaffs/上免费下载。,YAFFS源代码主要包括yaffs_ecc.c、yaffs_fileem.c、yaffs_fs.c、yaffs_guts.c、yaffs_mtdif.c、yaffs_ramem.c等文件,各文件的主要功能如下:yaffs_ecc.c:ECC校验算法。yaffs_fileem.c:实现NANDFlash文件层仿真。yaffs_fs.c:YAFFS与虚拟文件系统的接口。yaffs_guts.c:YAFFS文件系统的主要算法。yaffs_mtdif.c:NANDMTD封装函数。yaffs_ramem.c:NANDFlash的RAM块仿真实现。下面详细描述实现支持YAFFS文件系统的Linux内核的具体步骤:,(1)在内核源代码fs目录下建立YAFFS目录,并把下载的YAFFS源代码复制到该目录下面。(2)修改fs/config.in,添加配置yaffs文件系统选项:if“CONFIG_MTD_NAND”=“y”;thentristate“YaffsfilesystemonNAND”CONFIG_YAFFS_FSfi(3)修改fs/Makefile,添加如下内容:subdir-$(CONFIG_YAFFS_FS)+=yaffs,(4)在fs/yaffs/目录下,生成Makefile和Kconfig文件。Makefile内容为obj-$(CONFIG_YAFFS_FS)+=yaffs.oyaffs-y:=yaffs_ecc.oyaffs_fs.oyaffs_guts.oyaffs-$(CONFIG_YAFFS_MTD_ENABLED)+=yaffs_mtdif.oyaffs-$(CONFIG_YAFFS_RAM_ENABLED)+=yaffs_ramem.oKconfig文件是YAFFS文件系统的详细配置文件,其内容可参考下载的源代码中/linux-kernel/fs/yaffs/Kconfig文件。YAFFS文件系统的主要的配置选项及默认设置如表所示。,YAFFS文件系统主要配置选项说明,(5)修改内核源代码中关于NAND的分区设置。NAND闪存支持两种分区形式,一种是MTD分区格式,另一种是BON分区格式。MTD技术实现对内存设备支持的统一接口,提供Flash设备到字符设备和块设备的驱动转换,包含对各种不同类型NOR、NANDFlash等的支持。BON文件系统是韩国mizi公司提供的NANDFlash块设备驱动,通常采用MTD分区格式。对NAND设备分区可通过Bootloader完成,如常用的mizi公司的ViVi可用part相关命令进行分区,并可用partshow查看mtdpart信息,如图所示。,在ViVi中查看NAND闪存的MTD分区信息,该分区信息将和Linux系统中/dev/mtd目录下的分区信息相对应,其中vivi、param、kernel、root分区分别依次对应为mtd/0、mtd/1、mtd/2、mtd/3。编译内核时,内核源代码中NAND分区信息必须和实际的NAND设备分区信息一致,否则YAFFS文件系统移植后将无法正确挂载。内核源代码中关于NAND设备的MTD分区信息在/drivers/mtd/nand/smc_s3c2410.c中。根据Bootloader中查看的信息修改smc_s3c2410.c的MTD分区信息如下:,staticstructmtd_partitionsmc_partitions=name:vivi,size:0 x20000,/0 x000c0000,name:param,size:0 x10000,/0 x00a00000,name:kernel,size:0 x100000,/0 x000c0000,name:root,size:0 x03ec8000,/0 x00a00000,完成以上步骤的修改后,即可编译内核。编译内核时,在配置内核时需要选择YAFFS、NAND、MTD等相关支持选项。编译成功后得到的是支持YAFFS文件系统的新内核,最后将新内核下载到NAND闪存中的Kernel分区即可。,3制作和下载YAFFS文件系统映像NANDFlash芯片的一页大小为512+16=528字节,前512字节用来存放数据,后16字节是备用空间(SpareData,OOB),用来存储ECC校验/坏块标志等信息。YAFFS文件系统是针对NAND设备的文件系统,所以制作出来的YAFFS映像文件与通常的文件系统的映像文件不同。因为除了以512字节为单位的一个页面的数据外,还包括以16字节为单位的NAND备份数据区(OOB)的数据,所以实际上是以528个字节为单位的。因此,通常下载其他类型image的工具无法正常下载YAFFSimage,需要使用专门YAFFS映像打包和下载工具,或者修改所使用的下载工具的代码,使其能将YAFFSimage中的额外数据也写入NANDFlashOOB中。,本节使用YAFFS源代码中utils文件夹下的mkyaffsimage和mkyaffs两个工具来打包和下载YAFFS映像到NANDFlash中。其中mkyaffsimage是制作YAFFS映像文件的工具,mkyaffs可以用来擦除NAND分区并将制作好的映像文件下载。(1)制作YAFFS映像文件(假定用户文件存放在usr文件夹中),例如:./mkyaffsimageusrusr_yaffs.img(2)下载YAFFS映像文件(假定用来存放YAFFS文件系统的MTD/3分区),例如:./mkyaffs/dev/mtd/3usr_yaffs.img,下载完成后,重新启动系统,在ViVi中修改Linux的启动参数,以修改挂载根文件系统的路径:paramsetlinux_cmd_line“noinitrdroot=/dev/mtdblock/3init=/linuxrcconsole=Stty0”再次重新启动后,当出现如下信息,表明系统已经从NANDFlash中正确挂载YAFFS根文件系统了:mount_root,tryingyaffsfilesystem.yaffs:AttemptingMTDmounton31.3,devis7939“1f:03”VFS:Mountedroot(yaffsfilesystem).Mounteddevfson/dev,四、构建CramFS文件系统1)CramFS文件系统简介CramFS(CompressedRomFileSystem)是LinuxTorvalds在Transmeta任职时所参与开发的文件系统。它是针对Linux内核2.4之后的版本所设计的一种新型只读文件系统,采用了zlib压缩,压缩比一般可以达到1:2,但仍可以实现高效的随机读取。在Linux系统中,通常把不需要经常修改的目录压缩存放,并在系统引导的时候再将压缩文件解开。由于CramFS不会影响系统读取文件的速度,而且是高度压缩的文件系统,因此非常广泛地应用于嵌入式系统开发。,嵌入式开发环境中,内存和外存资源都比较有限。如果使用RAMdisk方式来使用文件系统,那么在系统运行之后,首先把Flash上的映像文件解压缩到内存中,构造起RAMdisk环境,才可以开始运行程序。同样的代码不仅在Flash中占据空间(以压缩后的形式存在),而且还在内存中占用更大的空间(以解压缩之后的形式存在),这便违背了嵌入式环境下尽量节省资源的要求。,使用CramFS文件系统可以解决这个问题。CramFS是一个压缩格式的文件系统,并不需要一次性地将文件系统中的所有内容都解压缩到内存,而只是在系统需要访问某个位置的数据的时候,马上计算出该数据在CramFS中的位置,将它实时地解压缩到内存,然后通过对内存的访问来获取文件系统中需要读取的数据。CramFS中的解压缩以及解压缩之后的内存中数据存放位置都是由CramFS文件系统本身进行维护,用户并不需要了解具体的实现过程,因此这种方式增强了透明度,对开发人员来说,既方便,又节省了存储空间。,2)CramFS文件系统的移植过程文件系统紧跟系统内核放置,由内核加载,主要存放用户应用程序和配置信息。CramFS文件系统的基本组成:初始化程序、shell程序以及其他Linux常用工具、配置文件、链接库、图形界面程序和用户应用程序等。下面将介绍移植CramFS文件系统的具体操作方法。1)在内核中加入对CramFS文件系统的支持在编辑系统内核时加入支持CramFS的选项。尽管mCLinux可以以模块的形式加载至各种类型的设备驱动,但一般选择直接把设备驱动及CramFS文件系统静态地编译进内核。,(1)在MemoryTechnologyDevices(MTD)选项中进行如下配置:MemoryTechnologyDevice(MTD)supportY/M/N/?:内存技术设备支持,此项选Y。MTDpartitioningsupportY/M/N/?:支持MTD分区。此项选Y。DirectchardeviceaccesstoMTDdevicesY/M/N/?:MTD字符设备直接访问。此项选Y。CachingblockdeviceaccesstoMTDdevicesY/M/N/?:MTD块设备缓冲访问。此项选Y。,(2)在FileSystems选项中进行如下配置:CompressedROMfilesystemsupportY/M/N/?:ROM文件系统的支持。此项选Y。完成上述修改并编译后,即可实现Liunx内核对CramFS文件系统的支持。,2)拷贝需要加入的其他文件和链接库(1)Busybox是DebianGNU/Linux的BrucePerens开发的。Busybox编译出一个单个的独立执行程序,就叫做Busybox。可以根据配置执行ashshell的功能,以及几十个各种小应用程序的功能。这其中包括一个迷你的Vi编辑器、系统不可或缺的/sbin/init程序,以及诸如ifconfig、halt、reboot、mkdir、mount、ln、ls、echo、cat等等。而所有这一切功能却只有1MB左右的大小。Busybox已经成为构建嵌入式Linux文件系统的必备软件。在后面将详细介绍Busybox的相关技术。,下面是需要编译进Busybox的功能选项,其他的可以根据需要自选。BuildOptions*BuildBusyBoxasastaticbinary(nosharedlibs)这个选项是一定要选择的,这样才能把Busybox编译成静态链接的可执行文件,运行时才独立于其他函数库,否则必须要其他库文件才能运行,在单个Linux内核中则不能正常工作。,*DoyouwanttobuildBusyBoxwithaCrossCompiler,即选择自定义的交叉编译环境。InstallationOptions*dontuse/usr这个选项也一定要选,否则执行makeinstall后Busybox将安装在原系统的/usr下,这将覆盖系统原有的命令。选择这个选项后,执行makeinstall后会在Busybox目录下生成一个叫_install的目录,里面有Busybox和指向它的链接。,其他选项都是一些Linux基本命令选项,可根据自己的需要来编译,一般用默认的就可以了,配置好后退出并保存。将编译好的Busybox复制到CramFS文件系统的/bin目录下,然后创建常用命令的快捷方式。建立快捷方式很简单,只要建立一个符号链接,如ln-s/bin/busybox/bin/ls,那么,执行/bin/ls的时候,Busybox就会执行ls的功能,也会按照ls的方式处理命令行参数。,(2)拷贝一些管理员控制程序到/sbin目录下,最重要的就是要包含一个init命令,可以使用Busybox提供的系统工具,比如ln-s/bin/busybox/sbin/init,这样就有了系统运行不可或缺的/sbin/init程序。(3)将应用程序运行时所需要的库拷贝到/lib,库文件可以从PC机上的交叉编译工具安装目录下拷贝,如libc-2.2.2.so、libcryt-2.2.2.so、libm-2.2.2.so、libutil-2.2.2.so等,为部分相应库建立快捷方式,提供一些按快捷方式名称调用的应用程序。值得注意的是,C库要采用C库的版本glibc,glibc位于/lib/libc.so.6。,3)利用mkcramfs工具生成CramFS压缩文件系统一般情况下都要把已经规划好的目录结构转换成映像文件,创建CramFS文件系统需要mkcramfs工具,mkcramfs能把相应的CramFS目录树压缩成为单一的映像文件,这个映像文件就是需要移植的文件系统。mkcramfs的命令格式为mkcramfs-h-eedition-Ifile-nnameDirNameOutFile#mkcramfsrootcramfs.Img用以上的命令就可以生成需要的CramFS文件系统映像文件,可以发现原本为2.36MB大小的目录内容被压缩成一个1.08MB的CramFS文件系统映像文件,通过ViVi或测试程序将其写入Flash中就可以验证是否移植成功。,Busybox被非常形象地称为嵌入式Linux系统中的“瑞士军刀”,因为它将许多常用的UNIX命令和工具结合到了一个单独的可执行程序中。虽然与相应的GNU工具比较起来,Busybox所提供的功能和参数略少,但在比较小的系统(例如启动盘)或者嵌入式系统中,这已经足够了。,五、Busybox,Busybox在设计上充分考虑了硬件资源受限的特殊工作环境。它采用一种很巧妙的办法减小自己的体积:所有的命令都通过“插件”的方式集中到一个可执行文件中,在实际应用过程中通过不同的符号链接来确定到底要执行哪个操作。例如最终生成的可执行文件为Busybox,当为它建立一个符号链接ls的时候,就可以通过执行这个新命令实现列目录的功能。采用单一执行文件的方式最大限度地共享了程序代码,甚至连文件头、内存中的程序控制块等其他操作系统资源都共享,对于资源比较紧张的系统十分适合。,Busybox是很多标准Linux工具的一个单个可执行实现包。Busybox包含了很多简单的工具,例如cat和echo,还包含了一些更大、更复杂的工具,例如grep、find、mount以及telnet(不过它的选项比传统的版本要少)。Busybox最初是由BrucePerens在1996年为DebianGNU/Linux安装盘编写的。其目标是在一张软盘上创建一个可引导的GNU/Linux系统,这可以用作安装盘和急救盘。一张软盘可以保存大约1.41.7MB的内容,因此没有多少空间留给Linux内核及相关的用户应用程序。,Busybox是按照GNUGeneralPublicLicense(GPL)许可证发行的。这意味着如果在一个项目中使用Busybox,就必须遵守这个许可证。可以在BusyboxWeb站点上看到该许可证的内容。Busybox团队监视违反这个许可证的情况,他们维护了一个“HallofShame”页面来说明违反者的情况。,很多标准Linux工具都可以共享很多共同的元素。例如,很多基于文件的工具(比如grep和find)都需要在目录中搜索文件的代码。当这些工具被合并到一个可执行程序中时,就可以共享这些相同的元素,这样可以产生更小的可执行程序。实际上,Busybox可以将大约3.5MB的工具压缩成大约200KB大小。这就为可引导的磁盘和使用Linux的嵌入式设备提供了更多功能,并且可以对2.4和2.6版本的Linux内核使用Busybox。,5.1Busybox命令的工作原理为了使一个可执行程序看起来就像是很多可执行程序一样,Busybox为传递给C语言的main函数的参数开发了一个很少使用的特性。C语言的main函数定义如下:intmain(intargc,char*argv)在这个定义中,argc表示传递进来的参数的个数(参数数量);而argv表示字符串数组,代表从命令行传递进来的参数(参数向量)。argv的索引0是从命令行调用的程序名。下面的C程序展示了Busybox的调用过程,尽管代码只简单地打印argv向量的内容。Busybox使用argv0来确定调用哪个应用程序。,/test.c#includeintmain(intargc,char*argv)inti;for(i=0;iargc;i+)printf(argv%d=%sn,i,argvi);return0;,调用这个程序显示所调用的第一个参数是该程序名字。可以对这个可执行程序重新进行命名,此时再调用就会得到该程序的新名字。另外,可以创建一个到可执行程序的符号链接,在执行这个符号链接时,就可以看到这个符号链接的名字。在使用新命令更新Busybox之后的命令测试如下:,$gcc-Wall-otesttest.c$./testarg1arg2argv0=./testargv1=arg1argv2=arg2$mvtestnewtest$./newtestarg1argv0=./newtestargv1=arg1$ln-snewtestlinktest$./linktestargargv0=./linktestargv1=arg,Busybox使用了符号链接,对于Busybox中包含的每个工具来说,都会创建一个符号链接,这样就可以使用这些符号链接调用Busybox。Busybox可以通过argv0调用内部工具。,5.2配置并编译Busybox从Busybox的Web站点上下载最新版本的Busybox。与大部分开放源码程序一样,它是以一个压缩的tarball形式发布的,可以使用tar命令将其转换成源代码树。1)Busybox源代码树Busybox的源代码树中,工具基于用途进行分类,并存储在单独的子目录中。例如,网络工具和守护进程(如httpd、ifconfig等)都在./networking目录中;标准的模块工具(包括insmod、rmmod和lsmod)都在./modutils目录中;编辑器(例如Vi和流编辑器、awk和sed)都在./editors目录中。Makefile配置、编译和安装所使用的各个文档都在这个目录树的根目录中。,展开Busybox,代码如下:$tarxvfzbusybox-1.1.1.tar.gz$生成一个目录busybox-1.1.1,其中包含了Busybox的源代码。当编译默认的配置(其中包含了几乎所有的内容,并禁用了调试功能)时,需使用defconfigmake目标。编译默认的Busybox配置如下:$cdbusybox-1.1.1$makedefconfig$make$,编译结果是一个相当大的Busybox映像,不过这是最简单的make方法。直接调用这个新映像,会产生一个简单的Help页面,其中包括当前配置的命令。要对这个映像进行测试,也可以对一个命令调用Busybox来执行。Busybox命令的执行情况和Busybox中的ashshell,代码如下:,$./busyboxpwd/usr/local/src/busybox-1.1.1$./busyboxash/usr/local/src/busybox-1.1.1$pwd/usr/local/src/busybox-1.1.1/usr/local/src/busybox-1.1.1$exit$在这个例子中,调用了pwd(打印工作目录)命令,使用Busybox进入ashshell,并在ash中调用pwd。,2)手工配置Busybox如果构建具有特殊需求的嵌入式设备,那么可以手工使用menuconfigmake目标来配置Busybox的内容。如果熟悉Linux内核的编译过程,就会注意到menuconfig与配置Linux内核的内容所使用的目标相同。实际上,它们都采用了相同的基于ncurses的应用程序。,使用手工配置,可以指定在最终的Busybox映像中包含的命令。也可以对Busybox环境进行配置,例如包括对NSA(美国国家安全代理)的安全增强Linux(SELinux),指定要使用的编译器(用来在嵌入式环境中进行交叉编译)以及Busybox应该静态编译还是动态编译。图给出了menuconfig的主界面。在这里可以看到可以为Busybox配置的不同类型的应用程序(applet)。,使用menuconfig配置Busybox,可以使用下面的命令手工配置Busybox:$makemenuconfig$make$这里提供了可以调用的Busybox的二进制文件。下一个步骤是围绕Busybox构建一个环境,包括将标准Linux命令重定向到Busybox二进制文件的符号链接。可以使用下面命令简单地完成这个过程:$makeinstall$,默认情况下,这会创建一个本地子目录_install,其中包含了基本的Linux环境。在这个根目录中,可找到一个链接到Busybox的linuxrc程序。这个linuxrc程序在构建安装盘或急救盘(允许提前进行模块化的引导)时非常有用。同样是在这个根目录中,还有一个包含操作系统二进制文件的/sbin子目录,以及一个包含用户二进制文件的/bin目录。在构建软盘发行版或嵌入式初始RAM磁盘时,可以将这个_install目录迁移到目标环境中。还可以使用make程序的PREFIX选项将安装目录重新定向到其他位置。例如,下面的代码就使用/tmp/newtarget根目录来安装这些符号链接,而不是使用./_install目录:,$makePREFIX=/tmp/newtargetinstall$使用installmake目标创建的符号链接都来自于busybox.links文件。这个文件是在编译Busybox时创建的,包含已经配置的命令清单。在执行install命令时,就会检查busybox.links文件确定要创建的符号链接。到Busybox的命令行链接也可以使用Busybox在运行时动态创建。CONFIG_FEATURE_INSTALLER选项就可以启用这个特性,在运行时可以执行如下代码:,$./busybox-install-s$其中,-s选项表示强制创建符号链接(否则就创建硬链接)。这个选项要求系统中存在/proc文件系统。,3)Busybox编译选项Busybox包括了几个编译选项,在定义配置时,只需要输入make就可以真正编译Busybox二进制文件。例如,要为所有的应用程序编译Busybox,可以执行下面的命令:$makeallyesconfig$make$对Busybox映像的压缩需要把握两个原则:不能编译为静态二进制文件(这会将所有需要的库都包含到映像文件中);相反,如果是编译为一个共享映像,那么会使用其他应用程序使用的库(例如/lib/libc.so.X)。,一般应使用uClibc进行编译,这是一个对大小进行过优化的C库,是为嵌入式系统而开发的;不要使用标准的glibc(GNUC库)来编译。Busybox中的命令并不支持所有可用选项,不过这些命令都包含了常用的选项。如果需要知道一个命令支持哪些选项,可以使用-help选项来调用这个命令的帮助信息。例如:,$./busyboxwc-helpBusyBoxv1.1.1(2006.04.09-15:27+0000)multi-callbinaryUsage:wcOPTION.FILE.Printline,word,andbytecountsforeachFILE,andatotallineifmorethanoneFILEisspecified.WithnoFILE,readstandardinput.Options:-cprintthebytecounts-lprintthenewlinecounts-Lprintthelengthofthelongestline-wprintthewordcounts$,以上这些特定的数据只有在启用了CONFIG_FEATURE_VERBOSE_USAGE选项时才可以使用。如果没有这个选项,就无法获得这些详细数据,但是这样可以节省大约13KB的存贮空间。向Busybox中添加一个新命令非常简单,因为它具有良好定义的体系结构。为新命令的源代码选择一个位置,要根据命令的类型(网络、shell等)来选择位置,并与其他命令保持一致。这一点非常重要,因为这个新命令最终会在menuconfig的配置菜单中出现(在下例中,为MiscellaneousUtilities菜单)。,下例中
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论