嵌入式系统设计_第1页
嵌入式系统设计_第2页
嵌入式系统设计_第3页
嵌入式系统设计_第4页
嵌入式系统设计_第5页
已阅读5页,还剩276页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第3章嵌入式系统设计主要内容1、Bootloader详解及制作

嵌入式系统的存储器结构Bootloader简介Bootloader启动常用Bootloader介绍Bootloader制作2、内核剪裁与编译Linux内核功能结构Linux内核源代码布局Linux内核的移植Linux的编译和定制内核剪裁与编译实例2主要内容3、根文件系统的构造根文件系统文件系统类型BusyBox根文件系统目录结构根文件系统制作要点根文件系统制作实例制作根文件系统镜像4、应用程序移植3存储器系统的层次结构计算机系统的存储器被组织成一个6个层次的金字塔形的层次结构。位于整个层次结构的最顶部S0层为CPU内部存放器S1层为芯片内部的高速缓存〔cache〕内存S2层为芯片外的高速缓存〔SRAM、DRAM、DDRAM〕S3层为主存储器〔Flash、PROM、EPROM、EEPROM〕S4层为外部存储器〔磁盘、光盘、CF、SD卡〕S5层为远程二级存储〔分布式文件系统、Web效劳器〕嵌入式系统的存储器4存储器系统的层次结构图嵌入式系统的存储器5在这种存储器分层结构中,上面一层的存储器作为下一层存储器的高速缓存。CPU存放器就是cache的高速缓存,存放器保存来自cache的字;cache又是内存〔芯片外的高速缓存〕层的高速缓存,从内存中提取数据送给CPU进行处理,并将CPU的处理结果返回到内存中;内存〔芯片外的高速缓存〕又是主存储器的高速缓存,它将经常用到的数据从Flash等主存储器中提取出来,放到内存中,从而加快了CPU的运行效率。嵌入式系统的存储器6嵌入式系统的存储器在这种存储器分层结构中,上面一层的存储器作为下一层存储器的高速缓存。嵌入式系统的主存储器容量是有限的,磁盘、光盘或CF、SD卡等外部存储器用来保存大信息量的数据。在某些带有分布式文件系统的嵌入式网络系统中,外部存储器就作为其他系统中被存储数据的高速缓存。7存储器部件的分类1.按在系统中的地位分类在微机系统中,存储器可分为主存储器〔MainMemory简称内存或主存〕和辅助存储器〔AuxiliaryMemory,SecondaryMemory,简称辅存或外存〕。嵌入式系统的存储器8主存储器〔简称内存或主存〕:内存是计算机主机的一个组成局部,一般都用快速存储器件来构成,内存的存取速度很快,但内存空间的大小受到地址总线位数的限制。内存通常用来容纳当前正在使用的或要经常使用的程序和数据,CPU可以直接对内存进行访问。系统软件中如引导程序、监控程序或者操作系统中的根本输入/输出局部BIOS都是必须常驻内存。更多的系统软件和全部应用软件那么在用到时由外存传送到内存。9辅助存储器〔简称辅存或外存〕:外存也是用来存储各种信息的,存放的是相对来说不经常使用的程序和数据,其特点是容量大。外存总是和某个外部设备相关的,常见的外存有软盘、硬盘、U盘、光盘等。CPU要使用外存的这些信息时,必须通过专门的设备将信息先传送到内存中。10存储器部件的分类2.按存储介质分类根据存储介质的材料及器件的不同,可分为磁存储器〔MagneticMemory〕,半导体存储器、光存储器〔OpticalMemory〕及激光光盘存储器〔LaserOpticalDisk〕。11存储器部件的分类3.按信息存取方式分类存储器按存储信息的功能,分为:随机存取存储器〔RandomAccessMemory,RAM〕只读存储器〔ReadOnlyMemory,ROM〕。12常见的嵌入式系统存储设备随机存取存储器〔RAM〕只读存储器〔ROM〕FlashMemory小型快速闪存卡〔CompactFlash,CF卡〕平安数据卡〔SecureDigitalCard,SD卡〕硬盘存储器131.随机存取存储器〔RAM〕:随机存取存储器是一种在机器运行期间可读、可写的存储器,且存取的速度与存储单元的位置无关的存储器,又称读写存储器。RAM通常都是在掉电之后就丧失数据,主要用于存储短时间使用的程序。141.随机存取存储器〔RAM〕:随机存储器按信息存储的方式,可分为:静态RAM〔StaticRAM,SRAM〕动态RAM〔DynamicRAM,DRAM〕双倍速率RAM〔DoubleDataRateSDRAM,DDRAM〕15静态RAM〔SRAM〕:SRAM速度非常快,是目前读写最快的存储设备了,但是它也非常昂贵,所以只在要求很苛刻的地方使用,譬如CPU的一级缓冲,二级缓冲。动态RAM〔DRAM〕:DRAM保存数据的时间很短,速度也比SRAM慢,不过它还是比任何的ROM都要快,但从价格上来说DRAM相比SRAM要廉价很多,计算机内存就是DRAM的。16双倍速率RAM〔DDRAM〕:DDRAM是RAM的下一代产品。是在SDRAM内存根底上开展而来的,仍然沿用SDRAM生产体系,但运用了更先进的同步电路等。DDR本质上不需要提高时钟频率就能加倍提高SDRAM的速度,它允许在时钟脉冲的上升沿和下降沿读出数据,因而其速度是标准SDRAM的两倍。SDRAM,SynchronousDynamicRandomAccessMemory,同步动态随机存储器17例:软件一般放在EEPROM中,我们打,有些最后拨打的号码,暂时是存在SRAM中的,不是马上写入保存在EEPROM中通话记录,因为当时有很重要工作〔通话〕要做,如果写入,漫长的等待是让用户忍无可忍的。182.只读存储器〔ROM〕:在机器运行期间只能读出信息,不能随时写入信息的存储器称为只读存储器。ROM在系统停止供电的时候仍然可以保持数据。ROM在烧入数据后,无需外加电源来保存数据,断电后数据不丧失,但速度较慢,适合存储需长期保存的不变数据。19常见的只读存储器〔ROM〕有:掩模ROM〔MaskROM〕可编程ROM〔ProgrammableROM,PROM〕可擦写ROM〔ErasableProgrammableROM,EPROM〕电可擦除可编程ROM〔EEPROM,也可表示为E2PROM〕FlashROM〔闪速存储器〕20MaskROM一次性由厂家写入数据的ROM,用户无法修改。PROM出厂时厂家并没有写入数据,而是保存里面的内容为全0或全1,由用户来编程一次性写入数据。即PROM是一次性的,也就是软件灌入后,就无法修改了,EPROM可以通过紫外光的照射,擦掉原先的程序,芯片可重复擦除和写入。21E2PROM是通过加电擦除原编程数据,通过高压脉冲可以写入数据,写入时间较长。FlashROM断电不会丧失数据,可快速读取,电可擦写可编程。223.FlashMemory〔闪速存储器〕是一种非易失性存储器NVM〔Non-VolatileMemory〕,它结合了ROM和RAM的长处,不仅具备电子可擦除可编程〔EEPROM〕的性能,还不会断电丧失数据,同时可以快速读取数据〔NVRAM的优势〕。U盘和MP3里用的就是这种存储器。23FlashMemory〔闪速存储器〕在过去的20年里,嵌入式系统一直使用ROM〔EPROM〕作为它们的存储设备,然而近年来Flash全面代替了ROM〔EPROM〕在嵌入式系统中的地位,用作存储Bootloader以及操作系统或者程序代码或者直接当硬盘使用〔U盘〕。目前Flash主要有两种NORFlash和NADNFlash。24FlashMemory〔闪速存储器〕FlashMemory在物理结构上分成假设干个区块,区块之间相互独立。NORFlash把整个存储区分成假设干个扇区〔Sector〕,而NANDFlash把整个存储区分成假设干个块〔Block〕,可以对以块或扇区为单位的内存单元进行擦写和再编程。25NORFlashNOR的特点是芯片内执行,这样应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM中。NOR的传输效率很高,在1~4MB的小容量时具有很高的本钱效益,但是很低的写入和擦除速度大大影响了它的性能。26NANDFlash没有采取内存的随机读取技术,它的读取是以一次读取一块的形式来进行的,通常是一次读取512个字节。NAND结构能提供极高的单元密度,可以到达高存储密度,并且写入和擦除的速度也很快,采用这种技术的Flash比较廉价。用户不能直接运行NANDFlash上的代码,应用NAND的困难在于flash的管理和需要特殊的系统接口。一般小容量的用NORFlash,因为其读取速度快,多用来存储操作系统等重要信息,而大容量的用NANDFLASH。27NORFlash和NANDFlash的比照:〔1〕、读写性能比照flash闪存是非易失存储器,可以对称为块的存储器单元块进行擦写和再编程。任何flash器件的写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除。NAND器件执行擦除操作是十分简单的,而NOR那么要求在进行擦除前先要将目标块内所有的位都写为0。

28NORFlash和NANDFlash的比照:〔1〕、读写性能比照NORFlash擦除时是以64~128KB为单位的块进行的,执行一个写入/擦除操作的时间为5s,NANDFlash擦除是以8~32KB的块进行的,执行相同的操作最多只需要4ms。NANDFlash的写入速度比NORFlash快很多。NORFlash的读速度比NANDFlash稍快一些,NANDFlash的随机读取能力差,适合大量数据的连续读取。29除了NORFlash的读,FlashMemory的其他操作不能像RAM那样,直接对目标地址进行总线操作。例如执行一次写操作,它必须输入一串特殊的指令〔NORFlash〕,或者完成一段时序〔NANDFlash〕才能将数据写入到FlashMemory中。30NORFlash和NANDFlash的比照:〔2〕、接口比照NORFlash带有SRAM接口,有足够的地址引脚来寻址,可以很容易地存取其内部的每一个字节。NANDFlash地址、数据和命令共用8位/16位总线,每次读写都要使用复杂的I/O接口串行地存取数据,8位/16位总线用来传送控制、地址和数据信息。NAND读和写操作采用512字节的块,这一点有点像硬盘管理此类操作,很自然地,基于NAND的存储器就可以取代硬盘或其他块设备。

31NORFlash和NANDFlash的比照:〔3〕、容量和本钱比照NANDflash的单元尺寸几乎是NOR器件的一半,由于生产过程更为简单,NAND结构可以在给定的模具尺寸内提供更高的容量,也就相应地降低了价格。

NORflash占据了容量为1~16MB闪存市场的大局部,而NANDFlash用在8MB以上的产品当中。在价格方面,NorFlash相比NandFlash来说较高。32NORFlash和NANDFlash的比照:〔4〕、可靠性性比照所有FlashMemory器件存在位交换现象。FlashMemory在读写数据过程中,偶然会产生一位或几位数据错误,即位反转〔一个bit位发生翻转〕。位反转无法防止,只能通过其他手段对产生的结果进行事后处理。位反转的问题多见于NANDFlash,NAND的出现几率要比NorFlash大得多。NANDFlash的供货商建议使用NANDFlash的时候,同时使用EDC/ECC〔错误探测/错误纠正〕算法,以确保可靠性。33如目前市场上一片4Mbyte的AM29lv320

NorFlash零售价在20元左右,而一片128MByte的k9f1g08

NandFlash零售价在30元左右。

34NORFlash和NANDFlash的比照:〔4〕、可靠性性比照FlashMemory在使用过程中,可能导致某些区块的损坏。区块一旦损坏,将无法进行修复。NANDFlash中的坏块是随机分布的,尤其是NANDFlash在出厂时就可能存在这样的坏块〔已经被标识出〕。NANDFlash需要对介质进行初始化扫描以发现坏块,并将坏块标记为不可用。如果对已损坏的区块进行操作,可能会带来不可预测的错误。35NORFlash和NANDFlash的比照:〔5〕、应用方面比照NORFlash主要应用在代码存储介质中,应用程序可以直接在NORFlash内运行,不需要再把代码读到系统RAM中运行。NANDFlash适用于资料存储。NANDFlash结构可以到达高存储密度,并且写入和擦除的速度也很快。NANDFlash读和写操作采用512B的块,类似硬盘管理操作。因此,基于NAND的闪存可以取代硬盘或其他块设备。36NORFlash和NANDFlash的比照:〔5〕、应用方面比照在NORFlash上运行代码不需要任何的软件支持。在NANDFlash上进行同样操作时,通常需要驱动程序,也就是内存技术驱动程序〔MTD〕。NANDFlash和NORFlash在进行写入和擦除操作时都需要MTD。37NORFlash和NANDFlash的比照:〔6〕、寿命比照在NANDFlash中每个块的最大擦写次数是一百万次,而NORFlash的擦写次数是十万次。NANDFlash除了具有10:1的块擦除周期优势,典型的NANDFlash块尺寸要比NOR型闪存小8倍,每个NANDFlash的内存块在给定的时间内删除次数要少一些。384.小型快速闪存卡〔CompactFlash,CF卡〕CF卡由美国SanDisc公司开发的一种1英寸半见方的小型快速闪存卡,它是利用Flash技术的存储卡。主要供数字相机和MP3播放机以及个人数字助理〔PDA〕装用。有各种不同的存贮容量〔MB〕,其内部结构如以下图所示。图CF卡内部结构394.小型快速闪存卡〔CompactFlash,CF卡〕CF卡接口具有PCMCIA-ATA功能,可以工作在IDE接口模式,也可以工作在PCCard模式。衍生出来的CF+卡物理规格和CF完全相同,在手持设备上应用,如CF串口卡、CFModem.CF蓝牙、CFUSB卡、CF网卡、CFGPS卡、CFGPRS卡等。按照CF+卡标准,它不一定要支持ATA接口。通常建议CF+卡工作在PCMCIA模式。CF卡可以看作是PCMCIA卡的一个子集,可以通过物理上的转换器,直接转换成PCMCIA卡使用。CF卡可分为I型和II型两类,二者的规格和特性根本相同,只是II型比I型略厚一些〔5.0mm,3.3mm〕,II型插座可以同时兼容I型卡。405.平安数据卡〔SecureDigitalCard,SD卡〕由日本Panasonic公司、TOSHIBA公司和美国SanDisk公司共同开发研制的SD卡是一种全新的存储卡产品,在MP3、数码摄像机、数码相机、电子图书及AV器材等中应用。SD存储卡采用一个完全开放的标准〔系统〕,外形与MultiMedia卡保持一致,比MMC卡略厚,具有更大的容量,兼容MMC卡接口标准。SD卡具有加密功能,可以保证数据资料的平安保密。SD卡具有版权保护技术,所采用的版权保护技术是DVD中使用的CPRM技术〔可刻录介质内容保护〕。416.硬盘存储器硬盘存储器具有存储容量大,使用寿命长,存取速度较快的特点,也是在嵌入式系统中常用的外存。426.硬盘存储器硬盘存储器的硬件包括硬盘控制器〔适配器〕、硬盘驱动器以及连接电缆。硬盘控制器〔HardDiskController,简称HDC〕对硬盘进行管理,并在主机和硬盘之间传送数据。硬盘控制器以适配卡的形式插在主板上或直接集成在主板上,然后通过电缆与硬盘驱动器相连。硬盘驱动器〔HardDiskDrive,简称HDD〕中有盘片、磁头、主轴电机〔盘片旋转驱动机构〕、磁头定位机构、读/写电路和控制逻辑等。43硬盘存储器可分为温彻斯特盘和非温彻斯特盘两类。温彻斯特盘是根据温彻斯特技术设计制造的,它的磁头、盘片、磁头定位机构、主轴、甚至连读/写驱动电路等都被密封在一个盘盒内,构成一个头一盘组合体。温彻斯特盘的防尘性能好,可靠性高,对使用环境要求不高。非温彻斯特盘磁盘的磁头和盘片等不是密封的,通常只能用于中型、大型计算机机房中。最常见的硬盘接口是IDE〔ATA〕和SCSI两种,一些移动硬盘采用PCMCIA或USB接口。44IDE〔IntegratedDriveElectronics,电子集成驱动器〕接口也称为ATA接口,是一个通用的硬盘接口。SCSI〔SmallComputerSystemInterface,小型计算机系统接口〕不是专为硬盘设计的,是一种总线型接口。SCSI独立于系统总线工作,其系统占用率极低,但其价格昂贵,具有这种接口的硬盘大多用于效劳器等高端应用场合。45Bootloader简介一个嵌入式Linux系统从软件的角度看通常可以分为四个层次:1.引导加载程序。包括固化在固件中的boot代码(可选),和BootLoader两大局部。2.Linux内核。特定于嵌入式板子的定制内核以及内核的启动参数。3.文件系统。包括根文件系统和建立于Flash内存设备之上文件系统。4.用户应用程序46Bootloader简介引入:对于计算机系统来说,从开机上电到操作系统启动需要一个引导过程。嵌入式Linux系统同样离不开引导程序,这个引导程序就叫做BootLoader。47Bootloader简介比照:PC机中的引导加载程序由BIOS(其本质就是一段固件程序)和位于硬盘中的OSBootLoader一起组成。BIOS在完成硬件检测和资源分配后,将硬盘中的BootLoader读到系统的RAM中,然后将控制权交给OSBootLoader。BootLoader的主要运行任务就是将内核映象从硬盘上读到RAM中,然后跳转到内核的入口点去运行,也即开始启动操作系统。48Bootloader简介而在嵌入式系统中,通常并没有像BIOS那样的固件程序。因此整个系统的加载启动任务就完全由BootLoader来完成.49Bootloader简介Bootloader的概念和功能BootLoader是在操作系统内核运行之前运行的一段小程序。它的作用是初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个适宜的状态,以便为最终调用操作系统内核准备好正确的环境。50Bootloader简介Bootlaoder的不统一性/不通用性通常BootLoader是依赖于硬件而实现的,特别是在嵌入式领域,为嵌入式系统建立一个通用的BootLoader是很困难的。当然,我们可以归纳出一些通用的概念来,以便我们了解特定BootLoader的设计与实现。当前在嵌入式Linux系统中,有了一些流行和通用的Bootloader框架。现实开发中,我们都是采用现有的BootLoader进行修改。51Bootloader启动嵌入式Linux系统中系统加电或复位后,所有CPU都会从某个地址开始执行,具体的地址值是由处理器设计决定的。比方,X86复位向量在高端地址开始,ARM的CPU在复位时通常都从地址0x00000000取它的第一条指令。基于ARM处理器构建的嵌入式系统通常都有某种类型的固态存储设备(比方:ROM、EEPROM或FLASH等)被映射到这个预先安排的地址上。所以bootloader通常是放在flash中的最前面的位置,CPU将首先执行Bootloader程序。52Bootloader启动用户可以利用串口和Bootloader进行交互比方:输出打印信息到串口,从串口读取用户控制字符等。53Bootloader启动Bootloader多数是两阶段的启动过程,既能提供复杂的功能又有很好的可移植性第一个启动阶段是和硬件平台相关的,大都采用汇编程序编写第二个启动阶段是和硬件平台无关的,大都采用C语言编写。54stage1的步骤(汇编)硬件设备初始化。为加载BootLoader的stage2准备RAM空间。拷贝BootLoader的stage2到RAM空间中。设置好堆栈。跳转到stage2的C入口点。

Bootloader启动55stage2的步骤(c语言)初始化本阶段要使用到的硬件设备。检测系统内存映射(memorymap)。将kernel映像和根文件系统映像从flash上读到RAM空间中。为内核设置启动参数。调用内核。

Bootloader启动56Bootloader启动bootloader在执行第一个局部的时候,也就是stage1的时候,会把bootloaderstage2这局部copy到ram中去运行。stage2的时候,会将kernel也copy到内存中。在结束的阶段,让执行地址跳转到操作系统的入口地址,操作系统也就启动来了。57Bootloader启动大多数Bootloader都包含两种不同的操作模式:启动加载模式下载模式58Bootloader启动启动加载〔Bootloading〕模式也称为“自主〞〔autonomous〕模式:BootLoader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。这种模式是BootLoader的正常工作模式,因此在嵌入式产品发布的时侯,BootLoader显然必须工作在这种模式下。59Bootloader启动下载〔Downloading〕模式:在这种模式下,目标机上的BootLoader将通过串口连接或网络连接等通信手段从主机〔Host〕下载文件,比方:下载内核映像和根文件系统映像等。从主机下载的文件通常首先被Bootloader保存到目标机的RAM中,然后再被Bootloader写到目标机上的FLASH类固态存储设备中。BootLoader的这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用BootLoader的这种工作模式。60BootLoader的stage1代码分析1〕根本的硬件初始化这是BootLoader一开始就执行的操作,其目的是为stage2的执行以及随后的kernel的执行准备好一些根本的硬件环境。它通常包括以下步骤〔以执行的先后顺序〕:

61BootLoader的stage1代码分析1〕根本的硬件初始化〔1〕.屏蔽所有的中断。为中断提供效劳通常是OS设备驱动程序的责任,因此在BootLoader的执行全过程中可以不必响应任何中断。中断屏蔽可以通过写CPU的中断屏蔽存放器或状态存放器〔比方ARM的CPSR存放器〕来完成。〔2〕.设置CPU的速度和时钟频率。62BootLoader的stage1代码分析1〕根本的硬件初始化〔3〕.RAM初始化。正确设置内存控制器的控制存放器,使CPU能够正常访问内存。〔4〕.初始化LED。典型地,通过GPIO来驱动LED,其目的是说明系统的状态是OK还是Error。如果板子上没有LED,那么也可以通过初始化UART向串口打印BootLoader的Logo字符信息来完成这一点。〔5〕.关闭CPU内部指令/数据cache。63BootLoader的stage1代码分析2〕为加载stage2准备RAM空间为了获得更快的执行速度,通常把stage2加载到RAM空间中来执行,因此必须为加载BootLoader的stage2准备好一段可用的RAM空间范围。由于stage2通常是C语言执行代码,因此在考虑空间大小时,除了stage2可执行映象的大小外,还必须把堆栈空间也考虑进来。此外,空间大小最好是memorypage大小(通常是4KB)的倍数。一般而言,1M的RAM空间已经足够了。具体的地址范围可以任意安排,推荐将stage2安排到整个RAM空间的最顶1MB。必须确保所安排的地址范围确实是可读写的RAM空间。64BootLoader的stage1代码分析RAM空间范围的大小记为:stage2_size(字节),把起始地址和终止地址分别记为:stage2_start和stage2_end(这两个地址均以4字节边界对齐)。因此:

stage2_end=stage2_start+stage2_size65BootLoader的stage1代码分析3〕拷贝stage2到RAM中拷贝时要确定两点:(1)stage2的可执行映象在固态存储设备的存放起始地址和终止地址;(2)RAM空间的起始地址。66BootLoader的stage1代码分析4〕设置堆栈指针sp堆栈指针的设置是为了执行C语言代码作好准备。通常把sp的值设置为stage2_end-4。此外,在设置堆栈指针sp之前,也可以关闭led灯,以提示用户我们准备跳转到stage2。67BootLoader的stage1代码分析5〕跳转到stage2的C入口点在上述一切都就绪后,就可以跳转到BootLoader的stage2去执行了。比方,在ARM系统中,这可以通过修改PC存放器为适宜的地址来实现。68BootLoader的stage1代码分析bootloader的stage2可执行映象刚被拷贝到RAM空间时的系统内存布局

69BootLoader的stage2代码分析1〕初始化本阶段要使用到的硬件设备这通常包括:〔1〕初始化至少一个串口,以便和终端用户进行I/O输出信息;〔2〕初始化计时器等。在初始化这些设备之前,也可以重新把LED灯点亮,以说明我们已经进入main()函数执行。设备初始化完成后,可以输出一些打印信息,程序名字字符串、版本号等。70BootLoader的stage2代码分析2〕检测系统的内存映射〔memorymap〕32位CPU空间大小:所谓内存映射就是指在整个4GB物理地址空间中有哪些地址范围被分配用来寻址系统的RAM单元。比方,在SamsungS3C44B0XCPU中,从0x0c00,0000到0x1000,0000之间的64M地址空间被用作系统的RAM地址空间。71BootLoader的stage2代码分析2〕检测系统的内存映射〔memorymap〕虽然CPU通常预留出一大段足够的地址空间给系统RAM,但是在搭建具体的嵌入式系统时却不一定会实现CPU预留的全部RAM地址空间。也就是说,具体的嵌入式系统往往只把CPU预留的全部RAM地址空间中的一局部映射到RAM单元上,而让剩下的那局部预留RAM地址空间处于未使用状态。因此BootLoader的stage2必须在它想干点什么之前检测整个系统的内存映射情况,也即它必须知道CPU预留的全部RAM地址空间中的哪些被真正映射到RAM地址单元,哪些是处于"unused"状态的。72BootLoader的stage2代码分析3〕加载内核映像和根文件系统映像规划内存占用的布局,包括两个方面:〔1〕内核映像所占用的内存范围;〔2〕根文件系统所占用的内存范围。Flash设备上拷贝映像73BootLoader的stage2代码分析4〕设置内核的启动参数在将内核映像和根文件系统映像拷贝到RAM空间中后,就可以准备启动Linux内核了。但是在调用内核之前,需要设置Linux内核的启动参数。74BootLoader的stage2代码分析4〕设置内核的启动参数Linux2.4.x以后的内核都以标记列表的形式来传递启动参数。启动参数标记列表以标记ATAG_CORE开始,以标记ATAG_NONE结束。每个标记由标识被传递参数的tag_header结构以及随后的参数值数据结构来组成。数据结构tag和tag_header定义在Linux内核源码的include/asm/setup.h头文件中75BootLoader的stage2代码分析4〕设置内核的启动参数在嵌入式Linux系统中,通常需要由BootLoader设置的常见启动参数有:ATAG_CORE、ATAG_MEM、ATAG_CMDLINE、ATAG_RAMDISK、ATAG_INITRD等。76BootLoader的stage2代码分析5〕调用内核BootLoader调用Linux内核的方法是直接跳转到内核的第一条指令处。在跳转时,以下条件要满足:〔1〕CPU存放器的设置:R0=0;R1=机器类型ID;关于MachineTypeNumber,可以参见linux/arch/arm/tools/mach-types。R2=启动参数标记列表在RAM中起始基地址;〔2〕CPU模式:必须禁止中断〔IRQs和FIQs〕;CPU必须SVC模式;77BootLoader的stage2代码分析5〕调用内核BootLoader调用Linux内核的方法是直接跳转到内核的第一条指令处。在跳转时,以下条件要满足:〔3〕Cache和MMU的设置:MMU必须关闭;指令Cache可以翻开也可以关闭;数据Cache必须关闭;78常用Bootloader介绍嵌入式系统世界已经有各种各样的Bootloader,种类划分的方法也不是唯一的。一般可以按照它所支持处理器体系结构不同进行划分。嵌入式比较常见的有ARMBoot、Redboot、Uboot、Blob和Vivi等79常用Bootloader介绍ARMboot是一个ARM平台的开源固件工程,它基于PPCBOOT,已经与PPCBOOT工程合并,新的工程为U-Boot。ARMboot支持的处理器构架有StrongARM、ARM720T和PXA250等ARMboot的目标是成为通用的、容易使用和移植的引导程序,非常轻便地运用于新的平台上。ARMboot是GPL下的ARM固件工程中唯一支持Flash闪存、BOOTP、DHCP和TFTP网络下载PPCBoot是功能十分强大的Bootloader

80常用Bootloader介绍Redboot是在ECOS的根底上剥离出来的,继承了ECOS的简洁、轻巧、可灵活配置、稳定可靠等品质优点。Redboot支持的处理器构架有ARM,MIPS,MN10300,PowerPC,x86等,是一个完善的嵌入式系统BootLoader。eCOS-嵌入式可配置操作系统,由Redhat推出的小型即时操作系统(Real-Timeoperatingsystem),最低编译核心可小至10K的级别,适合用于作bootloader增强,微小型系统。81常用Bootloader介绍U-Boot,UniversalBootLoaderU-Boot是由开源工程PPCBoot开展起来的,ARMboot并入了PPCBoot。2002年12月17日第一个版本发布,同时PPCBoot和ARMboot停止维护。U-Boot被认为是功能最多,最具弹性以及开发最积极的开放源码bootloader。是德国DENX小组开发的用于多种嵌入式CPU的Bootloader引导程序,它已经停止开发,转而开发U-boot.基于PPCboot,它只支持ARM.如同PPCboot,它的开发目前已经终止,转而开发u-boot.82常用Bootloader介绍U-Boot支持的处理器构架包括PowerPC,ARM,MIPS,x86等。U-Boot的功能强大,涵盖了绝大局部处理器构架,提供大量外设驱动,支持多个文件系统,附带调试、脚本和引导等工具。U-boot可配置性非常强,它所支持的命令也可以通过配置来增减。U-boot的命令主要包括以下几类:信息类命令、环境变量类命令、存储器命令、Flash专用命令、载类命令、启动类命令和Cache类命令。83常用Bootloader介绍Blob(BootLoaderObject)是由Jan-DerkBakker和ErikMouw发布的,是专门为StrongARM构架下的LART设计的BootLoader。Blob功能比较齐全,代码较少,比较适合做修改移植,用来引导Linux,目前大局部S3C44B0板都用移植的Blob来加载uClinux。84常用Bootloader介绍各种Bootloader所支持处理器85U-Boot介绍U-Boot(UinversalBootLoader)U-Boot特点代码结构清晰,易于移植支持多种处理器体系结构〔见程序结构cpu〕支持众多参考版〔目前官方包中有200多种,见程序结构board目录〕命令丰富,有监控功能支持网络协议、USB、SD等多种协议和设备支持多种文件系统更新活泼,使用者众多86U-Boot介绍U-Boot目录结构平台相关board、cpu、lib_arm、include平台无关common、net、fs、drivers工具和文档tools、docu-boot起始代码在此87U-Boot上电启动后,敲任意键可以退出自动启动状态,进入命令行,并出现相应的命令提示符。在命令行提示符下,可以输入U-Boot的命令并执行。U-Boot可以支持几十个常用命令,通过这些命令,可以对开发板进行调试,可以引导Linux内核,还可以擦写Flash完成系统部署等功能。掌握这些命令的使用,才能够顺利地进行嵌入式系统的开发。U-Boot的常用命令介绍88输入help命令,可以得到当前U-Boot的所有命令列表。每一条命令后面是简单的命令说明。Uboot>helpU-Boot还提供了更加详细的命令帮助,通过help命令还可以查看每个命令的参数说明。

Uboot>

helpcp//为cp命令提供辅助说明

cp[.b,.w,.l]sourcetargetcount

-copymemorycp.b、cp.w、cp.l分别可用来复制byte、word和long类型的数据。U-Boot的常用命令介绍8921U-Boot的常用命令介绍1〕protect:protect命令用于对Flash进行写保护,可以使能和解除写保护。2〕erase:erase命令可以擦除Flash。3〕setenv:setenv命令可以设置环境变量。4〕printenv:printenv命令可以打印全部环境变量,也可以只打印参数中列出的环境变量。5〕saveenv:saveenv命令保存环境变量及其值到flash中。9021U-Boot的常用命令介绍6〕tftpboot:tftpboot命令能够使用TFTP协议通过网络下载二进制格式的文档。另外,使用这个命令,必须配置好相关的环境变量。例如serverip和ipaddr。其命令格式为:tftpboot[loadAddress][bootfilename]第1个参数loadAddress是下载到的内存地址。第2个参数是要下载的文件名称,必须放在TFTP效劳器相应的目录下。9121U-Boot的常用命令介绍7〕bootm:

bootm命令可以引导启动存储在内存中的程序映像。这些内存包括RAM和可以永久保存的Flash。其命令格式为:bootm[addr[arg...]]8〕go:go命令能够执行应用程序。其命令格式为:goaddr[arg...]9〕loads:loads命令可以通过串口线下载S-Record格式的文件。922210〕loadb:loadb命令能够通过串口线下载二进制格式的文档。其命令格式为:loadb[off][baud]11〕flinfo:flinfo命令打印全部Flash组的信息,也可以只打印其中某个组的信息。一般嵌入式系统的Flash只有一个组。12〕cp:cp命令可以在内存中复制数据块,包括对Flash的读写操作。U-Boot的常用命令介绍932313〕cmp:cmp命令可以比较两块内存中的内容。.b表示以字节为单位;.w表示以字为单位;.l表示以长字为单位。14〕mw:mw命令可以按照字节、字、长字写内存,.b,w,l的用法与cp命令相同。15〕nfs:nfs命令可以使用NFS网络协议通过网络启动映像。16〕nm:nm命令用于修改内存,可以按照字节、字、长字操作。17〕run:run命令可以执行环境变量中的命令,后面参数可以是几个环境变量名。18〕sleep:sleep命令可以延迟N秒钟执行,N为十进制数。U-Boot的常用命令介绍94printenv打印环境变量。

Uboot>printenv

baudrate=115200

ipaddr=

ethaddr=12:34:56:78:9A:BC

serverip=

Environmentsize:80/8188bytes

U-Boot的常用命令介绍95setenv设置新的变量

Uboot>setenvmyboardAT91RM9200DK

Uboot>printenv

baudrate=115200

ipaddr=

ethaddr=12:34:56:78:9A:BC

serverip=

myboard=AT91RM9200DK

Environmentsize:102/8188bytes

U-Boot的常用命令介绍96saveenv保存变量

命令将当前定义的所有的变量及其值存入flash中。用来存储变量及其值的空间只有8k字节,不要超过。例:setenvethaddr12:34:56:78:9A:BC//设置开发板的物理地址setenvipaddr//设置开发板的IPsetenvserverip54//设置效劳器的IPsaveenv//保存U-Boot的常用命令介绍97U-Boot命令介绍tftp通过网络下载程序需要先设置好网络

Uboot>setenvethaddr12:34:56:78:9A:BC

Uboot>setenvipaddr

Uboot>setenvserverip54〔tftp效劳器的地址〕下载bin文件到地址0x20000000处。

Uboot>tftp20000000application.bin〔application.bin应位于tftp效劳器相应的目录下〕把server〔IP=环境变量中设置的serverip〕中/tftpdroot/下的vmlinux通过TFTP读入到物理内存32000000处。Uboot>tftp32000000vmlinux98Bootloader制作用u-boot实现Bootloader有两种启动方式:SDcard启动:通过扩展槽插入、外置NANDFLASH启动:内存启动

99Bootloader制作u-boot源码结构介绍:board:是和一些已有开发板相关的文件,在里面可以找到samsung目录;进入此目录,我们用到的是smdk6410,在里面可看到相应的Makefile,U-boot.lds等。

common是与体系结构无关的文件,实现各种命令的C文件

100Bootloader制作u-boot源码结构介绍:CPU:在这目录下都是以u-boot所支持的CPU为名,本开发板6410就是用了s3c64xxcpu.c是初始化CPU,设置指令Cache和数据Cache等;interrupt.c设置系统的各种中断和异常;start.S是u-boot启动时执行的第一个文件,主要是设置系统堆栈和工作方式,为进入C程序奠定根底。101Bootloader制作u-boot源码结构介绍:disk:是disk驱动的分区处理代码;doc:是文档;drivers:是通用设备驱动程序;fs:是支持文件系统的文件;net:是网络有关的代码lib_arm:是ARM体系结构相关的代码;tools:存放制作S-Record或者U-Boot格式的映像等工具,例如mkimage102Bootloader制作u-boot源码结构介绍:include:是头文件、对各种硬件平台支持的汇编文件、系统的配置文件和对文件系统支持的文件。在里面的configs里有smdk6410.h。在这个头文件里面可以确定教学平台是从SDcard或nandflash启动。查看:#vi/include/configs/smdk6410.h当CONFIG_BOOT_MOVINAND被宏定义,那么板子是从SDcard启动。反之,从nandflash启动。设置行号:setnu439行,#defineCONFIG_BOOT_MOVINAND103Bootloader制作配置和编译将拷贝到工作目录下解压:#tar-zxvf解压完后在当前目录下生成一个目录104Bootloader制作配置和编译include头文件,里面的configs里有smdk6410.h,这个文件决定开发板是由SD卡启动还是NandFlash启动

viinclude/configs/smdk6410.h

#defineCONFIG_BOOT_MOVINAND用makedistclean命令清理一下编译设置顶层目录makefile中交叉工具的路径

exportCROSS_COMPILE在161行105Bootloader制作配置和编译配置uboot:#makesmdk6410_config

从makefile文件中的smdk6410_config位置开始执行编译uboot:#make将所有.C文件编译成.O文件;将.O文件编译成可执行文件在此目录下生成Bootload文件u-boot.bin106Bootloader制作配置和编译把u-boot.bin改为u-boot-movi.bin,以表示从SD启动

#mvu-boot.binu-boot-movi.bin107Bootloader制作配置和编译设置顶层目录makefile中交叉工具的路径

exportCROSS_COMPILE查看源码结构:#vi/include/configs/smdk6410.h当CONFIG_BOOT_MOVINAND没被宏定义,而定义的是CONFIG_BOOT_NAND,说明从nandflash启动。Bootargs配置,默认#defineCONFIG_BOOTARGS“root=/dev/mtdblock2rootfstype=yaffs2init=/linuxrcconsole=ttySAC0,115200〞查看或修改/include/configs/smdk6410.h文件108Bootloader制作配置和编译从makefile文件中的smdk6410_config位置开始执行

在目录下

#makesmdk6410_config编译uboot:在目录下

#make生成u-boot.bin109Bootloader制作把生成的u-boot.bin文件改为u-boot-nand.bin,以表示从NANDFLASH启动#mvu-boot.binu-boot-nand.bin将生成的两个文件u-boot-movi.bin和u-boot-nand.bin拷出110Bootloader制作加载带QT的根文件系统的bootloader制作源码:u-boot-1.1.6-Linux-s3c6410-nand-yaffs2修改/include/configs/smdk6410.h文件#defineCONFIG_BOOTARGS“root=/dev/mtdblock3rootfstype=cramfsinit=/linuxrcconsole=ttySAC0,115200〞说明/dev/mtdblock3:表示MTD分区的第3个分区存储根文件系统rootfstype=cramfs:分区是cramfs类型init=/linuxrc:启动的首个脚本即根目录下的linuxrcconsole=ttySAC0,115200:使用串口1作为串口调试,波特率设置为115200;(现在已经摒弃了以前使用ttyS0的写法)111加载带QT的根文件系统的bootloader制作配置和编译从makefile文件中的smdk6410_config位置开始执行

在目录下

#makesmdk6410_config编译uboot:

在目录下

#make生成u-boot.bin112加载带QT的根文件系统的bootloader制作把生成的u-boot.bin文件改为u-boot-nand_qt.bin#mvu-boot.binu-boot-nand_qt.bin113内核剪裁与编译内核移植有体系结构级〔arch〕、板级〔BSP〕、芯片级〔SOC〕。大多是板级。/arch/arm/下plat-XXmach-XX内核节拍、中断管理、时钟、GPIO、DMA、IO内存映射plat-XX下,通用局部mach-XX,不通用局部BSP级相关代码分布在plat-XXmach-XX体系结构级分布在/kernel、/mm114内核剪裁与编译Linux内核功能结构Linux内核源代码布局Linux内核的移植Linux的编译和定制内核剪裁与编译实例115Linux内核功能结构内核〔kernel〕是操作系统的内部核心程序,它向外部提供了对计算机系统资源进行请求和管理的调用接口和效劳116Linux内核功能结构可以将操作系统的代码分成两局部:内核所在的地址空间称为内核空间;而在内核以外,剩下的程序统称为外部管理程序,它们大局部是对外围设备的管理和界面操作,外部管理程序与用户进程所占据的地址空间称为外部空间。通常,一个程序会跨越两个空间。当执行到内核空间的一段代码时,称程序处于内核态当程序执行到外部空间代码时,称程序处于用户态。117Linux内核功能结构在Linux中,可以动态装入和卸载内核中的局部代码。Linux中将这样的代码段称做模块〔module〕,并对模块给予了强有力的支持。在Linux中,可以在需要时自动装入和卸载模块。118Linux内核功能结构Linux内核的结构119Linux内核功能结构Linux内核主要由5个模块构成,它们分别是:进程调度模块:进程调度控制系统中的多个进程对CPU的访问,使得多个进程能在CPU中微观串行,宏观并行地执行。内存管理模块:控制多个进程平安地共享主内存区域。当CPU提供内存管理单元时,Linux内存管理完成为每个进程进行虚拟内存到物理内存的转换。一般而言,每个进程享有4GB的内存空间,0-3GB属于用户空间,3-4GB属于内核空间。120Linux内核功能结构Linux内核主要由5个模块构成,它们分别是:文件系统模块:支持对外部设备的驱动和存储进程间通信模块:进程间多种通信机制,包含信号量、共享内存、管道等,可协助多个进程、多资源的互斥访问、进程间的同步和消息传递网络接口模块:提供对多种网络通信标准的访问并支持许多网络硬件

121Linux内核功能结构内核模块之间的依赖关系122Linux内核功能结构内核模块之间的依赖关系所有的模块都与进程调度模块存在依赖关系。因为它们都需要依靠进程调度程序来挂起〔暂停〕或重新运行它们的进程。通常,一个模块会在等待硬件操作期间被挂起,而在操作完成后才可继续运行。进程调度子系统需要使用内存管理器来调整一特定进程所使用的物理内存空间123Linux内核功能结构内核模块之间的依赖关系进程间通信子系统那么需要依靠内存管理器来支持共享内存通信机制。虚拟文件系统也会使用网络接口来支持网络文件系统〔NFS〕,同样也能使用内存管理子系统来提供内存虚拟盘〔ramdisk〕设备。而内存管理子系统也会使用文件系统来支持内存数据块的交换操作。124Linux内核源代码布局安装的时候,如果选择了KernelDevelop,那么会在/usr/src/linux下找到源代码。根据各个目录的名字,可以容易猜出各个目录里面的文件的功能125Linux内核源代码布局Linux用来支持各种体系结构的源代码包含大约4500个C语言程序,270个左右子目录,大约200万行代码ubuntu不带linux内核源码,需要自己下载安装不同版本目录会有些小差异126Linux内核源代码布局文件颜色白色:表示普通文件蓝色:表示目录绿色:表示可执行文件红色:表示压缩文件浅蓝色:代表链接红色闪烁:表示链接的文件有问题黄色:表示设备文件灰色:表示其他文件

127Linux内核源代码布局128Linux内核源代码布局

/include子目录包括编译内核所需要的大局部头文件。/init子目录包含了内核的初始化代码,这是内核工作的开始的起点。/arch子目录包括所有与体系结构相关的内核代码,它的每一个子目录都代表一个支持的体系结构。/drivers子目录包含了内核中所有的设备驱动程序,如块设备和SCSI设备。129Linux内核源代码布局/fs子目录包含了所有的文件系统的代码。如:ext2,vfat等。/net子目录包含了内核的连网代码。/mm子目录包含所有独立于CPU体系结构的内存管理代码,如页式存储管理内存的分配和释放等。

/ipc子目录包含了进程间通信代码。/kernel子目录包括主要的内核代码,此目录的文件实现大多数Linux系统的内核函数。/char:字符设备驱动程序。如串口、鼠标等。130Linux内核源代码布局/cdrom:包含Linux所有的CD-ROM代码。/pci:PCI卡驱动程序代码,包含PCI子系统映射和初始化代码等scsi:包含所有的SCSI代码已经Linux所支持的所有的SCSI设备驱动程序代码。sound:声卡设备驱动程序。lib目录放置内核的库代码;ipc目录包含内核进程通信的代码Documentation此目录是一些文档,起参考作用

131内核剪裁与编译Linux内核和功能结构Linux内核源代码布局Linux内核的移植Linux的编译和定制内核剪裁与编译实例132Linux内核的移植Linux移植:就是把Linux操作系统针对具体的目标平台做必要改写之后,安装到该目标平台,使其正确地运行起来,即把内核从一种硬件平台转移到另外一种硬件平台上运行。对于嵌入式Linux系统来说,有各种体系结构的处理器和硬件平台,并且用户需要根据需求自己定制硬件板。只要硬件平台有些变化,即使非常小,可能也需要做一些移植工作。133Linux内核的移植内核移植工作主要是修改跟硬件平台相关的代码,一般不涉及Linux内核通用的程序。移植的难度也取决于两种硬件平台的差异。目前Linux内核的社区已经对常见的硬件平台做了很多工作,移植工作已经简单了通常都可以找到相同处理器的参考板,并且可以获取到Linux内核源代码。134Linux内核的移植移植的准备工作:选择参考板,获取到Linux内核源代码分析内核代码,弄清楚哪些设备有驱动程序,哪些还没有。确信Linux对参考板的支持情况,配置编译Linux内核,在目标板上运行测试。可能最新的Linux内核版本支持的最好,但是也可能需要在老内核版本上打补丁。分析平台相关的局部代码实现;分析内核编译组织方式;分析内核启动的初始化程序;分析驱动程序的实现。135Linux内核的移植移植过程的根本内容:根据具体目标平台对内核源码进行必要的改写〔主要是修改体系结构相关局部〕。添加一些外设的驱动,打造一款适合需要的目标平台〔可以是嵌入式便携设备也可以是其它体系结构的PC机〕的新操作系统,对该系统进行针对具体目标平台的交叉编译,生成一个内核映象文件最后通过一些手段把该映象文件烧写〔安装〕到目标平台中。136Linux内核的移植通常,对Linux源码的改写工作难度较大,它要求不仅对Linux内核结构要非常熟悉,还要求对目标平台的硬件结构要非常熟悉,同时还要求对相关版本的汇编语言较熟悉,因为与体系结构相关的局部源码往往是用汇编写的。所以这局部工作一般由目标平台提供商来完成。开发者所要做的就是从目标平台提供商的网站上下载相关版本Linux内核的补丁〔Patch〕。把它打到Linux内核上,再进行交叉编译就行。137编译内核前的准备工作如果用户想要使用内核的一些新特性,或想根据自己的系统量身定制一个更高效或更稳定的内核,就需要重新编译内核。

编译内核包含两大项内容:第一步:配置内核第二步:编译内核。

138编译内核前的准备工作编译内核前先要了解自己系统的硬件配置情况,比方CPU的类型、主板芯片、显卡和声卡的型号以及其他相关参数等。也要了解现有内核的版本号uname-aLinuxlocalhostlocaldomain2.6.32-2c1generic#32-UbuntuSMPFriApr1608:10:28EST2003i686i686i686GNU/Linux把下载好的打包的内核解开。压缩的内核、补丁和解开的源代码总共要占70M左右的硬盘空间。139用root登录,解开的源代码应该在/usr/src/Linux2.4.20-8下面:#tar-zxvfLinux2.4.20-8.tar.gz或者#gzip-tLinux2.4.20-8.tar.gz#tar-xLinux2.4.20-8.tar140编译内核第一步:配置内核在开始配置内核之前,首先需要通过下面的命令去除所有的临时文件、中间件和配置文件。#makemrproper对于一个刚从网上下载的内核来说,它肯定是干净的,这么做只会多此一举。但是这是一个良好习惯,而且不会有坏结果。141编译内核第一步:配置内核删除的文件范围从小到大依次为:makeclean<makemrproper<makedistclean执行makemrproper,会先执行makeclean,执行makedistclean之前,会先执行makemrpropermakeclean:删除大多数的编译生成文件,但是会保存内核的配置文件.config,还有足够的编译支持来建立扩展模块;makemrproper:删除所有的编译生成文件,还有内核配置文件,再加上各种备份文件;makedistclean:mrproper删除的文件,加上编辑备份文件和一些补丁文件。142编译内核第一步:配置内核配置内核可以根据需要与爱好使用以下命令中的一个:makeconfig:基于文本的最为传统的配置界面,不推荐使用makemenuconfig:一个文本模式、简单的菜单模式的配置界面,字符终端下推荐。makexconfig:基于图形窗口的模式的配置界面,Xwindow下推荐。makeoldconfig:如果只想在原来内核配置的根底上修改一些小地方,会省去不少麻烦。通过命令界面配置内核,但是会自动载入既有的.config配置文件,并且只有在遇到先前没有设定过的选项时,才会要求你手动设定。143编译内核第一步:配置内核makemenuconfig:一个文本模式、简单的菜单模式的配置界面,字符终端下推荐。144编译内核第一步:配置内核makexconfig:基于图形窗口的模式的配置界面,Xwindow下推荐。145编译内核第一步:配置内核每个选项前面都有一个“[]〞或“<>〞“[]〞表示该选项有两种选择:[*]直接编译进内核[]不编译“<>〞表示该选项有三种选择:<*>直接编译进内核<>不编译<M>编译成模块形式,但不编译进内核Y选择,N不选择146编译内核第一步:配置内核配置内核内容:设置编译工具路径〔.cross_compile〕确定目标板类型〔Makefile〕选择cpu系列设置文件系统设备驱动:设备驱动类型、网口驱动、鼠标驱动、摄像头驱动、显示屏驱动、声卡驱动147编译内核第二步:编译内核编译内核的软件环境:构建一个完整并能够运行的Linux内核所需要的一切资源。这些资源包括构建程序、脚本、中间件、配置文件和Makefile。148编译内核第二步:编译内核与编译有关的命令makedep:读取配置过程生成的配置文件,来创立对应于配置的依赖关系树,从而决定哪些需要编译而哪些不需要编译makebzImage、makezImage:编译内核,生成的内核是使用gzip压缩的;前者可以生成大一点的内核makeall:

编译所有了,包括kernel以及modules了。make149与编译有关的命令makemodules和makemodules_install:分别生成相应的模块和把模块拷贝到需要的目录中。depmod–a:严格说来,depmod-a命令和编译过程并没有关系,它是生成模块间的依赖关系,这样你启动新内核之后,使用modprobe命令加载模块时就能正确地定位模块。makeinstall:安装编译好的内核,他会在/boot下安装vmlinuz以及System.map文件。当然你也可以自己手动的方式进行cp了。

150内核剪裁与编译Linux内核和功能结构Linux内核源代码布局Linux内核的移植Linux的编译和定制内核剪裁与编译实例151内核剪裁与编译实例解压内核修改隐藏文件.cross_compile设置顶层Makefile中ARCH:配置内核编译内核152解压内核建立工作目录,解压内核:将拷贝到工作目录下;通过tar-zxvf解压;解压完后,在当前目录生成一个目录。

153修改隐藏文件进入内核源码目录,修改隐藏文件.cross_compilesudovi.cross_compile确保编译工具的路径是正确的,保存退出。

确保顶层Makefile里

ARCH:=arm

不然编译的是X86架构的内核,这是不能在ARM架构上运行的154内核剪裁与编译实例

解压内核修改隐藏文件.cross_compile配置内核编译内核155配置内核编译配置内核前系统需安装libncurses5-dev这个库,否那么makemenuconfig这个命令用不了连网安装如下:#sudoapt-getinstalllibncurses5-dev156配置内核在顶层目录(htx-linux-2.6.24-yaffs2)下执行清理#sudomakeclean进入图形的配置内核界面。这时默认翻开的配置文件是顶层目录的.config,这是个隐藏文件,可以用#ls–a查看#sudomakemenuconfig如果没有在Makefile设置ARCH=arm这里就执行makemenuconfigARCH=arm157配置内核〔1〕SystemTypeSystemType>ARMsystemtype确保选中的是SamsungS3C24xx,S3C64xx,表示我们实验平台使用的cpu体系是SAMSUNGs3c24xxs3c64xx系列的。SystemType>S3C6410Machines,cpu是s3c6410。内核源码路径为:arch/arm/mach-s3c6410/,arch/arm/plat-s3c64xx/。158配置内核〔2〕Filesystems>Miscellaneousfilesystems,我们主要用到的文件系统是yaffs2。内核源码路径为:fs/yaffs2/。YAFFS,YetAnotherFlashFileSystem,是一种类似于JFFS/JFFS2的专门为Flash设计的嵌入式文件系统。与JFFS相比,它减少了一些功能,因此速度更快、占用内存更少。YAFFS和JFFS都提供了写均衡,垃圾收集等底层操作。AFFS2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论