您好,欢迎访问三七文档
嵌入式操作系统—根文件系统的建立李春杰参考书:BuildingEmbeddedLinuxSystemsByKarimYaghmour,Publisher:O'Reilly,April2003主要内容根文件系统的内容及其准备根文件系统的目录架构及其建立为目标系统准备链接库准备内核模块和内核映像为目标系统建立设备文件应用程序定制应用程序准备系统初始化文件根文件系统类型的选择根文件系统的类型及制作主要内容根文件系统的内容及其准备根文件系统的目录架构及其建立为目标系统准备链接库准备内核模块和内核映像为目标系统建立设备文件应用程序定制应用程序准备系统初始化文件根文件系统类型的选择根文件系统的类型及制作根文件系统的制作根文件系统的目录架构Linux内核在系统启动期间进行的最后操作之一就是安装根文件系统。根文件系统一直都是所有类UNIX系统不可或缺的组件根文件系统的顶层目录各有其特殊的用法和目的。其中一部分往往与多用户有关在嵌入式系统中,这一部分是不必要的建立根文件系统首先为多用户提供的可扩展环境的所有目录都应该省略/home,/mnt,/opt,/root甚至可以不要/tmp和/var,这要根据实际情况确定根据引导加载程序和它的配置情况,决定是否需要/boot下列几个是比较重要的/bin,/dev,/etc,/lib,/proc,/sbin,/usr/usr和/var这两个顶层目录与根目录非常像,有自己的目录结构容易混淆的几个目录/bin,/sbin,/usr/bin,/usr/sbin普通用户和超级用户都比较有用的命令放在/bin下普通用户不使用,只有超级用户比较有用的命令放在/sbin下不常用的用户命令放在/usr/bin下不常用的超级用户命令放在/usr/sbin下容易混淆的几个目录/lib,/usr/lib系统启动需要的以及上述比较有用的命令所需要的库文件通常放在/lib下所有其他的库文件一般都放在/usr/lib下,有的软件包会在/usr/lib下为自己所需的库文件建立一个专门的目录例如Perl5.x安装完后,会产生一个/usr/lib/perl5目录设置根文件系统的目录骨架1、建立顶层目录2、建立/usr和/var的目录结构根文件系统内容包括:链接库:glibc、uClibc内核模块设备文件系统应用程序系统初始化文件内核映像文件系统上是否有内核映像与引导加载程序有关为目标系统准备链接库链接库:glibc、uClibcglibcglibc套件包含若干链接库,包含的链接库会安装根文件系统的/lib目录下。主要包含4种类型的文件(1)实际的共享链接库,文件名为libLIBRARYNAME-GLIBCVERSION.so例如glibc2.5的数学链接库为libm-2.5.so(2)主修订版本的符号链接,文件名为libLIBRARYNAME.so.MAJORREVISIONVERSION例如实际的数学链接库libm-2.5.so,其符号连接的名称为libm.so.6glibc(3)与版本无关的符号链接指向主修订版本的符号链接,用于为需要链接特定链接库的所有程序提供一个通用的条目,与主修订版本号或glibc涉及的版本无关。文件名为libLiBRARYNAME.so,例如libm.so指向libm.so.6,libm.so.6指向实际的共享链接库libm-2.2.3.so(4)静态链接库包文件,文件名格式为libLIBRARYNAME.a,如动态装载库libdl的静态包文件就是libdl.aglibc我们只需前两种。其余的文件只有在链接执行文件时才会用到,执行应用程序时不需要glibc除了链接库文件,还需要复制动态链接器及其符号连接动态链接器的文件名,通常叫做ld-GLIBCVERSION.so动态链接器的符号链接对于i386、arm或m68k,通常为ld-linux.so.MAJORREVISIONVERSION对于MIPS或PPC,则通常为ld.so.MAJORREVISIONVERSION在向目标板的根文件系统实际复制任何glibc组件前,应先找出应用程序需要哪些glibc组件。可以使用ldd命令显示在主机上运行的文件所依赖的库但是,对将要运行在目标端的命令,ldd可能不行,此时最好使用交叉编译环境提供的相关命令如readelf命令uClibcuClibc是glibc的替代品,实现了部分必要的链接库。网站:若下载的是源代码,则makecleanmakeconfigmakeCROSS=arm-linux-makePREFIX=根文件系统目录install若下载的是已经编译好的,则需要将库文件拷贝到根文件系统目录下的lib目录中若只拷贝需要的库文件,则需要采用类似glibc的方法找出目标板所依赖的uClibc准备内核模块和内核映像为目标系统准备内核模块如果已经建立好内核模块,就将它们复制到目标板的/lib目录里此处要完整的复制文件属性及连接采用cp–a命令为目标系统准备内核映像这与引导加载程序的能力和配置有关如果设置成从根文件系统启动内核,就要将内核映像复制到目标板的根文件系统的/boot目录下(操作示意如下)为目标系统建立设备文件在Linux根文件系统中,所有的设备文件都放在/dev目录里,下面列出了一些最基本的/dev条目文件名说明类型主设备号次设备号权限位mem物理内存存取字符11600nullnull设备字符13666zero以0值字节为数据来源字符15666random随机数产生器字符18644tty0当前的虚拟控制台字符40600tty1第一个虚拟控制台字符41600ttyS0第一个UART串行端口字符464600tty当前的tty设备字符50666console系统控制台字符51600为目标系统建立设备文件可以使用如下的命令建立上表中的几个条目(需要root权限)为目标系统建立设备文件(完成)此外,/dev目录下还包含若干必要的符号链接,如fd/proc/self/fdstdinfd/0stdoutfd/1stderrfd/2使用ln-s命令建立这些连接应用程序Linux拥有丰富的命令,但是嵌入式Linux并不需要这么多的命令有两种方法:选择少量有用的Linux命令尽可能包含多的命令,但是对命令的功能进行裁减对于后者,介绍1个有用的套件BusyBoxBusyBox:BusyBox目前由DenysVlasenko来维护网站:下载:它把许多常见应用程序缩微版本组合到一个单独的小巧的可执行程序中,一般含有比较少的选项,更小的体积,不过所包含的这些选项能够提供用户所需要的大部分功能。能够为任何一个小型或嵌入式系统提供一个相当完整的环境提供相当程度的模块化功能,很容易为目标板定制在busybox的网站上,称busybox:combinestinyversionsofmanycommonUNIXutilitiesintoasinglesmallexecutable.可以取代GNUfileutils,shellutils,etc.havefeweroptionsthantheirfull-featuredGNUcousinsprovidesafairlycompleteenvironmentforanysmallorembeddedsystemBusyBoxhasbeenwrittenwithsize-optimizationandlimitedresourcesinmind模块化、易定制Busybox的安装与运行1下载busybox-1.10.1.tar.bz2解压缩tarjvxfbusybox-1.10.1.tar.bz2阅读INSTALL文件。使用makehelp可以看到完整的配置和安装选项Busybox的安装与运行2常规的配置和安装简单的配置和安装在指定目录安装makePREFIX=DIRinstall缺省为针对i386编译若针对arm,则要指明ARCH和CROSS_COMPILE(指令示例如下)经实验,针对arm,使用allnoconfig,ok若使用defconfig,则会发生错误,需要配合menuconfig把发生错误的模块禁止makeinstallBusybox的安装与运行3对于针对i386平台的busybox,可以运行./busyboxash进入busybox的shell界面对于arm的,要运行在相应的平台上定制应用程序自己的应用程序也要放在根文件系统的某个目录下,这取决于应用程序所拥有的组件数量和类型如果二进制文件较少,可以考虑放到/bin目录下如果二进制文件多且复杂并且包含一些数据文件,最好在根文件系统中增加一个单独的目录,例如/project第二种情况下,通常需要设置PATH环境变量,以便能够找到可执行文件修改.bashrc,添加exportInit进程启动各种应用程序(根据相关启动脚本设置)Init进程首先进行一系列的硬件初始化,并挂载根文件系统。最后init进程会执行用户传递过来的“init=”启动参数执行用户指定的命令,或者执行以下几个进程之一,由内核态变为用户态:execve(/sbin/init,argv_init,envp_init);execve(/etc/init,argv_init,envp_init);execve(/bin/init,argv_init,envp_init);execve(/bin/sh,argv_init,envp_init)。准备系统初始化文件系统初始化也是Unix系统很重要的一部分,正如我们之前所说,内核的最后一部初始化操作为启动init进程,这个程序负责创建一些其他进程并且启动系统的一些关键组件运行Init可以看成是所有进程的父亲在Linux中,init进程模仿了SystemV的init,这对于嵌入式Linux而言,功能太强大我们将介绍标准的systemV初始化BusyBox初始化关于init的进一步说明事实上,内核并不关心init进程是哪一个,init进程只不过代表了内核在初始化完成后要启动应用程序我们可以修改启动参数让内核使用我们自己的initinit=PATH_TO_YOUR_INIT缺点在于,这样只能启动我们自己的应用程序,如果有必要还需要承担标准init的一部分工作,例如启动其他必要的系统组件更进一步,当我们的程序出现异常时,可能导致整个系统的关闭或者重启。在有的情况下,这就是系统所希望的,但在大多数情况下,这样做是无用的。因此,比较安全的方法就是使用一个真正的init程序标准的systemV初始化BUSYBOX初始化标准的systemV初始化1标准的init包在多数Linux发行版本中都能找到,也可以在上找到,目前由MiquelvanSoorenburg维护包含的命令有:halt,init,killall5,last,mesg,runlevel,shutdown,sulogin,utmpdump,以及wall标准的systemV初始化2下载到源码之后,首先解压缩,然后使用交叉编译器编译makeCC=arm-linux-gcc安装到根文件系统中makeBIN_OWNER=“$(id–un)”BIN_GROUP=“$(id–gn)”ROOT=根文件系统目录install--------then运行起来了由于我们使用当前用户权限,而Makefile默认使用root权限,因此可能
本文标题:7嵌入式操作系统8
链接地址:https://www.777doc.com/doc-3152603 .html