嵌入式操作系统:第4章 嵌入式Linux的构建

上传人:cn****1 文档编号:570108156 上传时间:2024-08-02 格式:PPT 页数:109 大小:1.57MB
返回 下载 相关 举报
嵌入式操作系统:第4章 嵌入式Linux的构建_第1页
第1页 / 共109页
嵌入式操作系统:第4章 嵌入式Linux的构建_第2页
第2页 / 共109页
嵌入式操作系统:第4章 嵌入式Linux的构建_第3页
第3页 / 共109页
嵌入式操作系统:第4章 嵌入式Linux的构建_第4页
第4页 / 共109页
嵌入式操作系统:第4章 嵌入式Linux的构建_第5页
第5页 / 共109页
点击查看更多>>
资源描述

《嵌入式操作系统:第4章 嵌入式Linux的构建》由会员分享,可在线阅读,更多相关《嵌入式操作系统:第4章 嵌入式Linux的构建(109页珍藏版)》请在金锄头文库上搜索。

1、第第4 4章章 嵌入式嵌入式LinuxLinux的构建的构建2主要内容主要内容4.1嵌入式嵌入式Bootloader技术技术4.2嵌入式根文件系统构建嵌入式根文件系统构建4.3Linux内核及启动流程内核及启动流程4.4基于基于ARM目标板的目标板的Linux系统及应用程序烧定系统及应用程序烧定建立交叉编译环境建立交叉编译环境启动代码启动代码Bootloader的实现的实现/移植移植kernel的配置的配置/移植移植/编译编译根文件系统根文件系统Cramfs的实现的实现嵌入式开发流程嵌入式开发流程44.1嵌入式嵌入式BootLoader技术技术Bootloader的概念的概念Bootloade

2、r引导程序引导程序Vivi简介简介Vivi代码分析代码分析5Bootloader的概念的概念BootLoader称为引导加载程序引导加载程序,是嵌入式系统加电后运行的第一段代码,相当于PC机的BIOS。也就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。通常,BootLoader是严重地依赖于硬件而实现严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的BootLoader几乎是不可能的。尽管如此,我们仍然可以对BootLoade

3、r归纳出一些通用的概念来,以指导用户特定的BootLoader设计与实现。引导加载程序引导加载程序可以初始化硬件可以初始化硬件设备、建立内存空间的映射图设备、建立内存空间的映射图6嵌入式系统离不开嵌入式系统离不开Bootloader每种每种CPU体系结构都有不同的体系结构都有不同的BootLoader。有些BootLoader也支持多种体系结构的CPU,比如U-Boot就同时支持ARM体系结构和MIPS体系结构。除了依赖于CPU的体系结构外,BootLoader实际上也依实际上也依赖于具体的嵌入式板级设备的配置赖于具体的嵌入式板级设备的配置。这也就是说,对于两块不同的嵌入式板而言,即使它们是基

4、于同一种CPU而构建的,要想让运行在一块板子上的BootLoader程序也能运行在另一块板子上,通常也都需要修改BootLoader的源程序。7BootLoader的安装媒介的安装媒介系统加电或复位后,所有的CPU通常都从某个由从某个由CPU制造商制造商预先安排的地址上取指令。预先安排的地址上取指令。比如,基于ARM7TDMIcore的CPU在复位时通常都从地址0x00000000取它的第一条指令。基于CPU构建的嵌入式系统通常都有某种类型的固态存储设固态存储设备备(比如:ROM、EEPROM或FLASH等)被映射到这个预先安排的地址上。因此在系统加电后,CPU将首先执行BootLoader程

5、序。8典型存储空间分配结构典型存储空间分配结构bootloaderbootloader启动参数内核根文件系统9Bootloader空间结构划分空间结构划分10控制控制BootLoader的设备或机制的设备或机制主机和目标机之间一般通过串口串口建立连接,BootLoader软件在执行时通常会通过串口来进行I/O,比如:输出打印信息到串口,从串口读取用户控制字符等。11BootLoader的操作模式的操作模式大多数BootLoader都包含两种不同的操作模式:“启启动加载动加载”模式和“下载下载”模式,这种区别仅对于开发人员才有意义。最终用户的角度看,BootLoader的作用就是用来加载操作系统

6、,而并不存在所谓的启动加载模式与下载工作模式的区别。12启动加载模式启动加载模式也称为也称为“自主自主”(Autonomous)模式。也即)模式。也即BootLoader从从目标机目标机上的某个上的某个固态存储设备固态存储设备上将操作上将操作系统加载到系统加载到RAM中运行,整个过程并没有用户的介入。中运行,整个过程并没有用户的介入。这种模式是这种模式是BootLoader的的正常工作模式正常工作模式,因此在嵌入,因此在嵌入式式产品发布产品发布的时侯,的时侯,BootLoader显然必须工作在这种显然必须工作在这种模式下。模式下。13下载模式下载模式在这种模式下,目标机上的在这种模式下,目标机

7、上的BootLoader将通过串口连接或网络连将通过串口连接或网络连接等通信手段接等通信手段从主机下载文件从主机下载文件,比如:下载内核映像和根文件系,比如:下载内核映像和根文件系统映像等。从主机下载的文件通常统映像等。从主机下载的文件通常首先被首先被BootLoader保存到目标保存到目标机的机的RAM中中,然后再被,然后再被BootLoader写到目标机上的写到目标机上的FLASH类类固态存储设备中。固态存储设备中。BootLoader的这种模式通常在的这种模式通常在第一次第一次安装内核与根文件系统时被安装内核与根文件系统时被使用;此外,以后的使用;此外,以后的系统更新系统更新也会使用也会

8、使用BootLoader的这种工作模的这种工作模式。工作于这种模式下的式。工作于这种模式下的BootLoader通常都会向它的终端用户提通常都会向它的终端用户提供一个简单的命令行接口。供一个简单的命令行接口。14下载模式下载模式像像vivi、RedBoot或或U-Boot等功能强大的等功能强大的Bootloader通通常都可同时支持这两种工作模式,而且允许用户在这常都可同时支持这两种工作模式,而且允许用户在这两种工作模式之间进行切换。两种工作模式之间进行切换。比如,比如,RedBoot在启动时处于正常的启动加载模式,在启动时处于正常的启动加载模式,但是它会延时但是它会延时3秒等待终端用户按下任

9、意键而将秒等待终端用户按下任意键而将RedBoot切换到下载模式。如在等待时间内没有接收到切换到下载模式。如在等待时间内没有接收到用户按键,则继续启动用户按键,则继续启动Linux内核。内核。15BootLoader与主机如何通信?与主机如何通信?最常见的情况就是,目标机上的最常见的情况就是,目标机上的BootLoader通过串口通过串口与主机之间进行文件传输,传输协议通常是与主机之间进行文件传输,传输协议通常是xmodemymodemzmodem协议中的一种。协议中的一种。但是,串口传输的速度比较慢,因此通过以太网连接但是,串口传输的速度比较慢,因此通过以太网连接并借助并借助TFTP协议来下

10、载文件是个更好的选择。协议来下载文件是个更好的选择。16BootLoader启动过程启动过程大多数大多数BootLoader都分为都分为stage1和和stage2两大部分。两大部分。依赖于依赖于CPU体系结构的代码,比如设备初始化代码等,体系结构的代码,比如设备初始化代码等,通常都放在通常都放在stage1中,而且通常都用中,而且通常都用汇编语言汇编语言来实现,来实现,以达到短小精悍的目的。以达到短小精悍的目的。而而stage2则通常用则通常用C语言语言来实现,这样可以实现复杂的来实现,这样可以实现复杂的功能,而且代码会具有更好的可读性和可移植性。功能,而且代码会具有更好的可读性和可移植性。

11、17Stage1通常包括以下步骤通常包括以下步骤(以执行的先后顺序以执行的先后顺序):硬件设备初始化(如屏蔽中断,设置硬件设备初始化(如屏蔽中断,设置CPU时钟频时钟频率等)。率等)。为加载为加载BootLoader的的stage2准备准备RAM空间。空间。拷贝拷贝BootLoader的的stage2到到RAM空间中。空间中。设置好堆栈。设置好堆栈。跳转到跳转到stage2的的C入口点。入口点。18硬件设备初始化硬件设备初始化屏蔽所有的中断为中断提供服务通常是OS设备驱动程序的责任,因此在BootLoader的执行全过程中可以不必响应任何中断。中断屏蔽可以通过写CPU的中断屏蔽寄存器或状态寄存

12、器(比如ARM的CPSR寄存器)来完成。设置CPU的速度和时钟频率RAM初始化包括正确地设置系统的内存控制器的功能寄存器以及各内存库控制寄存器等。初始化LED典型地,通过GPIO来驱动LED,其目的是表明系统的状态是OK还是Error。如果板子上没有LED,那么也可以通过初始化UART向串口打印BootLoader的Logo字符信息来完成这一点。关闭CPU内部指令数据cache19为加载为加载stage2准备准备RAM空间空间由于由于stage2通常是通常是C语言执行代码,因此在考虑空间大语言执行代码,因此在考虑空间大小时,除了小时,除了stage2可执行映象的大小外,还必须把可执行映象的大小

13、外,还必须把堆栈堆栈空空间也考虑进来。间也考虑进来。空间大小最好是内存页大小空间大小最好是内存页大小(通常是通常是4KB)的倍数。的倍数。一般而言,一般而言,1M的的RAM空间已经足够了。空间已经足够了。具体的地址范围可以任意安排。但是,将具体的地址范围可以任意安排。但是,将stage2安排到整安排到整个个RAM空间的最顶空间的最顶1MB(也即也即(RamEnd-1MB)-RamEnd)是一种值得推荐的方法是一种值得推荐的方法20拷贝拷贝stage2到到RAM中中需要考虑:需要考虑:stage2的可执行映象在固态存储设备的存放起始地的可执行映象在固态存储设备的存放起始地址和终止地址;址和终止地

14、址;RAM空间的起始地址。空间的起始地址。21设置堆栈指针设置堆栈指针堆栈指针的设置是为了执行堆栈指针的设置是为了执行C语言代码作好准备。语言代码作好准备。22跳转到跳转到stage2的的C入口点入口点23Stage2通常包括以下步骤通常包括以下步骤(以执行的先后顺序以执行的先后顺序):初始化本阶段要使用到的硬件设备。初始化本阶段要使用到的硬件设备。检测系统内存映射检测系统内存映射(memorymap)。将将kernel映像和根文件系统映像从映像和根文件系统映像从flash上读到上读到RAM空间中。空间中。为内核设置启动参数。为内核设置启动参数。调用内核。调用内核。24Stage2stage2

15、的代码通常用的代码通常用C语言来实现,以便于实现更复语言来实现,以便于实现更复杂的功能和取得更好的代码可读性和可移植性。杂的功能和取得更好的代码可读性和可移植性。但是与普通但是与普通C语言应用程序不同的是,在编译和链接语言应用程序不同的是,在编译和链接bootloader这样的程序时,不能使用这样的程序时,不能使用glibc库中任何支库中任何支持函数。持函数。25Stage2-初始化本阶段要使用到的硬件设备初始化本阶段要使用到的硬件设备p初始化至少一个串口,以便和终端用户进行初始化至少一个串口,以便和终端用户进行I/O输出输出信息信息p初始化计时器等。初始化计时器等。p设备初始化完成后,可以输

16、出一些打印信息,程序名设备初始化完成后,可以输出一些打印信息,程序名字字符串、版本号等。字字符串、版本号等。26Stage2-检测系统的内存映射检测系统的内存映射p内存映射就是指在整个内存映射就是指在整个4GB物理地址空间中有哪些地物理地址空间中有哪些地址范围被分配用来址范围被分配用来寻址系统的寻址系统的RAM单元单元。p通常通常CPU预留一大段足够的地址空间给系统的预留一大段足够的地址空间给系统的RAMp嵌入式系统却不一定实现嵌入式系统却不一定实现CPU预留的全部预留的全部RAM空间,空间,即嵌入式系统往往只把即嵌入式系统往往只把CPU预留的全部预留的全部RAM地址空间地址空间中的一部分映射

17、到中的一部分映射到RAM空间,而让剩余部分处于未使空间,而让剩余部分处于未使用状态。如用状态。如S3C2410使用的使用的RAM空间为空间为0x30000000-0x33ffffff。27地址空间描述地址空间描述Typedefstructmemory_area_structu32start;/*thebaseaddressofthememoryregion*/u32size;/*thebytenumberofthememoryregion*/int used;memory_area_t;Used=1说明某段地址被使用说明某段地址被使用Used=0说明某段地址并未被使用说明某段地址并未被使用28

18、Stage2-加载内核映像和根文件系统映像加载内核映像和根文件系统映像规划内存占用的布局规划内存占用的布局p内核映象所占用的内存范围内核映象所占用的内存范围一般将其拷贝到(一般将其拷贝到(MEM_START+0x8000)地址开)地址开始的大约始的大约1MB大小的空间,内核一般小于大小的空间,内核一般小于1Mp根文件系统所占用的内存范围根文件系统所占用的内存范围一般将其拷贝到(一般将其拷贝到(MEM_START+0x0010,0000)地址开始的地方地址开始的地方29Stage2-加载内核映像和根文件系统映像加载内核映像和根文件系统映像从从flash上拷贝上拷贝pARMCPU一般从统一的内存地

19、址空间寻址一般从统一的内存地址空间寻址flash等等固态存储设备,从固态存储设备,从flash上读取和从上读取和从RAM中读取方式中读取方式相同。相同。示例:示例:While(count)*dest+=*src+;/*theyareallalignedwiththewordboundary*/count=4;/*bytenumber*/30Stage2-设置内核的启动参数设置内核的启动参数pLinux2.4.x之后的内核都之后的内核都采用标记列表采用标记列表(taggedlist)的形式)的形式来传递启动参数来传递启动参数p启动参数标记列表以标记启动参数标记列表以标记ATAG_CORE开始,以

20、标记开始,以标记ATAG_NONE结束结束p数据结构数据结构tag以及以及tag_header在在linux的源码的源码Include/asm/setup.h中定义中定义31Setup.h/*thelistendwithanATAG_NONEnode*/#defineATAG_NONE0x00000000Structtag_headeru32size;/*size以字数为单位以字数为单位*/u32tag;32TagStructtagstructtag_headerhdr;unionstructtag_corecore;structtag_mem32mem;structtag_videotext

21、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.s

22、ize=RAMDISK_SIZE;Params-u.ramdisk.flags=1;ATAG_NONE示例示例Staticvoidsetup_end_tag(void)Params-hdr.tag=ATAG_NONE;Params-hdr.size=0;35调用内核调用内核pBootloader调用内核的方法是直接跳转到内核第一条指令处。p对于ARMLinux,在跳转之前必须满足下列条件CPU寄存器的设置R00R1机器类型IDR2启动参数标记列表在RAM中的起始地址CPU模式必须禁止中断(IRQ与FIQ)CPU必须为SVC模式Cache和MMU的设置MMU必须关闭数据Cache必须关闭36嵌入

23、式系统嵌入式系统Bootloader1、vivivivi是韩国Mizi公司开发的Bootloader,适用于ARM9处理器。2、RedBootRedBoot也称作红帽(RedHat)嵌入式调试引导程序,是一种用于嵌入式系统的独立开放源代码引导/装载器。3、U-BootUBoot(UniversalBootloader)是一款目前功能较为强大的开源Bootloader程序,它支持多种处理器平台,包括ARM、MIPS等。37vivi简介简介pvivi是由韩国mizi公司为ARM处理器系列设计的一个bootloader。它同样支持启动加载模式和下载工作模式支持启动加载模式和下载工作模式。p在下载模式

24、下,vivi为用户提供一个命令行人机接口命令行人机接口,通过这个人机接口可以使用vivi提供的一些命令。如果嵌入式系统没有键盘和显示,那么可以利用vivi中的串口,将其和宿主机连接起来,利用宿主机中的串口软件(如windows中的超级终端或者Linux中的minicom)来控制。38pVIVI有如下作用:有如下作用:把内核把内核(kernel)从从flash复制到复制到RAM,然后启动它;,然后启动它;初始化硬件;初始化硬件;下下载载程程序序并并写写入入flash(通通常常由由串串口口或或者者网网口口先先把把内内核核下载到下载到RAM中,然后写入中,然后写入flash););检检测测目目标标板

25、板(bootloader会会有有一一些些简简单单的的代代码码用用以以测测试目标板硬件的好坏)。试目标板硬件的好坏)。vivi简介39pVIVI的命令的命令(1)load命令命令将二进制文件载入到将二进制文件载入到Flash或者或者RAM,命令格式:,命令格式:load|其其中中命命令令行行参参数数描描述述装装载载位位置置,有有flash和和ram两两种种选选项项;参参数数或或描描述述装装载载的的地地址址,如如果果有有已已经经定定义义的的mtd分分区区信信息息,可可以以只只输输入入分分区区名名称称,否否则则需需要要指指定定地地址址和和大大小小;参参数数确确定定文文件件的的传输协议,常采用的选项传

26、输协议,常采用的选项“x”用来指定采用用来指定采用xmodem协议。协议。40例如:例如:viviloadflashkernelx装装载载压压缩缩映映像像文文件件zImage到到flash存存储储器器中中,地地址址是是kernel分区,并采用分区,并采用xmodem传输协议。传输协议。也可以指定地址和大小,也可以指定地址和大小,例如:例如:viviloadflash0x800000xc0000x。41(2)part命令命令操操作作MTD分分区区信信息息,比比如如,显显示示、增增加加、删删除除、复复位位、保存保存MTD分区等。分区等。partshow:显示:显示mtd分区信息。分区信息。part

27、add:增增加加新新的的mtd分分区区,其其中中为为新新mtd分分区区名名称称,是是mtd器器件件的的偏偏移移,表表示示mtd分分区区的的大大小小,表表示示分分区区类类型型,可可选选项项有有JFFS2、LOCKED和和BONFS。partdel:删除一个:删除一个mtd分区。分区。partreset:恢复:恢复mtd分区为默认值。分区为默认值。partsave:在:在flash中永久保存参数值和分区信息。中永久保存参数值和分区信息。42(3)param命令命令用来设置或者察看参数。用来设置或者察看参数。例如:改变引导程序启动的时间,使用例如:改变引导程序启动的时间,使用viviparamset

28、boot_delay100000实现。实现。43(4)boot命令命令用用来来引引导导存存储储在在flash存存储储器器或或者者ram中中的的linux内内核核。命命令令格式:格式:boot|参参数数设设定定存存储储linux内内核核映映像像的的位位置置,可可选选项项有有ram、nor和和smc。参参数数或或描描述述存存储储内内核核的的地地址址,如如果果有有提提前前定定义义的的mtd分分区区信信息息,可可以以只只输输入入分分区区名名称称,否则需要指定地址和大小。否则需要指定地址和大小。例例如如:vivibootnor0x80000表表示示从从flash存存储储器器中中读读出出linux内核,偏

29、移是内核,偏移是0x80000。44(5)flash命令命令存储器管理命令存储器管理命令例如:例如:flasherase|表示擦除表示擦除flash存储器。存储器。45如何进入如何进入vivi界面界面1、进行硬件连接连接电源,将5V电源线的连到UP-NETARM2410-S的电源接口;连接串口线,一端连接PC的串口,另一端连接到UP-NETARM2410-S的串口(上面的);连接网线,将随机附带的交叉网线把UP-NETARM2410-S靠近于电源接口的网口和PC机的网口连接好。如何进入如何进入vivi界面界面2、进入宿主机中的串口软件:windows中的超级终端/Linux中的minicom运

30、行Windows系统下(以WindowsXP为例)开始所有程序附件通讯超级终端(HyperTerminal)。请大家注意:在windowsxp操作系统下,当初次建立超级终端的时候,会出现如下对话框,请在中打上,并选择“否”如何进入如何进入vivi界面界面新建一个通信终端。如果要求输入区号、电话号码等信息请随意输入,出现如图5.2.1所示对话框时,为所建超级终端取名为arm,可以为其选一个图标。单击“确定”按钮。图5.2.1 创建超级终端 如何进入如何进入vivi界面界面选择ARM开发平台实际连接的PC机串口(如COM1),按确定后出现如图5.2.2所示的属性对话框,设置通信的格式和协议。这里波

31、特率为115200,数据位8,无奇偶校验,停止位1,无数据流控制。图5.2.2设置串行口 如何进入如何进入vivi界面界面完成新建超级终端的设置以后,可以选择超级终端文件菜单中的另存为,把设置好的超级终端保存在桌面上,以备后用。用串口线将PC机串口和平台正确连接后,就可以在超级终端上看到程序输出的信息了.如何进入如何进入vivi界面界面3、打开电源开关,系统会由VIVI开始引导。正常启动时会显示启动信息到“PressReturntostarttheLINUXnow,anyotherkeyforvivi”,不进行任何操作等待30S或按回车则启动进入linux系统,按除回车键外的其它键则进入viv

32、i控制台,如图5.3.1。在这里输入“boot”,进入LINUX系统;输入“bootucos”进入ucos系统。图5.3.1 vivi控制台 输入“boot”后会引导kernel,启动linux系统,见5.3.2. 在该应用程序目录下,可以挂载nfs文件系统,通过“ls”查看应用程序53pvivi的文件结构的文件结构vivi包括下面几个目录:(1)arch:此目录包括了所有VIVI支持的目标板的子目录,本书附带的代码中只包含S3C2410X。(2)Documentation:存放了许多文档,包括VIVI使用指南。(3)drivers:其中包括了引导内核所需的MTD设备和串口驱动程序(目标板的各

33、种设备驱动程序)。MTD目录下分maps、nand和nor三个目录,实现对NandFlash和NorFlash的读写控制。Serial目录下的文件实现对串口的控制,并支持xmodem和ymodem协议。54(4)include:头文件的公共目录,其中的S3C2410.h定义了处理器的一些寄存器,以及NAND Flash的一些寄存器等。Platform/smdk2410.h定义了与目标板相关的资源配置参数,修改波特率、引导参数和物理内存映射等参数即可配置目标板。(5)init:此目录只有main.c和version.c两个文件。与普通的C程序一样,VIVI将从main函数开始执行(vivi第二阶

34、段的入口函数),main函数调用lib下的函数实现第二阶段工作。(6)lib:一些平台公共的接口代码,比如,time.c里的udelay()和mdelay(),第二阶段的初始化代码和vivi常用命令的实现。(7)scripts:此目录存放了配置所需的脚本文件,如Menuconfig和Configure文件,以方便对VIVI的配置。(8)test:存放一些测试代码文件。(9)util:存放与NANDFlash烧写image相关的工具实现代码55pvivi的配置和编译的配置和编译vivi的配置和嵌入式Linux内核一样,可以采用菜单化的形式进行。其步骤主要如下:#makedistclean。清除一

35、些早先生成的无用的目标文件。#makemenuconfig。然后可以根据菜单中的信息进行配置。#make命令开始编译。菜单配置完毕后,保存退出,然后用make命令编译。56vivi代码分析vivi的第一阶段主要完成了依赖于CPU的体系结构硬件初始化,包括禁止中断、初始化串口、复制第二阶段到RAM中等。由于这些代码是和硬件紧密相关的,因此要求大家在阅读时需要对照S3C2410处理器的数据手册,查阅相关的寄存器的描述,以便更好地理解。这些汇编代码全部就集中在viviarchs3c2410目录下的head.S这一个汇编文件中,当然还有相关的头文件。vivi的第二阶段的入口就是init/main.c,

36、按照源代码的组织流程,根据模块化划分的原则,共分为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()定义在libheap.c文件中。

37、第五步:初始化mtd设备,用mtd_dev_init()函数第六步:配置参数,主要是init_priv_data函数。第七步:提供vivi人机接口的各种命令。第八步:进入Bootloader的两种模式之一。vivi代码分析Bootloader(vivi) 的烧写和使用的烧写和使用linux系统的移植主要包括四个部分:烧写2410Slinux操作系统包括烧写vivi,kernel,root三个步骤,除此我们还要烧写yaffs.tar,这四个文件为:vivi-linux操作系统启动的bootloader;zImage-linux操作系统内核;root.cramfs-根文件系统;yaffs.tar-

38、应用程序烧写烧写Vivi既可通串口烧写也可通过既可通串口烧写也可通过jtag来烧写;来烧写;zImage和和root.cramfs通过串口来烧写;通过串口来烧写;应用程序压缩包通过网口来下载。应用程序压缩包通过网口来下载。Bootloader(vivi)的烧写的烧写vivi的烧写有两种方式:通过JTAG口烧写和通过串口烧写。在Flash被格式化且内存里也没有Bootloader的时候,此时目标板是一个完全干净的开发板,就需要通过JTAG口把Bootloader烧写到板子上串口烧写主要用于更新和升级Bootloader。在Windows下可以通过超级终端来访问目标板来进行烧写,在Linux下可以

39、通过MiniCom烧写。板子上没有任何东西(包括BootLoader)的时候,需要专门的工具对vivi等BootLoader进行烧写Bootloader举例举例手册第9-19页板子上有诸如vivi等BootLoader后,再进行升级,就可以利用Target上已经存在的(旧的)BootLoader了Bootloader举例举例4.3.2Bootloader的使用的使用工作正常的时候工作正常的时候,Bootloader处于处于加载模式或者交互模式加载模式或者交互模式如使用如使用vivivivi的的时候时候, ,其交互模式的界面是其交互模式的界面是利用vivi升级内核Bootloader举例举例利用

40、vivi升级文件系统Bootloader举例举例674.3Linux内核及启动过程内核及启动过程Linux内核结构内核结构Linux内核配置、编译内核配置、编译Linux内核移植内核移植68Linux系系统统实实际际上上由由两两个个比比较较独独立立的的部部分分组组成成,即即内内核核部部分分和和系统部分系统部分(根文件系统)。(根文件系统)。启启动动时时,首首先先由由BootLoader程程序序将将Linux部部分分内内核核调调入入内内存存,并并将将控控制制权权交交给给内内存存中中Linux内内核核的的第第一一行行代代码码。然然后后Linux将将自自己己的的剩剩余余部部分分全全部部加加载载到到内

41、内存存、初初始始化化所所有有的的设设备备、在在内内存存中中建建立立好好所所需需的的数数据据结结构构(有有关关进进程程、设设备备、内内存存等等)。此此时时内内核核已已经经控控制制了了所所有有硬硬件件设设备备,内核加载完成。内核加载完成。至于操作和使用这些硬件设备,则是至于操作和使用这些硬件设备,则是系统部分系统部分任务。任务。内内核核部部分分初初始始化化并并控控制制大大部部分分硬硬件件设设备备,为为内内存存管管理理、进进程程管管理理、设设备备读读、写写等等工工作作做做好好一一切切准准备备;系系统统部部分分加加载载必必需需的的设设备备,配配置置各各种种环环境境以以便便用用户户可可以以使使用用整整个

42、个系统。系统。69pLinux内核主要由五个子系统组成:进程调度,内存管理,内核主要由五个子系统组成:进程调度,内存管理,虚拟文件系统,网络接口,进程间通信。虚拟文件系统,网络接口,进程间通信。进程调度(进程调度(SCHED):控制进程对):控制进程对CPU的访问。的访问。Linux使用比较简单的基于优先级的进程调度算法选择新的进使用比较简单的基于优先级的进程调度算法选择新的进程。程。内存管理(内存管理(MM):允许多个进程安全地共享主内存区):允许多个进程安全地共享主内存区域。域。Linux的内存管理支持虚拟内存。的内存管理支持虚拟内存。虚拟文件系统(虚拟文件系统(VirtualFileSy

43、stem,VFS):隐藏了各):隐藏了各种硬件的具体细节,为所有的设备提供了统一的接口,种硬件的具体细节,为所有的设备提供了统一的接口,VFS提供了多达数十种不同的文件系统。(分为逻辑文提供了多达数十种不同的文件系统。(分为逻辑文件系统和设备驱动程序)件系统和设备驱动程序)网络接口(网络接口(NET):提供了对各种网络标准的存取和各):提供了对各种网络标准的存取和各种网络硬件的支持(网络协议和网络驱动程序)。种网络硬件的支持(网络协议和网络驱动程序)。进程间通讯(进程间通讯(IPC):支持进程间各种通信机制。):支持进程间各种通信机制。Linux内核结构内核结构Linux内核结构内核结构-Li

44、nux源码位置源码位置71pLinux内核目录结构内核目录结构/include子目录包含了建立内核代码时所需的大部分包含文件,子目录包含了建立内核代码时所需的大部分包含文件,这个模块利用其他模块重建内核。这个模块利用其他模块重建内核。/init子目录包含了内核的初始化代码,这是内核工作的开始的子目录包含了内核的初始化代码,这是内核工作的开始的起点。起点。/arch子目录包含了所有硬件结构特定的内核代码。如:子目录包含了所有硬件结构特定的内核代码。如:arm、i386、alpha。/drivers子目录包含了内核中所有的设备驱动程序,如块设备和子目录包含了内核中所有的设备驱动程序,如块设备和SC

45、SI设备。设备。/fs子目录包含了所有的文件系统的代码,如:子目录包含了所有的文件系统的代码,如:ext2,vfat等。等。/net子目录包含了内核的连网代码。子目录包含了内核的连网代码。/mm子目录包含了所有内存管理代码。子目录包含了所有内存管理代码。/ipc子目录包含了进程间通信代码。子目录包含了进程间通信代码。/kernel子目录包含了主内核代码。子目录包含了主内核代码。Linux内核结构内核结构72pLinux内核配置系统的组成内核配置系统的组成Makefile(顶层Makefile和子目录下的Makefile)配置文件.config文件,包含由用户选择的配置选项,用来存放内核配置后的

46、结果。Rules.make:规则文件,被所有的Makefile使用。配置工具基于字符的界面字符的界面makeconfig:进入命令行,可以一行一行的配置,但使用不十分方便。基于Ncurses的文本模式图形用户界面文本模式图形用户界面makemenuconfig:大多数开发人员使用的Linux内核编译菜单,使用方便。基于Xwindows图形界面的用户配置界面图形界面的用户配置界面makexconfig:在2.4.X以及以前版本中xconfig菜单是基于TCL/TK的图形库的。Linux内核配置(裁剪)、编译内核配置(裁剪)、编译oMake menuconfig的图形配置界面 74pLinux内核

47、配置与裁减内核配置与裁减下载Linux内核源码到/usr/src目录下解压该文件进入/usr/src/linux-2.x.xx目录,执行makemenuconfig命令就可以进入配置界面。在启动配置菜单后,选择相应的配置时,有三种选择方式,它们分别代表的含义如下。N不将该功能编译进内核Y将该功能编译进内核M将该功能编译成可以在需要时动态插入到内核中的模块Linux内核配置编译内核配置编译75pLinux内核编译内核编译在完成内核的裁减之后,内核的编译就只要执行以下几条命令:makedep:对内核原代码的文件进行完整性和依赖性进行检验,确保关键文件在正确的位置。makeclean:编译内核之前先

48、把环境给清理干净。有时也可用makerealclean或makemrproper来彻底清除相关依赖,保证没有不正确的.o文件存在。makezImage:创建内核镜像文件makemodules:创建内核模块,若不创建内核模块,这步可以不要。Linux内核配置编译76pLinux移植Linux移植其实质实质是获取某一版本的获取某一版本的Linux内核源码内核源码,根据具体目标平台对这源码进行必要的改写对这源码进行必要的改写(主要是修改体系结构相关部分),然后添加一些外设的驱动添加一些外设的驱动,打造打造一款适合于目标平台的新操作系统新操作系统,对该系统进行针对目标平台的交叉编译交叉编译,生成一个内

49、核映象文件生成一个内核映象文件,最后通过一些手段把该映象文件烧写(安装)到目标平台中把该映象文件烧写(安装)到目标平台中。p交叉编译环境的搭建交叉编译环境的搭建p修改修改Linux内核源码内核源码linux的移植主要包含启动代码的修改,内核的链接及装入,参数传递,内核引导几个部分。p基于基于ARM目标板的目标板的Linux内核配置裁减与编译内核配置裁减与编译基于基于ARM开发板的开发板的Linux内核移植内核移植774.4Linux内核及启动过程内核及启动过程JTAG烧写烧写vivi串口下载烧写串口下载烧写应用程序下载到目标板应用程序下载到目标板78UP-NETARM2410-S操作系统由操作

50、系统由vivi(bootloader)、)、zImage(Linux内核映象内核映象)、root.cramfs(根文件系统映象根文件系统映象)三三部分组成,部分组成,vivi即可通串口烧写也可通过即可通串口烧写也可通过jtag来烧写,来烧写,zImage和和root.cramfs通过串口来烧写,应用程序压缩包通通过串口来烧写,应用程序压缩包通过网口来下载。过网口来下载。JTAG烧写,适用于烧写,适用于flash空白或者空白或者vivi损坏无法引导的情况损坏无法引导的情况下,通过并口线和下,通过并口线和Jtag简易仿真器,用简易仿真器,用sjf2410-s.exe将将vivi烧写到烧写到flas

51、h中作为引导启动程序。中作为引导启动程序。串口通讯下载,是最常用的烧写方式,即在核心模块上已串口通讯下载,是最常用的烧写方式,即在核心模块上已烧录有烧录有vivi的前提下进入的前提下进入vivi,通过在,通过在SDRAM中运行的中运行的vivi格式化格式化flash,烧写,烧写vivi、内核和根文件系统,最后把应用、内核和根文件系统,最后把应用程序压缩包程序压缩包yaffs.tar.bz2通过网口下载到通过网口下载到Linux系统的系统的/var目录下,然后解压到目录下,然后解压到/mnt/yaffs下。下。794.2嵌入式嵌入式Linux根文件系统构建根文件系统构建Linux文件系统介绍文件

52、系统介绍根文件系统的目录结构根文件系统的目录结构BusyBox生成工具集生成工具集根文件系统启动流程根文件系统启动流程80文文件件系系统统简单说就是一种目录结构,linux操作系统中的设备是以文件的形式存在的,将这些文件进行分类管理以及提供和内核交互的接口,就形成文件系统。Linux文件系统介绍文件系统介绍81根根文文件件系系统统是一种特殊的文件系统,是内核启动时挂载的第一个文件系统。该文件系统就要包包括括Linux启启动动时时所所必必须须的的目目录录和和关关键键性性的的文文件件。例如:Linux启动时都需要有init目录下的相关文件,在Linux挂载分区时Linux一定会找/etc/fsta

53、b这个挂载文件等,根文件系统中还还包包括括了了许许多多的的应应用用程程序序bin目目录录等。任何包括这些Linux系统启动所必须的文件都可以称为根文件系统。内核代码的映像文件映像文件保存在根文件系统根文件系统中。系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本(如rcS,inittab)和服务加载到内存中去运行。根文件系统介绍根文件系统介绍82pLinux支支持持多多种种文文件件系系统统,包包 括括 ext2、 ext3、 vfat、ntfs、iso9660、jffs、romfs和和nfs等等,为为了了对对各各类类文文件件系系统统进进行行统统一一管管理理,Linux引引入入了了虚虚拟

54、拟文文件件系系统统VFS(VirtualFileSystem),为为各各类类文文件件系系统统提提供供一一个个统统一一的的操操作作界界面面和和应应用用编编程程接接口口。如如图图所示的所示的Linux系统结构。系统结构。Linux文件系统介绍文件系统介绍根文件系统介绍根文件系统介绍Linux启动时,第一个挂载的系统是根文件系统。文件系统和内核是完全独立的两个部分。在嵌入式中移植的内核下载到开发板上,是没有办法真正的启动Linux操作系统的(会出现无法加载文件系统的错误),启动成功之后可以自动或手动挂载其他的文件系统。对比对比linux文件系统和根文件系统的目录结构文件系统和根文件系统的目录结构Li

55、nux 根文件系统嵌入式 Linux 系统的根文件系统/bin:存放二进制可执行命令的目录。/dev:存放设备文件和目录。/etc:存放系统管理和配置文件和目录。/home:用户主目录,比如用户user 的主目录就是/home/user,可以用user 来表示。/lib:存放动态链接共享库的目录。/sbin:存放系统管理员使用的管理程序的目录。/tmp:公用的临时文件存储点。/root:系统管理员的主目录。/mnt:用以临时挂载其他的文件系统。/proc:虚拟文件系统,可直接访问这个目录来获取系统信息。/var:某些大文件溢出区。/usr:存放应用程序和文件。/bin/dev/etc/lib/

56、tmp/mnt /proc/var/usr由于受系统资源的限制,一般没有Linux 根文件系统那么复杂,仅保留一些常用的目录即可,对于嵌入式系统,必须选择一个合适的根文件系统以使系统运行最佳。*嵌入式系统通常都不是针对多用户的根文件系统根文件系统存放二进制文件的目录主要有四个:/bin,/sbin,/usr/bin和/usr/sbin,二进制文件要放在哪个目录,与它在系统中所扮演的角色有很大的关系。如果这个是用于和系统管理员必备的二进制文件,就会放在/bin。如果这是系统管理员必备,但是一般用户根本不会用到的二进制文件,就会放在/sbin,如果不是用户必备的二进制文件,多半会放在/usr/bi

57、n;如果不是系统管理必备的工具,多半会放在/usr/sbin中。根文件系统根文件系统链接库目录lib,同样如此,系统引导以及执行最基本命令需要的链接库会在/lib,所有其他的链接库会放在/usr/lib,通常在套件安装时,会在/usr/lib中产生子目录,以便放它自己的链接库。87/etc目录系统配置文件目录系统配置文件fstab挂载文件系统的配置文件inittab 系统启动时解析的文件passwdpassword文件shadowshadow文件profile登录时执行的文件根文件系统的目录结构根文件系统的目录结构补充:挂载补充:挂载/挂装挂装mount命令命令在Linux中将一个文件系统与一

58、个存储设备关联起来的过程称为挂装(mount)。使用mount命令将一个文件系统附着到当前文件系统层次结构中(根)。命令mount-参数参数设备名称设备名称挂载点挂载点例:mount/dev/sdb1/mnt#使用不带参数的使用不带参数的mount命令来显示所有已经挂载上了的文件系统命令来显示所有已经挂载上了的文件系统#也可将挂载配置写入也可将挂载配置写入/etc/fstab中,也实现自动挂载中,也实现自动挂载根文件系统的类型根文件系统的类型嵌入式Linux根文件系统主要的根文件系统类型(基于存储设备的文件系统类型)有:JFFS2YAFFS/YAFFS2Cramfs等RomfsRAMDISK(

59、1)JFFS2JFFS嵌入式系统文件系统最早是由瑞典AxisCommunications公司基于Linux2.0的内核为嵌入式系统开发的文件系统。JFFS2,日志闪存嵌入式系统文件系统版本2(JournallingFlashFileSystemv2),是RedHat公司基于JFFS开发的闪存文件系统。特点是:可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护等。缺点主要是当文件系统已满或接近满时,因为垃圾收集的关系而使jffs2的运行速度大大放慢。目前jffs3正在开发中。(2)yaffs:YetAnotherFlashFileSystemyaffs/yaffs2

60、是专为嵌入式系统使用NAND型闪存而设计的一种日志型文件系统。与jffs2相比,它减少了一些功能(例如不支持数据压缩),所以速度更快,挂载时间很短,对内存的占用较小。另外,它还是跨平台的文件系统,除了Linux和eCos,还支持WinCE,pSOS和ThreadX等操作系统。(3)Cramfs:CompressedROMFileSystemCramfs是Linux的创始人LinusTorvalds参与开发的一种只读的压缩文件系统。它也基于MTD驱动程序。在cramfs文件系统中,每一页(4KB)被单独压缩,可以随机页访问,其压缩比高达2:1,为嵌入式系统节省大量的Flash存储空间,使系统可通过更低容量的FLASH存储相同的文件,从而降低系统成本,而且系统的可靠性较好。由于以上特性,Cramfs在嵌入式系统中应用广泛。然而它的只读属性同时又是它的一大缺陷,使得用户无法对其内容对进扩充。94p很小的应用程序提供完整的工具集的功能init进程:由内核启动的第一个也是惟一的一个用户进程,它根据配置文件决定启动哪些程序在嵌入式领域,通常使用Busybox集成的init程序。嵌入式根目录下的bin,sbin和usr目录以及linuxc通常就是Busybox文件系统、网络系统等等的工具集p在http:/ 习题二3、4

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号