版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章嵌入式Linux的构建2主要内容4.1嵌入式Bootloader技术4.2嵌入式根文件系统构建4.3Linux内核及启动流程4.4基于ARM目标板的Linux系统及应用程序烧定建立交叉编译环境启动代码Bootloader的实现/移植kernel的配置/移植/编译根文件系统Cramfs的实现嵌入式开发流程44.1嵌入式BootLoader技术Bootloader的概念Bootloader引导程序Vivi简介Vivi代码分析5Bootloader的概念BootLoader称为引导加载程序,是嵌入式系统加电后运行的第一段代码,相当于PC机的BIOS。也就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
通常,BootLoader是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的BootLoader几乎是不可能的。尽管如此,我们仍然可以对BootLoader归纳出一些通用的概念来,以指导用户特定的BootLoader设计与实现。引导加载程序可以初始化硬件设备、建立内存空间的映射图6嵌入式系统离不开Bootloader
每种CPU体系结构都有不同的BootLoader。
有些BootLoader也支持多种体系结构的CPU,比如U-Boot就同时支持ARM体系结构和MIPS体系结构。
除了依赖于CPU的体系结构外,BootLoader实际上也依赖于具体的嵌入式板级设备的配置。这也就是说,对于两块不同的嵌入式板而言,即使它们是基于同一种CPU而构建的,要想让运行在一块板子上的BootLoader程序也能运行在另一块板子上,通常也都需要修改BootLoader的源程序。7BootLoader的安装媒介
系统加电或复位后,所有的CPU通常都从某个由CPU制造商预先安排的地址上取指令。比如,基于ARM7TDMIcore的CPU在复位时通常都从地址0x00000000取它的第一条指令。
基于CPU构建的嵌入式系统通常都有某种类型的固态存储设备(比如:ROM、EEPROM或FLASH等)被映射到这个预先安排的地址上。因此在系统加电后,CPU将首先执行BootLoader程序。8典型存储空间分配结构bootloader启动参数内核根文件系统9Bootloader空间结构划分10控制BootLoader的设备或机制
主机和目标机之间一般通过串口建立连接,BootLoader软件在执行时通常会通过串口来进行I/O,比如:输出打印信息到串口,从串口读取用户控制字符等。11BootLoader的操作模式
大多数BootLoader都包含两种不同的操作模式:“启动加载”模式和“下载”模式,这种区别仅对于开发人员才有意义。
最终用户的角度看,BootLoader的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。12启动加载模式
也称为“自主”(Autonomous)模式。也即BootLoader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。这种模式是BootLoader的正常工作模式,因此在嵌入式产品发布的时侯,BootLoader显然必须工作在这种模式下。13下载模式
在这种模式下,目标机上的BootLoader将通过串口连接或网络连接等通信手段从主机下载文件,比如:下载内核映像和根文件系统映像等。从主机下载的文件通常首先被BootLoader保存到目标机的RAM中,然后再被BootLoader写到目标机上的FLASH类固态存储设备中。BootLoader的这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用BootLoader的这种工作模式。工作于这种模式下的BootLoader通常都会向它的终端用户提供一个简单的命令行接口。14下载模式
像vivi、RedBoot或U-Boot等功能强大的Bootloader通常都可同时支持这两种工作模式,而且允许用户在这两种工作模式之间进行切换。
比如,RedBoot在启动时处于正常的启动加载模式,但是它会延时3秒等待终端用户按下任意键而将RedBoot切换到下载模式。如在等待时间内没有接收到用户按键,则继续启动Linux内核。15BootLoader与主机如何通信?
最常见的情况就是,目标机上的BootLoader通过串口与主机之间进行文件传输,传输协议通常是xmodem/ymodem/zmodem协议中的一种。
但是,串口传输的速度比较慢,因此通过以太网连接并借助TFTP协议来下载文件是个更好的选择。16BootLoader启动过程
大多数BootLoader都分为stage1和stage2两大部分。
依赖于CPU体系结构的代码,比如设备初始化代码等,通常都放在stage1
中,而且通常都用汇编语言来实现,以达到短小精悍的目的。
而stage2则通常用C语言来实现,这样可以实现复杂的功能,而且代码会具有更好的可读性和可移植性。17Stage1
通常包括以下步骤(以执行的先后顺序):硬件设备初始化(如屏蔽中断,设置CPU时钟频率等)。为加载BootLoader的stage2准备RAM空间。拷贝BootLoader的stage2到RAM空间中。设置好堆栈。跳转到stage2的C入口点。18硬件设备初始化屏蔽所有的中断
为中断提供服务通常是OS设备驱动程序的责任,因此在BootLoader的执行全过程中可以不必响应任何中断。中断屏蔽可以通过写CPU的中断屏蔽寄存器或状态寄存器(比如ARM的CPSR寄存器)来完成。设置CPU的速度和时钟频率RAM初始化
包括正确地设置系统的内存控制器的功能寄存器以及各内存库控制寄存器等。初始化LED
典型地,通过GPIO来驱动LED,其目的是表明系统的状态是OK还是Error。如果板子上没有LED,那么也可以通过初始化UART向串口打印BootLoader的Logo字符信息来完成这一点。关闭CPU内部指令/数据cache19为加载stage2准备RAM空间
由于stage2通常是C语言执行代码,因此在考虑空间大小时,除了stage2可执行映象的大小外,还必须把堆栈空间也考虑进来。
空间大小最好是内存页大小(通常是4KB)的倍数。
一般而言,1M的RAM空间已经足够了。
具体的地址范围可以任意安排。但是,将stage2安排到整个RAM空间的最顶1MB(也即
(RamEnd-1MB)-RamEnd)是一种值得推荐的方法20拷贝stage2到RAM中需要考虑:stage2的可执行映象在固态存储设备的存放起始地址和终止地址;RAM空间的起始地址。21设置堆栈指针堆栈指针的设置是为了执行C语言代码作好准备。22跳转到stage2的C入口点23Stage2通常包括以下步骤(以执行的先后顺序):初始化本阶段要使用到的硬件设备。检测系统内存映射(memorymap)。将kernel映像和根文件系统映像从flash上读到RAM空间中。为内核设置启动参数。调用内核。24Stage2stage2的代码通常用C语言来实现,以便于实现更复杂的功能和取得更好的代码可读性和可移植性。
但是与普通C语言应用程序不同的是,在编译和链接bootloader这样的程序时,不能使用glibc库中任何支持函数。25Stage2--初始化本阶段要使用到的硬件设备初始化至少一个串口,以便和终端用户进行I/O输出信息初始化计时器等。设备初始化完成后,可以输出一些打印信息,程序名字字符串、版本号等。26Stage2--检测系统的内存映射内存映射就是指在整个4GB物理地址空间中有哪些地址范围被分配用来寻址系统的RAM单元。通常CPU预留一大段足够的地址空间给系统的RAM嵌入式系统却不一定实现CPU预留的全部RAM空间,即嵌入式系统往往只把CPU预留的全部RAM地址空间中的一部分映射到RAM空间,而让剩余部分处于未使用状态。如S3C2410使用的RAM空间为0x30000000-0x33ffffff。27地址空间描述Typedefstructmemory_area_struct{u32 start;/*thebaseaddressofthememoryregion*/u32 size;/*thebytenumberofthememoryregion*/int used;}memory_area_t;Used=1说明某段地址被使用Used=0说明某段地址并未被使用28Stage2--加载内核映像和根文件系统映像规划内存占用的布局内核映象所占用的内存范围一般将其拷贝到(MEM_START+0x8000)地址开始的大约1MB大小的空间,内核一般小于1M根文件系统所占用的内存范围一般将其拷贝到(MEM_START+0x0010,0000)地址开始的地方29Stage2--加载内核映像和根文件系统映像从flash上拷贝ARMCPU一般从统一的内存地址空间寻址flash等固态存储设备,从flash上读取和从RAM中读取方式相同。示例:While(count){*dest++=*src++;/*theyareallalignedwiththewordboundary*/count-=4;/*bytenumber*/}30Stage2--设置内核的启动参数Linux2.4.x之后的内核都采用标记列表(taggedlist)的形式来传递启动参数启动参数标记列表以标记ATAG_CORE开始,以标记ATAG_NONE结束数据结构tag以及tag_header在linux的源码Include/asm/setup.h中定义31Setup.h/*thelistendwithanATAG_NONEnode*/#defineATAG_NONE0x00000000Structtag_header{u32size;/*size以字数为单位*/u32tag;}32TagStructtag{structtag_headerhdr;union{structtag_core core;structtag_mem32 mem;structtag_videotext
videotext;……structtag_cmdline cmdline;}}33需要设置的tag嵌入式Linux系统中,通常需要bootloader设置的常见启动参数有:ATAG_CORE,ATAG_MEM,ATAG_CMDLINE,ATAG_RAMDISK,ATAG_INITRD34Tag举例ATAG_RAMDISK示例Params->hdr.tag=ATAG_RAMDISK;Params->hdr.size=tag_size(tag_ramdisk);Params->u.ramdisk.start=0;Params->u.ramdisk.size=RAMDISK_SIZE;Params->u.ramdisk.flags=1;ATAG_NONE示例Staticvoidsetup_end_tag(void){Params->hdr.tag=ATAG_NONE;Params->hdr.size=0;}35调用内核Bootloader调用内核的方法是直接跳转到内核第一条指令处。对于ARMLinux,在跳转之前必须满足下列条件CPU寄存器的设置R0=0R1=机器类型IDR2=启动参数标记列表在RAM中的起始地址CPU模式必须禁止中断(IRQ与FIQ)CPU必须为SVC模式Cache和MMU的设置MMU必须关闭数据Cache必须关闭36嵌入式系统Bootloader1、vivi vivi是韩国Mizi公司开发的Bootloader,适用于ARM9处理器。2、RedBootRedBoot也称作红帽(RedHat)嵌入式调试引导程序,是一种用于嵌入式系统的独立开放源代码引导/装载器。3、U-BootU-Boot(UniversalBootloader)是一款目前功能较为强大的开源Bootloader程序,它支持多种处理器平台,包括ARM、MIPS等。37vivi简介vivi是由韩国mizi公司为ARM处理器系列设计的一个bootloader。它同样支持启动加载模式和下载工作模式。在下载模式下,vivi为用户提供一个命令行人机接口,通过这个人机接口可以使用vivi提供的一些命令。如果嵌入式系统没有键盘和显示,那么可以利用vivi中的串口,将其和宿主机连接起来,利用宿主机中的串口软件(如windows中的超级终端或者Linux中的minicom)来控制。38VIVI有如下作用:把内核(kernel)从flash复制到RAM,然后启动它;初始化硬件;下载程序并写入flash(通常由串口或者网口先把内核下载到RAM中,然后写入flash);检测目标板(bootloader会有一些简单的代码用以测试目标板硬件的好坏)。vivi简介39VIVI的命令(1)load命令将二进制文件载入到Flash或者RAM,命令格式:load<media_type>[<partname>|<addr><size>]<x|y|z>其中命令行参数<media_type>描述装载位置,有flash和ram两种选项;参数[<partname>]或[<addr><size>]描述装载的地址,如果有已经定义的mtd分区信息,可以只输入分区名称,否则需要指定地址和大小;参数<x|y|z>确定文件的传输协议,常采用的选项“x”用来指定采用xmodem协议。40例如:vivi>loadflashkernelx
装载压缩映像文件zImage到flash存储器中,地址是kernel分区,并采用xmodem传输协议。也可以指定地址和大小,例如:vivi>loadflash0x800000xc0000x。41(2)part命令操作MTD分区信息,比如,显示、增加、删除、复位、保存MTD分区等。partshow:显示mtd分区信息。partadd<name><offset><size><flag>:增加新的mtd分区,其中<name>为新mtd分区名称,<offset>是mtd器件的偏移,<size>表示mtd分区的大小,<flag>表示分区类型,可选项有JFFS2、LOCKED和BONFS。partdel<partname>:删除一个mtd分区。partreset:恢复mtd分区为默认值。partsave:在flash中永久保存参数值和分区信息。42(3)param命令用来设置或者察看参数。例如:改变引导程序启动的时间,使用vivi>paramsetboot_delay100000实现。43(4)boot命令用来引导存储在flash存储器或者ram中的linux内核。命令格式:boot<media_type>[<partname>|<addr><size>]参数<media_type>设定存储linux内核映像的位置,可选项有ram、nor和smc。参数[<partname>]或[<addr><size>]描述存储内核的地址,如果有提前定义的mtd分区信息,可以只输入分区名称,否则需要指定地址和大小。例如:vivi>bootnor0x80000表示从flash存储器中读出linux内核,偏移是0x80000。44(5)flash命令存储器管理命令
例如:flasherase[<partname>|<offset><size>]表示擦除flash存储器。45如何进入vivi界面1、进行硬件连接连接电源,将5V电源线的连到UP-NETARM2410-S的电源接口;连接串口线,一端连接PC的串口,另一端连接到UP-NETARM2410-S的串口(上面的);连接网线,将随机附带的交叉网线把UP-NETARM2410-S靠近于电源接口的网口和PC机的网口连接好。如何进入vivi界面2、进入宿主机中的串口软件:windows中的超级终端/Linux中的minicom运行Windows系统下(以WindowsXP为例)开始→所有程序→附件→通讯→超级终端(HyperTerminal)。请大家注意:在windowsxp操作系统下,当初次建立超级终端的时候,会出现如下对话框,请在□中打上√,并选择“否”如何进入vivi界面新建一个通信终端。如果要求输入区号、电话号码等信息请随意输入,出现如图5.2.1所示对话框时,为所建超级终端取名为arm,可以为其选一个图标。单击“确定”按钮。图5.2.1创建超级终端如何进入vivi界面选择ARM开发平台实际连接的PC机串口(如COM1),按确定后出现如图5.2.2所示的属性对话框,设置通信的格式和协议。这里波特率为115200,数据位8,无奇偶校验,停止位1,无数据流控制。图5.2.2设置串行口如何进入vivi界面完成新建超级终端的设置以后,可以选择超级终端文件菜单中的另存为,把设置好的超级终端保存在桌面上,以备后用。用串口线将PC机串口和平台正确连接后,就可以在超级终端上看到程序输出的信息了.如何进入vivi界面3、打开电源开关,系统会由VIVI开始引导。正常启动时会显示启动信息到“PressReturntostarttheLINUXnow,anyotherkeyforvivi”,不进行任何操作等待30S或按回车则启动进入linux系统,按除回车键外的其它键则进入vivi控制台,如图5.3.1。在这里输入“boot”,进入LINUX系统;输入“bootucos”进入ucos系统。图5.3.1vivi控制台输入“boot”后会引导kernel,启动linux系统,见5.3.2.
在该应用程序目录下,可以挂载nfs文件系统,通过“ls”查看应用程序53
vivi的文件结构
vivi包括下面几个目录:(1)arch:此目录包括了所有VIVI支持的目标板的子目录,本书附带的代码中只包含S3C2410X。(2)Documentation:存放了许多文档,包括VIVI使用指南。(3)drivers:其中包括了引导内核所需的MTD设备和串口驱动程序(目标板的各种设备驱动程序)。MTD目录下分maps、nand和nor三个目录,实现对NandFlash和NorFlash的读写控制。Serial目录下的文件实现对串口的控制,并支持xmodem和ymodem协议。54(4)include:头文件的公共目录,其中的S3C2410.h定义了处理器的一些寄存器,以及NANDFlash的一些寄存器等。Platform/smdk2410.h定义了与目标板相关的资源配置参数,修改波特率、引导参数和物理内存映射等参数即可配置目标板。(5)init:此目录只有main.c和version.c两个文件。与普通的C程序一样,VIVI将从main函数开始执行(vivi第二阶段的入口函数),main函数调用lib下的函数实现第二阶段工作。(6)lib:一些平台公共的接口代码,比如,time.c里的udelay()和mdelay(),第二阶段的初始化代码和vivi常用命令的实现。(7)scripts:此目录存放了配置所需的脚本文件,如Menuconfig和Configure文件,以方便对VIVI的配置。(8)test:存放一些测试代码文件。(9)util:存放与NANDFlash烧写image相关的工具实现代码55vivi的配置和编译 vivi的配置和嵌入式Linux内核一样,可以采用菜单化的形式进行。其步骤主要如下: ①#makedistclean。清除一些早先生成的无用的目标文件。 ②#makemenuconfig。然后可以根据菜单中的信息进行配置。 ③#make命令开始编译。菜单配置完毕后,保存退出,然后用make命令编译。
56vivi代码分析 vivi的第一阶段主要完成了依赖于CPU的体系结构硬件初始化,包括禁止中断、初始化串口、复制第二阶段到RAM中等。由于这些代码是和硬件紧密相关的,因此要求大家在阅读时需要对照S3C2410处理器的数据手册,查阅相关的寄存器的描述,以便更好地理解。这些汇编代码全部就集中在vivi\arch\s3c2410目录下的head.S这一个汇编文件中,当然还有相关的头文件。vivi的第二阶段的入口就是init/main.c,按照源代码的组织流程,根据模块化划分的原则,共分为8个功能模块即八个步骤,在源代码的注释中以step非常清晰的给出了区分。第一步:vivi从main()函数开始执行,函数开始通过putstr(vivi_bannner)打印出vivi的版本。第二步:对开发板初始化board_init函数,主要完成时钟初始化(init_time())和通用I/O口设置(set_gpios()),在/arch/s3c2410/smdk.c中vivi代码分析58第三步:进行内存映射初始化和内存管理单元(MMU)的初始化工作,在mmu.c文件中。第四步:初始化堆,函数heap_init()定义在\lib\heap.c文件中。第五步:初始化mtd设备,用mtd_dev_init()函数第六步:配置参数,主要是init_priv_data函数。第七步:提供vivi人机接口的各种命令。第八步:进入Bootloader的两种模式之一。vivi代码分析Bootloader(vivi)的烧写和使用linux系统的移植主要包括四个部分:烧写2410-Slinux
操作系统包括烧写vivi,kernel,root三个步骤,除此我们还要烧写yaffs.tar,这四个文件为:vivi----linux操作系统启动的bootloader;zImage----linux操作系统内核;root.cramfs----根文件系统;yaffs.tar----应用程序烧写Vivi既可通串口烧写也可通过jtag来烧写;zImage和root.cramfs通过串口来烧写;应用程序压缩包通过网口来下载。Bootloader(vivi)的烧写vivi的烧写有两种方式:通过JTAG口烧写和通过串口烧写。
在Flash被格式化且内存里也没有Bootloader的时候,此时目标板是一个完全干净的开发板,就需要通过JTAG口把Bootloader烧写到板子上串口烧写主要用于更新和升级Bootloader。在Windows下可以通过超级终端来访问目标板来进行烧写,在Linux下可以通过MiniCom烧写。板子上没有任何东西(包括BootLoader)的时候,需要专门的工具对vivi等BootLoader进行烧写Bootloader-举例手册第9-19页板子上有诸如vivi等BootLoader后,再进行升级,就可以利用Target上已经存在的(旧的)BootLoader了Bootloader-举例4.3.2Bootloader的使用工作正常的时候,Bootloader处于加载模式或者交互模式如使用vivi的时候,其交互模式的界面是利用vivi升级内核Bootloader-举例利用vivi升级文件系统Bootloader-举例674.3Linux内核及启动过程Linux内核结构Linux内核配置、编译Linux内核移植68Linux系统实际上由两个比较独立的部分组成,即内核部分和系统部分(根文件系统)。启动时,首先由BootLoader程序将Linux部分内核调入内存,并将控制权交给内存中Linux内核的第一行代码。然后Linux将自己的剩余部分全部加载到内存、初始化所有的设备、在内存中建立好所需的数据结构(有关进程、设备、内存等)。此时内核已经控制了所有硬件设备,内核加载完成。至于操作和使用这些硬件设备,则是系统部分任务。内核部分初始化并控制大部分硬件设备,为内存管理、进程管理、设备读、写等工作做好一切准备;系统部分加载必需的设备,配置各种环境以便用户可以使用整个系统。69Linux内核主要由五个子系统组成:进程调度,内存管理,虚拟文件系统,网络接口,进程间通信。进程调度(SCHED):控制进程对CPU的访问。Linux使用比较简单的基于优先级的进程调度算法选择新的进程。内存管理(MM):允许多个进程安全地共享主内存区域。Linux的内存管理支持虚拟内存。虚拟文件系统(VirtualFileSystem,VFS):隐藏了各种硬件的具体细节,为所有的设备提供了统一的接口,VFS提供了多达数十种不同的文件系统。(分为逻辑文件系统和设备驱动程序)网络接口(NET):提供了对各种网络标准的存取和各种网络硬件的支持(网络协议和网络驱动程序)。进程间通讯(IPC):支持进程间各种通信机制。Linux内核结构Linux内核结构-Linux源码位置71Linux内核目录结构/include子目录包含了建立内核代码时所需的大部分包含文件,这个模块利用其他模块重建内核。/init子目录包含了内核的初始化代码,这是内核工作的开始的起点。/arch子目录包含了所有硬件结构特定的内核代码。如:arm、i386、alpha。/drivers子目录包含了内核中所有的设备驱动程序,如块设备和SCSI设备。/fs子目录包含了所有的文件系统的代码,如:ext2,vfat等。/net子目录包含了内核的连网代码。/mm子目录包含了所有内存管理代码。/ipc子目录包含了进程间通信代码。/kernel子目录包含了主内核代码。Linux内核结构72Linux内核配置系统的组成Makefile(顶层Makefile和子目录下的Makefile)配置文件.config文件,包含由用户选择的配置选项,用来存放内核配置后的结果。Rules.make:规则文件,被所有的Makefile使用。配置工具基于字符的界面make
config:进入命令行,可以一行一行的配置,但使用不十分方便。基于
Ncurses
的文本模式图形用户界面make
menuconfig:大多数开发人员使用的Linux内核编译菜单,使用方便。基于
Xwindows
图形界面的用户配置界面make
xconfig:在2.4.X以及以前版本中xconfig菜单是基于TCL/TK的图形库的。Linux内核配置(裁剪)、编译Makemenuconfig的图形配置界面74Linux内核配置与裁减下载Linux内核源码到/usr/src目录下 解压该文件进入/usr/src/linux-2.x.xx目录,执行makemenuconfig命令就可以进入配置界面。在启动配置菜单后,选择相应的配置时,有三种选择方式,它们分别代表的含义如下。N——不将该功能编译进内核Y——将该功能编译进内核M——将该功能编译成可以在需要时动态插入到内核中的模块Linux内核配置编译75Linux内核编译
在完成内核的裁减之后,内核的编译就只要执行以下几条命令:makedep:对内核原代码的文件进行完整性和依赖性进行检验,确保关键文件在正确的位置。makeclean:编译内核之前先把环境给清理干净。有时也可用makerealclean或makemrproper来彻底清除相关依赖,保证没有不正确的.o文件存在。makezImage:创建内核镜像文件makemodules:创建内核模块,若不创建内核模块,这步可以不要。Linux内核配置编译76Linux移植 Linux移植其实质是获取某一版本的Linux内核源码,根据具体目标平台对这源码进行必要的改写(主要是修改体系结构相关部分),然后添加一些外设的驱动,打造一款适合于目标平台的新操作系统,对该系统进行针对目标平台的交叉编译,生成一个内核映象文件,最后通过一些手段把该映象文件烧写(安装)到目标平台中。交叉编译环境的搭建修改Linux内核源码 linux的移植主要包含启动代码的修改,内核的链接及装入,参数传递,内核引导几个部分。基于ARM目标板的Linux内核配置裁减与编译基于ARM开发板的Linux内核移植774.4Linux内核及启动过程JTAG烧写vivi串口下载烧写应用程序下载到目标板78 UP-NETARM2410-S操作系统由vivi(bootloader)、zImage(Linux内核映象)、root.cramfs(根文件系统映象)三部分组成,vivi即可通串口烧写也可通过jtag来烧写,zImage和root.cramfs通过串口来烧写,应用程序压缩包通过网口来下载。 JTAG烧写,适用于flash空白或者vivi损坏无法引导的情况下,通过并口线和Jtag简易仿真器,用sjf2410-s.exe将vivi烧写到flash中作为引导启动程序。
串口通讯下载,是最常用的烧写方式,即在核心模块上已烧录有vivi的前提下进入vivi,通过在SDRAM中运行的vivi格式化flash,烧写vivi、内核和根文件系统,最后把应用程序压缩包yaffs.tar.bz2通过网口下载到Linux系统的/var目录下,然后解压到/mnt/yaffs下。794.2嵌入式Linux根文件系统构建Linux文件系统介绍根文件系统的目录结构BusyBox生成工具集根文件系统启动流程80文件系统简单说就是一种目录结构,linux操作系统中的设备是以文件的形式存在的,将这些文件进行分类管理以及提供和内核交互的接口,就形成文件系统。Linux文件系统介绍81根文件系统是一种特殊的文件系统,是内核启动时挂载的第一个文件系统。该文件系统就要包括Linux启动时所必须的目录和关键性的文件。例如:Linux启动时都需要有init目录下的相关文件,在Linux挂载分区时Linux一定会找/etc/fstab这个挂载文件等,根文件系统中还包括了许多的应用程序bin目录等。任何包括这些Linux系统启动所必须的文件都可以称为根文件系统。内核代码的映像文件保存在根文件系统中。系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本(如rcS,inittab)和服务加载到内存中去运行。根文件系统介绍82Linux支持多种文件系统,包括ext2、ext3、vfat、ntfs、iso9660、jffs、romfs和nfs等,为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS(VirtualFileSystem),为各类文件系统提供一个统一的操作界面和应用编程接口。如图所示的Linux系统结构。Linux文件系统介绍根文件系统介绍Linux启动时,第一个挂载的系统是根文件系统。文件系统和内核是完全独立的两个部分。在嵌入式中移植的内核下载到开发板上,是没有办法真正的启动Linux操作系统的(会出现无法加载文件系统的错误),启动成功之后可以自动或手动挂载其他的文件系统。对比linux文件系统和根文件系统的目录结构Linux根文件系统嵌入式Linux系统的根文件系统/bin:存放二进制可执行命令的目录。/dev:存放设备文件和目录。/etc:存放系统管理和配置文件和目录。/home:用户主目录,比如用户user的主目录就是/home/user,可以用~user来表示。/lib:存放动态链接共享库的目录。/sbin:存放系统管理员使用的管理程序的目录。/tmp:公用的临时文件存储点。/root:系统管理员的主目录。/mnt:用以临时挂载其他的文件系统。/proc:虚拟文件系统,可直接访问这个目录来获取系统信息。/var:某些大文件溢出区。/usr:存放应用程序和文件。/bin/dev/etc/lib/tmp/mnt
/proc/var/usr由于受系统资源的限制,一般没有Linux根文件系统那么复杂,仅保留一些常用的目录即可,对于嵌入式系统,必须选择一个合适的根文件系统以使系统运行最佳。*嵌入式系统通常都不是针对多用户的根文件系统存放二进制文件的目录主要有四个:/bin,/sbin,/usr/bin和/usr/sbin,二进制文件要放在哪个目录,与它在系统中所扮演的角色有很大的关系。如果这个是用于和系统管理员必备的二进制文件,就会放在/bin。如果这是系统管理员必备,但是一般用户根本不会用到的二进制文件,就会放在/sbin,如果不是用户必备的二进制文件,多半会放在/usr/bin;如果不是系统管理必备的工具,多半会放在/usr/sbin中。根文件系统链接库目录lib,同样如此,系统引导以及执行最基本命令需要的链接库会在/lib,所有其他的链接库会放在/usr/lib,通常在套件安装时,会在/usr/lib中产生子目录,以便放它自己的链接库。87/etc目录--系统配置文件fstab 挂载文件系统的配置文件inittab 系统启动时解析的文件passwd password文件shadow shadow文件profile
登录时执行的文件根文件系统的目录结构补充:挂载/挂装mount命令在Linux中将一个文件系统与一个存储设备关联起来的过程称为挂装(mount)。使用mount命令将一个文件系统附着到当前文件系统层次结构中(根)。命令mount[-参数][设备名称][挂载点]例:mount/dev/sdb1/mnt#使用不带参数的mount命令来显示所有已经挂载上了的文件系统#也可将挂载配置写入/etc/fstab中,也实现自动挂载根文件系统的类型嵌入式Linux根文件系统主要的根文件系统类型(基于存储设备的文件系统类型)有:JFFS2YAFFS/YAFFS2Cramfs等Romfs
RAMDISK(1)JFFS2JFFS嵌入式系统文件系统最早是由瑞典AxisCommunications公司基于Linux2.0的内核为嵌入式系统开发的文件系统。JFFS2,日志闪存嵌入式系统文件系统版本2(JournallingFlashFileSystemv2),是RedHat公司基于JFFS开发的闪存文件系统。特点是:可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护等。缺点主要是当文件系统已满或接近满时,因为垃圾收集的关系而使jffs2的运行速度大大放慢。目前jffs3正在开发中。
(2)yaffs:YetAnotherFlashFileSystemyaffs/yaffs2是专为嵌入式系统使用NAND型闪存而设计的一种日志型文件系统。与jffs2相比,它减少了一些功能(例如不支持数据压缩),所以速度更快,挂载时间很短,对内存的占用较小。另外,它还是跨平台的文件系统,除了Linux和eCos,还支持WinCE,pSOS和ThreadX等操作系统。
(3)Cramfs:CompressedROMFileSystemCramfs是Linux的创始人Linus
Torvalds参与开发的一种只读的压缩文件系统。它也基于MTD驱动程序。在cramfs文件系统中,每一页(4KB)被单独压缩,可以随机页访问,其压缩比高达2:1,为嵌入式系统节省大量的Flash存储空间,使系统可通过更低容量的FLASH存储相同的文件,从而降低系统成本,而且系统的可靠性较好。由于以上特性,Cramfs在嵌入式系统中应用广泛。然而它的只读属性同时又是它的一大缺陷,使得用户无法对其内容对进扩充。94很小的应用程序提供完整的工具集的功能
init进程:由内核启动的第一个也是惟一的一个用户进程,它根据配置文件决定启动哪些程序>>在嵌入式领域,通常使用Busybox集成的init程序。嵌入式根目录下的bin,sbin和usr目录以及linuxc通常就是Busybox文件系统、网络系统等等的工具集
在/downloads/下载Busybox:busybox-1.12.2.tar.bz2,解压后,进入配置菜单:
makemenuconfigBusyBox生成工具集95BusyBox生成工具集96选择Busybox的编译方式:BuildOptions BuildBusyBoxasastaticbinary(nosharedlibs)
缺省配置为使用链接库配置交叉编译器:BuildOptions[*]DoyouwanttobuildBusyBoxwithaCrossCompiler?(/opt/crosstools/gcc-3.4.6-glibc-2.3.6/bin/arm-linux-)CrossCompilerprefix安装路径:Installation
Options(./_install)BusyBoxinstallationprefixBusyBox生成工具集97配置其他工具集:ArchivalUtilitiesCoreutilsConsoleUtilities控制台选项,如clear命令Debian
UtilitieEditorsFindingUtilitiesInitUtilitiesLogin/PasswordManagementUtilitiesMiscellaneousUtilitiesLinuxModuleUtilitiesNetworkingUtilitiesProcessUtilitiesShellsSystemLoggingUtilitiesLinuxSystemUtilitiesBusyBox生成工具集98配置其他工具集:InitUtilities[*]init[*]Supportreadinganinittabfile?[*]Supportrunninginitfromwithinaninitrd?BusyBox生成工具集99配置其他工具集:ArchivalUtilities
工具:tar、zip、unzipCoreutils
常用命令:basenamecatchgrp
chmoddatedd
dfechoenv
ln
ls
mkdir
mknod
mv
pwd
rm
rmdirsleepsortsyncwc
whoami等等Editors
编辑命令:vi
awk
sed等FindingUtilities
查找命令:find
grep
xargsBusyBox生成工具集100配置其他工具集: Login/PasswordManagementUtilities
Login:gettyloginpasswd NetworkingUtilities
网络命令集:hostname
ifconfig
inetd
netstatpingroute ProcessUtilities
进程命令:free
ps
sysctltop Shells
shell工具:ash等 SystemLoggingUtilities
日志工具:syslogd
klogd
LinuxSystemUtilities
系统工具:dmesg
fdisk
geto
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论