标签:
基于ARM的嵌入式Linux操作系统移植的研究 2006 5
基于嵌入式Linux的Ext2根文件系统制作分析 2015 6
嵌入式Linux系统的移植及其根文件系统的实现 2005 10
面向应用的嵌入式Linux裁剪方法研究与实现 2009 11
基于ARM的嵌入式闪存驱动与UBIFS文件系统的分析与实现 2014 14
嵌入式设备中基于NAND Flash的文件系统设计和优化 2013 18
嵌入式Linux系统定制和裁剪技术的研究与实现 2006 19
嵌入式系统中NAND Flash文件系统的研究 2010 19
Linux系统应用日益广泛,但该系统庞大,裁剪困难。基于保留内核和系统必需文件的原则,介绍了当前应用较广的几种方法。
裁剪Linux系统,必须首先了解Linux系统的启动过程、系统文件结构和软件安装方法。
Linux系统的启动过程大致包括bios2部分、引导扇区、内核、根文件及系统初始化。根文件目录框架包括目录/bin、/sbin、/usr、/etc、/dev、/root、/boot、/mnt、/proc、/home和lib。
常见的几种方法:(1)定制安装法。(2)rpm裁剪法。(3)手工删除法。
使用busybox后需要改变原来Linux系统的初始化过程,因为busybox的一些命令与原来的有些区别,会导致Linux系统不能够顺利初始化,同时也可以进一步缩小Linux。
Linux根文件系统是Linux内核启动期间进行的最后操作之一,它是Linux嵌入式系统的一个重要组成部分,系统地分析了Linux嵌入式系统根文件系统的类型,内容选择以及制作方法。
Linux应用于嵌入式系统的开发有如下一些优点:
(1)Linux自身具备一整套工具链,容易自行建立嵌入式系统的开发环境和交叉运行环境,并且可以跨越在嵌入式系统开发中仿真工具ICE的障碍。
(2)内核的完全开放,可以自己设计和开发出真正的硬实时系统;对于软实时系统,在Linux中也容易实现。
(3)强大的网络支持,可以利用Linux的完了过协议栈将其开发成为嵌入式的TCP/IP网络协议栈。
而/home/mnt /opt /root 是针对多用户的, 所以嵌入式系统中可以不要, 是否要boot 目录取决于加载程序是否会在内核启动之前从根文件系统取回内核。注意存放二进制的几个目录:/bin/sbin/usr/bin/usr/sbin的区别, /bin存放用户和管理员都必需的命令, /sbin存放管理员必备的命令而普通用户不需要的, /usr/bin存放的不是用户必备的命令, /usr/sbin不是管理员必备的命令。
/lib里的文件可以用glibc的也可以选用uClibc的, 后者与前者兼容, 体积小很多。必须包含的库文件主要有两类:以*.so结尾实际的库文件和以*.so.version主修版本连接文件, 它们是在程序运行时使用。必须包括下列文件:
ld-2.1.3.solibutil -2.1.3.so ld-linux.so.2 libutil.so.1 libc-2.1.3.so libtermcap.so.2.0.8 libc.so.6 libtermcap.so.2 libcrypt -2.1.3.so libresolv.so.2 libcrypt.so.1 libresolv-2.1.3.so libdb-2.1.3.so libpthread.so.0 libdb.so.3 libpthread-0.8.so libdl -2.1.3.so libproc.so.2.0.0 libdl.so.2 libnss-files.so.2 libm-2.1.3.so libnss-files-2.1.3.so libm.so.6 libnss-dns.so.2 libnsl-2.1.3.so libnss-dns-2.1.3.so libnsl.so.
/etc目录包含了Linux的配置文件,它们决定Linux的引导,运行特性。
Ramdisk上的Ext2fs
优点:稳定、可靠、健壮,即可在所有基于Linux的系统上都可使用Ext2fs。
缺点:(1)Ext2fs是为IDE设备那样的块设备设计的,这些设备的逻辑块大小是512字节,1K字节等这样的倍数。不太适合于扇区大小因设备不同而不同的闪存设备。(2)Ext2fs没有提供对扇区的擦除/写操作的良好管理。为了在一个扇区中擦除单个字节,必需将整个扇区复制到RAM,然后擦除,再重写入。(3)Ext2fs不能防御掉电的情况,不支持损耗平衡。
JFFS2
(1)JFFS2在扇区级别上执行闪存擦除/写/读操作比Ext2fs好。
(2)JFFS2提供了比Ext2fs更好的崩溃/掉电安全保护。
(3)专门为闪存芯片所创建,提供了更好的闪存管理。
CRAMFS
是一种被压缩的只读文件系统,压缩比50%,界于RAMDISK和JFFS2之间的一种文件系统。
TMPFS
基于内存的文件系统,主要用于减少对系统的不必要的闪存写操作这一唯一目的。因为TMPFS驻留在RAM中,所以写/读/擦除操作发生在RAM而不是在内存中。还是用磁盘交换空间来存储,并且当为存储文件而请求页面时,使用虚拟内存子系统。
优点:(1)动态文件系统的大小可以根据具体的文件或目录数量来缩放。(2)由于驻留在RAM中,读写操作很快。
缺点:系统重新引导时,会丢失所有数据。
根文件系统的选择原则:
少flash,大RAM,RAMdisk可能是最佳选择。RAMdisk上的文件系统是经过压缩的,通常压缩比比原生文件系统(CRAMFS和JFFS2)高很多,但是会使用较高的RAM。如果需要永久性存储,不适合使用RAMdisk。此外,RAM价格相对于flash要便宜,但是更耗电。
如果系统拥有稍微多一点的flash,或者会尽可能给实际在目标版上执行的应用程序保留RAM空间,而且可以为运行时解压缩出若干额外的CPU周期,那么CRAMFS是个非常好的选项。其压缩比低于RAM disk,但它的能力对大多数不需要永久存储性嵌入式的应用来说已经够了。
如果需要随时改变文件系统的任何部分,JFFS2将会是最好的选择。JFFS2会为垃圾回收功能维护空间,并且它的元数据的结构允许文件系统的写入操作,所以JFFS2可以提供断电可靠性和损耗平衡这两个对使用flash系统来说非常重要的特性。但是如果使用NAND形式的flash设备,便不适合使用JFFS2。
ARM Linux支持包括ARM7、ARM9、StrongARM等系列的ARM处理器,这些ARM处理器都带有内存管理单元MMU,对于不带内存管理单元的CPU,一般采用uClinux作为其操作系统。
略。
在存储设备中,SD卡及兼容SD卡协议的TF卡以其体积小、接口简单、成本低、性能好、安全性高等特点在嵌入式存储设备中占据了很大的市场份额。FAT文件格式以其兼容性好、应用广泛、安全性高、数据存储共享性好等优点被作为文件格式应用于嵌入式文件系统的涉及中。
μC/OS-II实时多任务操作系统内核。它被广泛应用于微处理器、微控制器和数字信号处理器。
略。
基于PowerPC构架下的MPC8379E处理器,分析了在Linux2.6内核的基础上制作Ext2根文件系统的全过程,并给出了烧写运行结果。根文件系统包含了一百多个常用Linux命令,囊括了必备的链接库文件,压缩后的烧写镜像只有2.3MB,可满足大部分系统的要求。
PowerPC是1991年,由Apple、IBM、Motorola3家公司组成的AIM联盟退出了一种精简指令集微处理器构架,具有优异的性能、较低的能量损耗以及较少的散热量。
使用busybox来制作根文件系统。原始大小为14.1M,经ext2压缩之后为2.3MB。
Linux操作系统设计的本意是用于桌面,它是一个通用的操作系统。但由于嵌入式系统使用环境的限制,嵌入式系统自身的一些特殊性能要求,包括不同程序的实时性、系统的体积、功能、可移植性、可裁剪性等方面的要求,是的开发嵌入式的Linux系统要做许多工作。
嵌入式Linux系统的实时性问题
Linux是分时系统。Linux分为用户态和内核态两种模式,进程运行在用户态时,如果实时进程具有高的优先级,可抢占进程;但如果运行在内核时,实时进程不能抢占进程。在定时器上,也有一些缺陷:(1) Linux周期模式定时器频率仅为100Hz,远不能满足多种实时应用的要求。(2)软定时由时钟定时器完成,当软定时器较多时,势必引起共享时钟定时器的冲突。此外,Linux进程采用多级轮转调度算法,一个进程在一个时间片内未完成,其优先级将降低。虽然给实时进程提供了较高的优先级,但是并没有加入时间限制。此外,大量的非实时进程也可能对实时进程造成阻塞。
嵌入式Linux系统的GUI支持问题
嵌入式GUI就是在嵌入式系统中为特定的硬件设备或环境而设计的图形用户界面系统。通常具有轻型、占用资源少、高性能、可配置的特点,一些较成熟的嵌入式GUI:Microwindows、MiniGUI、OpenGUI等。
嵌入式Linux系统的裁剪
两种方式:一是以一个已经安装好的系统为基础,删除掉不需要的文件,以减小整个系统的尺寸,而事实上这个方法几乎是行不通的。二是从零开始根据需要构建整个系统,一个个安装需要的软件包。
通常包含三个部分:Linux内核,根文件系统和引导器。
Kernel提供了一个操作系统的基本功能,如内存管理,进程调度,文件系统,网络等,以及设备驱动程序。
Root filesystem是存放运行、维护系统所必须的各种工具软件、库文件、脚本、配置文件和其他特殊文件(如设备节点)的地方,也可以安装各种软件包。通常根文件系统位于某个磁盘分区。
Boot Loader的任务是从引导设备装载内核,引导系统运行。Linux常见的有早期的LILO和近期的GRUB。
Linux系统移植主要包括bootloader的移植、内核移植、根文件系统的移植。
Linux系统大致有以下4中主要的裁剪技术。
(1)删除冗余文件。帮助文档、辅助程序、配置文件和数据模块等。
(2)共享库裁剪。嵌入式系统应用程序是有限的,共享库中可能有很多永远不会用到的冗余代码。
(3)采用具有通用功能的替代软件包。Linux上有许多具有相似功能的软件包,可以选择其中占存储空间较小的软件包并移植到嵌入式设备上。
(4)修改源码,包括重新配置、编译。去掉不需要的功能,重新配置内核等。
在 Linux 系统中,应用程序与库之间可以静态链接或动态链接。静态链接时,链接器从库中选取应用程序需要的代码,然后复制到生成的可执行文件中。显然,当静态库被多个程序使用时,磁盘上、内存中都是多份冗余拷贝。动态链接时,链接器并不真的把库代码复制到可执行文件中;仅当可执行文件运行时,加载器才检查该库是否已经被其它可执行文件加载进内存,如果内存中不存在才从磁盘上加载该库。这样多个应用程序就可以共享库中的代码的同一份拷贝,节约了存储空间。
共享库和可执行文件中都有若干个符号表,其中定义了一些外部符号,分为导出(export)符号和导入(import)符号这两种。导出符号是指在该文件中定义但可以被其它文件使用的符号,一般是可以由其它文件调用的函数;导入符号是指被该文件使用了但并没有定义的符号,一般是被该文件调用的函数,而且导入符号一般指明了定义该符号的共享库。
共享库中就可能存在永远不会被别的文件调用到的导出符号,将这些符号的相应代码从共享库中删除不会影响到系统的正常运行。
用nm、readelf 或 obidump 等工具可以读出二进制文件(共享库或应用程序或其中间目标文件)中的所有外部符号的信息。
查找ψ中可能被应用程序和其它共享库用到的导出(入)符号。查找提供这些符号的目标文件并重新链接成较小的共享库。重复前两步操作直到裁剪不能继续进行为止。
不足:首先,上述库裁
剪技术的粒度只达到了目标文件级,未被裁剪掉的目标文件中还是有不必要的导出符号及代码;其次由于库的源码编写没有规范的标准,造成裁剪难度加大;第三,不同体系结构需要有不同的裁剪处理。
内核裁剪方式有多种 ,有基于原内核提供的 kbuild 体系的裁剪方法 ,有基于代码分析的 linux 裁剪方法 ,有基于调用图的 linux裁剪方法。基于短开发周期的需求考虑 ,选择采用 kbuild 体系的裁剪方法。Kbuild 体系通过预定义一些变量(obj-m,obj-y)和目标 (bzImage),使内核的编译和扩展变得十分方便 ,具有很强的可定制性。
Y - 将该功能编译进内核 ;
N - 不将该功能编译进内核 ;
M - 将该功能编译成可以在需要时动态插入到内核中的模块 ;
略。
系统板存储器空间分配
在宿主机上制作一个4MB大小的randisk根文件系统,流程如下:
dd if=/dev/zero of=my_ramdisk bs=1k count=4096
/*创建一个大小为4MB的块,读写块大小为1kB,输入文件/dev/zero,输出文件my_ramdisk*/
mke2fs -vm0 my_ramdisk 4096 /*用mke2fs将my_ramdisk转换为4MB的ext2格式FS*/
mount -o loop my_randisk /mnt/my_ramdisk_directory
/*用mount将my_ramdisk挂载到/mnt/my_ramdisk_directory目录,该目录应先建好*/
gzip my_ramdisk /*压缩my_ramdisk,生成文件系统映像*/
函数调用关系图的原理是提取程序工作过程中的各函数之间的调用关系,进而直观的呈现出整个程序的函数关系结构,帮助我们更好的理解内核结构。将应用程序、系统库以及内核抽象出来,构造一个整体的函数调用关系结构图,然后根据这个关系图删除不必要的代码,最终所得到的将是面向应用的嵌入式Linux系统。
由于面向应用的裁剪方法主要是根据嵌入式系统初期所设计的具体应用目标,采用从上到下步步深入的代码分析的方法,从而能得到针对具体应用量体裁衣,按需裁剪,获得比较理想的裁剪率。在实际的嵌入式系统中,系统的应用范围在系统设计初期已经确定,而且以后更改的可能性比较小,因此可以采用面向应用的裁剪方法。
略。
嵌入式操作系统种类繁多,常见的使用广泛的有:嵌入式Linux、Windows CE、VxWorks、μC/OS-II、Palm OS等。
嵌入式Linux特点:源代码开放,技术支持强大。内核稳定可靠,裁剪后非常小,效率高,半年左右就有新的内核版本发行。uClinux是专为没有内存管理单元或虚拟内存的处理器而涉及的嵌入式操作系统。
Windows CE特点是模块化、结构化、与处理器无关、图形用户界面出色、基于Win32应用程序接口、产品开发较为容易等。
Vxworks是一款实时性很强的嵌入式操作系统,可靠性良好、用户开发环境友好、内核性能高、任务可裁剪。价格不菲。
μC/OS-II,用ANSI C编写了绝大部分源码,移植性强、支持8位、16位、32位处理器,源码开放,结构小巧,可裁剪,可固化,抢占式实时多任务等。
Palm OS,特点是强大的灵活性和移动性,性能稳定,设计简洁高效,应用程序丰富,操作系统接口开放。
目前关于Linux内核裁剪有三种方法:
(1)Linux自带的配置编译工具,可以使用该工具对Linux内核编译、定制。
(2)对内核源代码修改实现系统裁剪。
(3)以系统调用关系为基准对Linux内核进行裁剪。
根文件系统在传统PC机上挂载主要有两种方式,一种是Ramdisk加载,另一种是通过硬盘的直接挂载来实现。由于嵌入式系统资源有限,很多情况下都是通过Flash启动。嵌入式系统对根文件系统的加载主要通过两种方法来实现。一种实现途径是加载根文件系统到RAM的Ramdisk。开机启动时一部分内存会被Ramdisk虚拟称块设备,同时把压缩好的文件系统映像进行解压缩,最后存储在Ramdisk中。另一种实现途径是MTD驱动。嵌入式中很多系统,比如YAFFS、YAFFS2、Cramfs、JFFS2等都可以被安装称MTD块设备。Flash芯片驱动也在MTD中包含,这种驱动程序主要面对上层,实现读、写、擦除等相关操作,MTD负责封装这些操作,然后为用户层提供设备,设备的类型主要有MTD block和MTD char。
太旧,略。
本轮讲述了一个移植bootloader、kernel、root fs案例。类似其他论文。
大多数通用文件系统都是针对速度较慢的传统硬盘开发的,缓存技术需要耗费大量系统资源,而嵌入式系统本身的系统资源就比较有限;嵌入式系统应用场合一般比较恶劣,而通用文件系统的可靠性不足;NAND Flash的接口访问不同于传统硬盘,如使用通用文件系统无法保证NAND Flash的ECC校验与坏块管理机制的灵活性。
为了能增加NAND Flash使用寿命与缩短文件系统挂载时间,UBIFS应运而生。它具有损耗平衡、垃圾收集和坏块管理等机制。相比较早出现的YAFFS JFFS等,有优秀的启动速度,占用内存更少,在大容量NAND Flash应用上表现尤其突出。
JFFS2读写速度块,但是挂载速度慢。
Raw Flash与其他Flash的区别
UBI只能工作在Raw Flash上。UBI提供了基于MTD分区之上的卷分区与坏块管理、损耗均衡机制。UBIFS工作在UBI卷之上,无需关系MTD层与Flash层的操作。
UBIFS的异地更新机制。
UBIFS VS YAFFS2,启动时间快5s左右。
对于存在寿命问题的Flash存储介质来说,传统文件系统是不能直接使用的,必须增加Flash转换层FTL,但性能会收到FTL瓶颈的约束而大大降低。
当修改或新建的文件写入存储器时,传统文件系统在写入文件内容时,并没有同时写入文件的元数据(meta-data,与文件有关的信息,例如:权限、所有者以及创建和访问时间),而是等到有空的时候才写入。如果在写入文件的元数据是突然断电,会造成不一致,很多不一致,会导致很严重的后果。日志文件系统能很好的解决这个问题。日志文件系统用独立的日志文件跟踪磁盘内容的变化。在任何写入前,现将系统改动写入日志尾部,当断电时,只要检测日志尾部,就可以迅速回复整个系统,大大缩短了系统崩溃的恢复时间。日志文件系统主要分为两类:
(1)LogStructure日志文件系统:日志是整个系统的唯一结构,整个磁盘被看做一个大的日志文件,整个磁盘都由日志来管理,日志是文件系统在磁盘上的唯一代表,所有的写操作都在日志的尾部进行。日志可以扩展,每次磁盘块被修改后,它总要写往一个新的地址。这就意味着日志中的一些老的数据块变得过时,每隔一定的时间,清除程序会把它们回收,同时对这个磁盘的日志数据进行整理:清除所有的过时块,把有线的数据集中到日志的逻辑意义上的尾部,这样日志逻辑上的前部就能过被重新利用了。
(2)MetaData日志文件系统:仅仅记录元数据的修改。文件系统在磁盘上划分一块单独的区域,或者在文件系统内部制定一个特殊的文件来保存日志,把元数据的修改记录在日志的尾部。
NTFS文件系统重要特性:
(1)通用索引功能:文件可以建立关于任何属性的索引。
(2)大磁盘和大文件:更有效地支持非常大的磁盘和非常大的文件。
(3)多数据流:文件的实际内容被当作字节流来处理。
(4)可恢复性:当发送故障时,NTFS能重建文件卷,并返回到一致的状态。NTFS还会对重要的系统数据进行冗余存储。
(5)安全性:使用Windows对象模型来实施安全机制。
REFS是一种针对NAND Flash存储介质涉及的嵌入式文件,负责对嵌入式系统中的Flash存储器空间进行有效的组织和管理,并对用户或进程提供以文件为对象的操作方法函数。
(1)具有损耗平衡特性
(2)文件读写符合NAND Flash的页读写和块擦除特点
(3)坏块管理能力
(4)具有恢复文件和系统自我修复能力,提高可靠性
(5)具有良好的时间性能
(6)具有可移植和可扩展性能。
略。
略。
Flash存储器的优点:
(1)读性能的一致,无寻道和旋转操作下,使随机读性能与顺序读性能几乎一致;
(2)与含有机械组成的磁盘相比,Flash存储器的读、写延迟明显降低;
(3)高可靠性,平均无故时间比磁盘长一个数量级;
(4)低能耗,单位时间内能量消耗明显低于RAM和磁盘存储器。
略。
从软件的角度看,嵌入式Linux一般由Linux内核、文件系统、应用程序三个部分组成。因此现有的Linux的裁剪主要包括三个方面:内核的裁剪、Linux库裁剪、应用程序的裁剪。
内核裁剪:见上面所提。
库裁剪:可利用uClibc构建嵌入式Linux系统比glibc占用更小的空间。
应用程序的裁剪(shell),一般使用BusyBox来代替shell程序,大大减小系统的体积。
文章对现有的GNU libc裁剪原理进行较细致的分析,设计了新的GNU libc裁剪方案。
略。
略。
标签:
原文地址:http://blog.csdn.net/fickyou/article/details/51328750