您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > linux交叉编译环境
嵌入式Linux开发环境的构建主要介绍如何构建嵌入式Linux的开发环境,包括:1.创建交叉编译工具2.Linux内核的移植3.根文件系统的制作4.Bootloader的移植1商用嵌入式LINUXARMIRIXEmbeddedLinux--derivedformDebianCoollogicCoollinux--combinesLinuxandJavaCoventiveXlinux--kernelcanbeassmallas142kbEsfiaRedblueLinux--400k,designedforwirelessapps2商用嵌入式LINUXKYZOPizzaBoxLinux--Sambabasedfile,print,CDserverLineoEmbedix--supportsrealtimeandhighavailabilityappsLynuxWorksBlueCat--generalpurposeembeddedsolutionsMontaVistaLinux--generalpurposeembeddedsolutions3商用嵌入式LINUXNeowareNeoLinux–RedHatderivedforinformationappliancesPalmPalmTynux–InternetapplianceandmultimediaRedHatEmbeddedLinux–generalpurposeembeddedsolutionRedSonicRed-IceLinux–runsfromDiskonChiporCompactFlash4商用嵌入式LINUXRidgeRunDSPLinux–formultimedia,wireless,RTonDSPTimeSysLinuxGPL–lowlatencyenhancedkernelTuxiaTASTE–distrotargetsInternetappliancesVitalSystemsvLinux–forARMbasedembeddedapps5开源嵌入式LinuxEmbeddedDebianProject--–convertDebiantoanembeddedOSETLinux–forPC104SBC’suCLinux–formicroprocessorsthatdon’thaveMMUuLinux(muLinux)–distrofitsonasinglefloppy6Linux如何做到实时?7Linux如何做到实时?8Linux支持的CPUIntelX86MIPSARMStrongARMPowerPCHitachiSuperH9嵌入式系统的开发模式本机开发:在目标机中直接进行操作系统移植及应用程序的开发。----在这种方式下进行开发,首先就得在目标机中安装操作系统,并且具有良好的人机开发界面。但是由于一般的嵌入式系统都是资源受限系统,如内、外存储空间小,CPU处理速度不够快等,在这样的环境下进行嵌入式linux的开发必然会影响到系统的成本以及开发速度,所以多数情况下都不采用这种开发方式。10嵌入式系统的开发模式交叉开发:在一台主机上进行操作系统的裁剪,以及编写应用程序,在主机上应用交叉编译环境编译内核及应用程序,然后把目标代码下载到目标机上运行。这就需要在主机上安装、配置交叉编译环境(交叉开发工具链),使其能够编译成在目标机上运行的目标代码。11嵌入式系统的开发模式模拟开发:建立在交叉开发环境基础之上。----除了主机和目标机以外,还得提供一个在主机上模拟目标机的环境,这就不需要每次的修改都下载到目标机中,待程序正确后再下载到目标机上运行。这样就可以达到在没有目标机的情况下调试软件的目的。----比较著名的模拟开发环境有SkyEye,能够模拟如ARM等处理器的开发环境。-----模拟硬件环境是一件比较复杂的工程,所以多数商业嵌入式系统的开发采用的是交叉开发模式。12开发平台的选择Linux作为开发平台---选择Linux作为编译及编译的平台,这需要在Linux平台上安装交叉编译环境,然后直接在Linux平台上直接进行开发,使用Linux的文本编辑器vi或emacs来修改操作系统内核代码,编写应用程序,并使用Linux下的Minicom作为串口控制台,与目标机器进行通信。13开发平台的选择Windows作为开发平台----选择Windows作为开发平台,可以使用自己熟悉的文本编辑器来书写源代码,但需要安装cgywin软件用来提供Windows下的Linux开发环境,同时还要安装适用于cygwin的交叉开发环境,或能够自己编译出cygwin下的交叉开发工具。这种开发环境下,可以使用Windows下的串口控制台软件与目标机器进行通信。14开发平台的选择Linux服务器,Windows工作站的开发方式–如果习惯了Windows的操作,或在开发的同时还要使用Windows的其他软件,但又只习惯Linux下的交叉开发工具链,还有一种方式:搭建一个Linux服务器,在上边运行telnet和ftp服务,在Windows工作站上用telnet客户端和ftp工具远程登陆到Linux服务器来开发。151.创建交叉编译工具由于一般嵌入式开发系统存储大小有限,通常要在pc机上建立一个用于目标机的交叉编译环境。这是一个由编译器、连接器和解释器组成的综合开发环境。交叉编译工具包括:–Binutils—用于操作二进制文件的实用程序集合。包括诸如ar、as、objdump、objcopy这样的实用程序。–Gcc—GNUC编译器。–Glibc—所有用户应用程序都将链接到的C库。避免使用任何C库函数的内核和其它应用程序可以在没有该库的情况下进行编译。161.创建交叉编译工具(cont.)创建交叉编译工具的一般步骤:1.下载源文件、补丁和建立编译环境a)下载源文件linux内核源码及相应的补丁binutils-2.10.1gcc-2.95.3glibc-2.2.3glibc-linuxthreads-2.2.3b)建立工作目录,设置环境变量,安装Linux头文件。171.创建交叉编译工具(cont.)2.建立二进制工具(binutils)binutils包中的工具常用来操作二进制目标文件。该包中最重要的两个工具就是GNU汇编器as和链接器ld。3.创建初始编译器(bootstrapgcc)创建交叉编译版本的Gcc,需要交叉编译版本的glibc,而交叉编译版本的glibc是通过交叉编译版本的gcc创建的。面对这个先有鸡还是先有蛋的问题,解决的办法是先只编译对C语言的支持,并禁止支持线程。181.创建交叉编译工具(cont.)4.第一次创建c库(glibc)这一步编译好的glic还不能用,它只是第二次编译所需要的工具。后面的编译工作都需要连接到这个库上。191.创建交叉编译工具(cont.)5.建立全套编译器(fullgcc)有了交叉编译版本的glibc,就可以创建完整版本的Gcc了。6.第二次创建C库重新编译glibc,并把glibc安装到特定的工作目录中。20嵌入式Linux开发涉及的层次嵌入式Linux开发大致涉及三个层次:–引导装载程序–Linux内核–图形用户界面(或称GUI)21引导装载程序引导装载程序通常是在任何硬件上执行的第一段代码。在PC系统中,通常将引导装载程序装入主引导记录(MasterBootRecord,(MBR))中,或者装入Linux驻留的磁盘的第一个扇区中。通常,在台式机或其它系统上,BIOS将控制移交给引导装载程序。22问题在大多数情况下,嵌入式系统没有BIOS支持,如何实现第一次引导呢?23解决方法一专用软件专用软件可以直接与远程系统上的闪存设备进行交互并将引导装载程序安装在flash的给定位置中。这个软件使用目标机上的JTAG端口,它是用于执行外部输入的指令的接口JFlash-linux是一种用于直接写闪存的流行工具。它在主机机器上执行并通过JTAG接口使用并行端口访问目标闪存芯片。24解决方法二微小的引导代码根据几个字节的指令初始化一些DRAM,并启用目标上的一个串行(或者USB,或者以太网)端口与主机程序通信。然后,主机程序或装入程序可以使用这个连接将引导装载程序传送到目标上,并将它写入闪存。在安装它并给予其控制后,这个引导装载程序执行Bootloader的功能252.Bootloader的移植一、什么是bootloader(引导加载程序)BootLoader就是在操作系统内核或用户应用程序运行之前运行的一段小程序。可以初始化硬件设备、建立内存空间的映射图(有的CPU没有内存映射功能如S3C44B0),从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核或用户应用程序准备好正确的环境。262.Bootloader的移植(cont.)二、BootLoader的操作模式多数BootLoader都包含两种不同的操作模式:“启动加载(Bootloading)”模式:也称为“自主”(Autonomous)模式,也即BootLoader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。是BootLoader的正常工作模式。在嵌入式产品发布的时候,BootLoader必须工作在这种模式下.从最终用户的角度看,BootLoader的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。272.Bootloader的移植(cont.)下载(Downloading)模式:在这种模式下目标机上的BootLoader将通过串口连接或网络连接等通信手段从主机下载文件,比如应用程序、数据文件、内核映像等.从主机下载的文件通常首先被BootLoader保存到目标机的RAM中然后再被BootLoader写到目标机上的固态存储设备中。这种模式通常在系统更新时使用。工作于这种模式下的BootLoader通常都会向它的终端用户提供一个简单的命令行接口。282.Bootloader的移植(cont.)三、BootLoader的启动过程BootLoader的实现依赖于CPU的体系结构,因此大多数BootLoader的启动都分为stage1和stage2两大部分。依赖于CPU体系结构的代码,设备初始化代码等,通常都放在stage1中,而且通常都用汇编语言来实现,以达到短小精悍的目的。stage2则通常用C语言来实现,可以实现给复杂的功能,而且代码会具有更好的可读性和可移植性。292.Bootloader的移植(cont.)BootLoader的stage1通常包括以下步骤(以执行的先后顺序):硬件设备初始化执行–linux/arch/arm/kernel/head-xxx.S1.屏蔽所有的中断。为中断提供服务通常是OS设备驱动程序的责任,因此在BootLoader的执行全过程中可以不必响应任何中断。中断屏蔽可以通过写CPU的中断屏蔽寄存器或状态寄存器(比如ARM的CPSR寄存器)来完成。2.设置CPU的速度和时钟频率。302.Bootloader的移植(cont.)3.RAM初始化。包括正确地设置系统的内存控制器的功能寄存器以及各内存库控制寄存器等。4.初始化LED。通过GPIO来驱动LED,表明系统状态是OK还是Error。如果板子上没有LED,那么也可以通过初始化UART向串口打印BootLoader的Logo字符信息来完成这一点。5.关闭CPU内部指令/数据cache。312.Bootloader的移植(cont.)为加载BootLoader的stage2准备RAM空间。为了获得更快的执行速度,通常把stage2加载到RAM空间中来执行,因此必须为加载BootLoader的stage2准备好一段可用的RAM空间范围。拷贝BootLoader的stage2到RAM空间中。拷贝时要确定两点:(1
本文标题:linux交叉编译环境
链接地址:https://www.777doc.com/doc-904764 .html