linux交叉编译环境

上传人:c****d 文档编号:243150613 上传时间:2024-09-16 格式:PPT 页数:109 大小:311.50KB
返回 下载 相关 举报
linux交叉编译环境_第1页
第1页 / 共109页
linux交叉编译环境_第2页
第2页 / 共109页
linux交叉编译环境_第3页
第3页 / 共109页
点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,嵌入式,Linux,开发环境的构建,主要介绍如何构建嵌入式,Linux,的开发环境,1.,创建交叉编译工具,2.Linux,内核的移植,3.,4.Bootloader,的移植,1,商用嵌入式,LINUX,ARMIRIX Embedded Linux,-derived form Debian,Coollogic Coollinux,-combines Linux and Java,Coventive Xlinux,-kernel can be as small as 142kb,Esfia Redblue Linux,-400k, designed for wireless apps,2,商用嵌入式,LINUX,KYZO Pizza Box Linux,-Samba based file, print,CD server,Lineo Embedix,-supports realtime and high availability apps,LynuxWorks BlueCat,-general purpose embedded solutions,Monta Vista Linux,- general purpose embedded solutions,3,商用嵌入式,LINUX,Neoware NeoLinux, Red Hat derived for information appliances,PalmPalm Tynux, Internet appliance and multimedia,Red Hat Embedded Linux, general purpose embedded solution,Red Sonic Red-Ice Linux, runs from DiskonChip or CompactFlash,4,商用嵌入式,LINUX,RidgeRun DSP Linux, for multimedia, wireless, RT on DSP,TimeSys Linux GPL, low latency enhanced kernel,Tuxia TASTE, distro targets Internet appliances,Vital Systems vLinux, for ARM based embedded apps,5,开源嵌入式,Linux,Embedded Debian Project,- convert Debian to an embedded OS,ETLinux, for PC104 SBCs,uCLinux, for microprocessors that dont have MMU,uLinux (muLinux), distro fits on a single floppy,6,Linux,如何做到实时?,7,Linux,如何做到实时?,8,Linux,支持的,CPU,Intel X86,MIPS,ARM,StrongARM,PowerPC,Hitachi SuperH,9,嵌入式系统的开发模式,本机开发:,在目标机中直接进行操作系统移植及应用程序的开发。,-,在这种方式下进行开发,首先就得在目标机中安装操作系统,并且具有良好的人机开发界面。但是由于一般的嵌入式系统都是资源受限系统,如内、外存储空间小,,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,服务器来开发。,15,1.,创建交叉编译工具,由于一般嵌入式开发系统存储大小有限,通常要在,pc,机上建立一个用于目标机的交叉编译环境。这是一个由编译器、连接器和解释器组成的综合开发环境。交叉编译工具包括:,Binutils ,用于操作二进制文件的实用程序集合。,包括诸如,ar,、,as,、,objdump,、,objcopy,这样的实用程序。,GccGNU C,编译器。,Glibc,所有用户应用程序都将链接到的,C,库。避,免使用任何,C,库函数的内核和其它应用程序可以在没有该库的情况下进行编译。,16,1.,创建交叉编译工具,(,cont.,),创建交叉编译工具的一般步骤:,1.,下载源文件、补丁和建立编译环境,a,)下载源文件,linux,内核源码及相应的补丁,binutils-2.10.1gcc-2.95.3glibc-2.2.3glibc-linuxthreads-2.2.3,b,)建立工作目录,设置环境变量,安装,Linux,头文件。,17,1.,创建交叉编译工具,(,cont.,),2.,建立二进制工具(,binutils,),binutils,包中的工具常用来操作二进制目标文件。该包中最重要的两个工具就是,GNU,汇编器,as,和链接器,ld,。,3.,创建初始编译器(,bootstrap gcc,),创建交叉编译版本的,Gcc,,需要交叉编译版本的,glibc,,而交叉编译版本的,glibc,是通过交叉编译版本的,gcc,创建的。面对这个先有鸡还是先有蛋的问题,解决的办法是先只编译对,C,语言的支持,并禁止支持线程。,18,1.,创建交叉编译工具,(,cont.,),4.,第一次创建,c,库,(glibc),这一步编译好的,glic,还不能用,它只是第二次编译所需要的工具。后面的编译工作都需要连接到这个库上。,19,1.,创建交叉编译工具,(,cont.,),5.,建立全套编译器(,full gcc,),有了交叉编译版本的,glibc,,就可以创建完整版本的,Gcc,了。,6.,第二次创建,C,库,重新编译,glibc,,并把,glibc,安装到特定的工作目录中。,20,嵌入式,Linux,开发涉及的层次,嵌入式,Linux,开发大致涉及三个层次:,引导装载程序, Linux,内核,图形用户界面(或称,GUI,),21,引导装载程序,引导装载程序通常是在任何硬件上执行的第一段代码。在,PC,系统中,通常将引导装载程序装入主引导记录(,Master Boot Record,,,(MBR),)中,或者装入,Linux,驻留的磁盘的第一个扇区中。,通常,在台式机或其它系统上,,BIOS,将控制移交给引导装载程序。,22,问题,在大多数情况下,嵌入式系统没有,BIOS,支持,如何实现第一次引导呢?,23,解决方法一,专用软件,专用软件可以直接与远程系统上的闪存设备进行交互并将引导装载程序安装在,flash,的给定位置中。,这个软件使用目标机上的,JTAG,端口,它是用于执行外部输入的指令的接口,JFlash-linux,是一种用于直接写闪存的流行工具。它在主机机器上执行并通过,JTAG,接口使用并行端口访问目标闪存芯片。,24,解决方法二,微小的引导代码,根据几个字节的指令初始化一些,DRAM,,并启用目标上的一个串行(或者,USB,,或者以太网)端口与主机程序通信。然后,主机程序或装入程序可以使用这个连接将引导装载程序传送到目标上,并将它写入闪存。,在安装它并给予其控制后,这个引导装载程序执行,Bootloader,的功能,25,2.Bootloader,的移植,一、什么是,bootloader,(引导加载程序),BootLoader,就是在操作系统内核或用户应用程序运行之前运行的一段小程序。,可以初始化硬件设备、建立内存空间的映射图(有的,CPU,没有内存映射功能如,S3C44B0,),从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核或用户应用程序准备好正确的环境。,26,2.Bootloader,的移植,(,cont.,),二、,BootLoader,的操作模式,多数,BootLoader,都包含两种不同的操作模式:,“启动加载(,Boot loading,)”模式:也称为“自主”(,Autonomous,)模式,也即,BootLoader,从目标机上的某个固态存储设备上将操作系统加载到,RAM,中运行,整个过程并没有用户的介入。是,BootLoader,的正常工作模式。在嵌入式产品发布的时候,,BootLoader,必须工作在这种模式下,从最终用户的角度看,,BootLoader,的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。,27,2.Bootloader,的移植,(,cont.,),下载(,Down loading,)模式:,在这种模式下 目标机上的,BootLoader,将通过串口连接或网络连接等通信手段从主机下载文件,比如应用程序、数据文件、内核映像等,从主机下载的文件通常首先被,BootLoader,保存到目标机的,RAM,中然后再被,BootLoader,写到目标机上的固态存储设备中。这种模式通常在系统更新时使用。工作于这种模式下的,BootLoader,通常都会向它的终端用户提供一个简单的命令行接口。,28,2.Bootloader,的移植,(,cont.,),三、,BootLoader,的启动过程,Boot Loader,的实现依赖于,CPU,的体系结构,因此大多数,Boot Loader,的启动都分为,stage1,和,stage2,两大部分。,依赖于,CPU,体系结构的代码,设备初始化代码等,通常都放在,stage1,中,而且通常都用汇编语言来实现,以达到短小精悍的目的。,stage2,则通常用,C,语言来实现,可以实现给复杂的功能,而且代码会具有更好的可读性和可移植性。,29,2.Bootloader,的移植,(,cont.,),Boot Loader,的,stage1,通常包括以下步骤(以执行的先后顺序):,硬件设备初始化,执行, linux/arch/arm/kernel/head-xxx.S,1, 屏蔽所有的中断。为中断提供服务通常是,OS,设备驱动程序的责任,因此在,Boot Loader,的执行全过程中可以不必响应任何中断。中断屏蔽可以通过写,CPU,的中断屏蔽寄存器或状态寄存器(比如,ARM,的,CPSR,寄存器)来完成。,2, 设置,CPU,的速度和时钟频率。,30,2.Bootloader,的移植,(,cont.,),3,RAM,初始化。包括正确地设置系统的内存控制器的功能寄存器以及各内存库控制寄存器等。,4, 初始化,LED,。通过,GPIO,来驱动,LED,,表明系统状态是,OK,还是,Error,。如果板子上没有,LED,,那么也可以通过初始化,UART,向串口打印,Boot Loader,的,Logo,字符信息来完成这一点。,5, 关闭,CPU,内部指令数据,cache,。,31,2.Bootloader,的移植,(,cont.,),为加载,Boot Loader,的,stage2,准备,RAM,空间。,为了获得更快的执行速度,通常把,stage2,加载到,RAM,空间中来执行,因此必须为加载,Boot Loader,的,stage2,准备好一段可用的,RAM,空间范围。,拷贝,Boot Loader,的,stage2,到,RAM,空间中。 拷贝时要确定两点:,(1) stage2,的可执行映象在固态存储设备的存放起始地址和终止地址;,(2) RAM,空间的起始地址。,32,2.Bootloader,的移植,(,cont.,),设置好堆栈。,堆栈指针的设置是为了执行,C,语言代码作好准备。,跳转到,stage2,的,C,入口点。,在上述一切都就绪后,就可以跳转到,Boot Loader,的,stage2,去执行了。比如,在,ARM,系统中,这可以通过修改,PC,寄存器为合适的地址来实现。,33,2.Bootloader,的移植,(,cont.,),stage2,的代码通常用,C,语言来实现。但是与普通,C,语言应用程序不同的是,在编译和链接,boot loader,这样的程序时,不能使用,glibc,库中的任何支持函数。 具体步骤,(,以执行的先后顺序,),:,初始化本阶段要使用到的硬件设备。,通常包括:(,1,)初始化至少一个串口,以便和终端用户进行,I/O,输出信息;(,2,)初始化计时器等。设备初始化完成后,可以输出一些打印信息,程序名字字符串、版本号等。,34,2.Bootloader,的移植,(,cont.,),检测系统内存映射,(memory map),。,指在整个,4GB,物理地址空间中有哪些地址范围被分配用来寻址系统的,RAM,单元。比如,在,SA-1100 CPU,中,从,0xC000,0000,开始的,512M,地址空间被用作系统的,RAM,地址空间,而在,Samsung S3C44B0X CPU,中,从,0x0c00,0000,到,0x1000,0000,之间的,64M,地址空间被用作系统的,RAM,地址空间。,35,2.Bootloader,的移植,(,cont.,),将,kernel,映像和根文件系统映像从,flash,上读到,RAM,空间中。,(,1,)规划内存占用的布局包括两个方面:,a.,内核映像所占用的内存范围,b.,根文件系统所占用的内存范围。,在规划内存占用的布局时,主要考虑基地址和映像的大小。,(,2,)从,Flash,上拷贝数据,36,2.Bootloader,的移植,(,cont.,),为内核设置启动参数。,在将内核映像和根文件系统映像拷贝到,RAM,空间中后,就可以准备启动,Linux,内核了。但是在调用内核之前,应该作一步准备工作,即:设置,Linux,内核的启动参数。,调用内核。,37,2.Bootloader,的移植,(,cont.,),系统初始化,linux/init/main.c - start_kernel(),setup_arch();/platform specific init, board param, memory,range,etc,paging_init();,trap_init();,init_IRQ();,38,2.Bootloader,的移植,(,cont.,),sched_init();,time_init();,parse_options(command_line);,console_init,kmalloc_init,inode_init,mem_init,buffer_init();,sock_init();,kernel thread - init(),39,2.Bootloader,的移植,(,cont.,),设备驱动初始化,挂载,root,文件系统,- ROMFS(Or other as root),Open tty from root,运行初始化进程,40,/etc/rc, hostname Atmel, /bin/expand /etc/ramfs.img /dev/ram0, mount -t proc proc /proc, mount -t ext2 /dev/ram0 /var, mkdir /var/tmp, mkdir /var/log, mkdir /var/run, mkdir /var/lock, cat /etc/motd, ifconfig lo 127.0.0.1, route add -net 127.0.0.0 netmask 255.255.255.0 lo, dhcpcd,41,2.Bootloader,的移植,(,cont.,),四、,u-boot,(,1,)简介,U-Boot,,全称,Universal Boot Loader,,是开放源码项目。从,FADSROM,、,8xxROM,、,PPCBOOT,逐步发展演化而来。其源码目录、编译形式与,Linux,内核很相似,不少,U-Boot,源码就是相应的,Linux,内核源程序的简化,尤其是一些设备的驱动程序,这从,U-Boot,源码的注释中能体现这一点。,42,2.Bootloader,的移植,(,cont.,),U-Boot,不仅仅支持嵌入式,Linux,系统的引导,当前,它还支持,NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS,嵌入式操作系统。,其目前要支持的目标操作系统是,OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS,。这是,U-Boot,中,Universal,的一层含义。,43,2.Bootloader,的移植,(,cont.,),另外一层含义则是,U-Boot,除了支持,PowerPC,系列的处理器外,还能支持,MIPS,、,x86,、,ARM,、,NIOS,、,XScale,等诸多常用系列的处理器。,这两个特点正是,U-Boot,项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。就目前来看,,U-Boot,对,PowerPC,系列处理器支持最为丰富,对,Linux,的支持最完善。,44,2.Bootloader,的移植,(,cont.,),(,2,),u-boot,的特点, 开放源码;,支持多种嵌入式操作系统内核,如,Linux,、,NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS,; 支持多个处理器系列,如,PowerPC,、,ARM,、,x86,、,MIPS,、,XScale,;,45,2.Bootloader,的移植,(,cont.,), 较高的可靠性和稳定性; 高度灵活的功能设置,适合,U-Boot,调试、操作系统不同引导要求、产品发布等; 丰富的设备驱动源码,如串口、以太网、,SDRAM,、,FLASH,、,LCD,、,NVRAM,、,EEPROM,、,RTC,、键盘等; 较为丰富的开发调试文档与强大的网络技术支持;,46,2.Bootloader,的移植,(,cont.,),(,3,),U-Boot,主要目录结构,-,board,目标板相关文件,主要包含,SDRAM,、,FLASH,驱动;,-,common,独立于处理器体系结构的通用代码,如内存大小探测与故障检测;,-,cpu,与处理器相关的文件。如,mpc8xx,子目录下含串口、网口、,LCD,驱动及中断初始化等文件;,-,driver,通用设备驱动,如,CFI FLASH,驱动(目前对,INTEL FLASH,支持较好),47,2.Bootloader,的移植,(,cont.,),-,doc,U-Boot,的说明文档;,-,include,U-Boot,头文件;尤其,configs,子目录下与目标板相关的配置头文件是移植过程中经常要修改的文件;,-,lib_xxx,处理器体系相关的文件,如,lib_ppc, lib_arm,目录分别包含与,PowerPC,、,ARM,体系结构相关的文件;,-,net,与网络功能相关的文件目录,如,bootp,nfs,tftp,;,-,post,上电自检文件目录。尚有待于进一步完善;,-,rtc,RTC,驱动程序;,-,tools,用于创建,U-Boot S-RECORD,和,BIN,镜像文件的工具;,48,2.Bootloader,的移植,(,cont.,),(,4,),U-Boot,可支持的主要功能,系统引导: 支持,NFS,挂载、,RAMDISK,(压缩或非压缩)形式的根文件系统;支持,NFS,挂载、从,FLASH,中引导压缩或非压缩系统内核;,基本辅助功能: 强大的操作系统接口功能;可灵活设置、传递多个关键参数给操作系统,适合系统在不同开发阶段的调试要求与产品发布,尤对,Linux,支持最为强劲;支持目标板环境参数多种存储方式,如,FLASH,、,NVRAM,、,EEPROM,;,CRC32,校验,,49,2.Bootloader,的移植,(,cont.,),可校验,FLASH,中内核、,RAMDISK,镜像文件是否完好;,设备驱动: 串口、,SDRAM,、,FLASH,、以太网、,LCD,、,NVRAM,、,EEPROM,、键盘、,USB,、,PCMCIA,、,PCI,、,RTC,等驱动支持;,上电自检功能,SDRAM,、,FLASH,大小自动检测;,SDRAM,故障检测;,CPU,型号;,特殊功能:,XIP,内核引导;,50,2.Bootloader,的移植,(,cont.,),(,5,),u-boot,移植的主要步骤,以,S3C2410,处理器为例,说明,u-boot,的主要移植步骤:,1.,修改,Makefile,文件,bks2410_config:unconfig./mkconfig $(:_config=) arm arm920t bks2410 NULL s3c24x0,51,2.Bootloader,的移植,(,cont.,),各参数含义,:,arm,: CPU,的架构,(ARCH),arm920t,: CPU,的类型,(CPU),,其对应于,cpu/arm920t,子目录。,bks2410,:,开发板的型号,(BOARD),,对应于,board/bks2410,目录。,NULL:,开发者,/,或经销商,(vender),。,s3c24x0,:,片上系统,(SOC),。,52,2.Bootloader,的移植,(,cont.,),2.,建立,board/bks2410,目录,拷贝,board/smdk2410,下的文件到,board/bks2410,目录,将,smdk2410.c,更名为,bks2410.c,3. cp include/configs/smdk2410.h include/configs/bks2410.h,4.,将,arm-linux-gcc,的目录加入到,PATH,环境变量中,5.,测试编译能否成功:,make bks2410_configmake all ARCH=arm,生成,u-boot.bin,就,OK,了,53,2.Bootloader,的移植,(,cont.,),6.,依照自己开发板的内存地址分配情况修改,board/bks2410/memsetup.S,文件,7.,在,board/bks2410,加入,NAND Flash,读函数,建立,nand_read.c,。,8.,修改,board/bks2410/Makefile,9.,修改,cpu/arm920t/start.S,文件,10.,修改,include/configs/bks2410.h,文件,11.,重新编译,u-bootmake all ARCH=arm,12.,通过,jtag,将,u-boot,烧写到,flash,54,2.Bootloader,的移植,(,cont.,),五、,vivi,简介,vivi,是韩国,mizi,公司开发的,bootloader,,适用于,ARM9,处理器。如果目标平台使用的是,ARM9,处理器,那么选用,vivi,来做,bootloader,是个不错的选择。,55,参考网站:,u-boot,:,vivi:,56,3.Linux,的内核格式,linux,的内核有多种格式,,vmlinux,、老式的,zImage,和新型的,bzImage,。,vmlinux,和,zImage,之间的主要区别,:,vmlinux,是实际的(未压缩的)可执行文件,,而,zImage,是或多或少包含相同信息的自解压,压缩文件,只是压缩它以处理(通常是,Intel,强制的),640 KB,引导时间的限制。,57,3.Linux,的内核格式,zImage,和新型的,bzImage,之间最大的差别是对于内核体积大小的限制。由于,zImage,内核需要放在实模式,1MB,的内存之内,所以其体积受到了限制。目前采用的内核格式大多为,bzImage,,这种格式没有,1MB,内存限制。,58,3.Linux,内核的移植,使某个平台的代码运行在其他平台上的过程就叫做移植。,Linux,系统通过移植可以运行在,ARM,,,PowerPC,,,M68K,等多种平台上。,Linux,内核结构,linux,内核主要由,5,个子系统组成:进程调度、内存管理、虚拟文件系统、网络接口和进程间通信。一般在,Linux,系统中的,/usr/src/linux-*.*.*,目录下就是内核源代码。,59,3.Linux,内核的移植,(,cont.,),Linux,内核源代码的分布如下:,arch,这个子目录包含了此核心源代码所支持的硬件体系结构相关的核心代码。如对于,X86,平台就是,i386,。,include,这个目录包括了核心的大多数,include,文件。另外对于每种支持的体系结构分别有一个子目录。,init,此目录包含核心启动代码。,mm,此目录包含了所有的内存管理代码。与具体硬件体系结构相关的内存管理代码位于,arch/*/mm,目录下,如对应于,X86,的就是,arch/i386/mm/fault.c,。,60,3.Linux,内核的移植,(,cont.,),drivers,系统中所有的设备驱动都位于此目录中。它又进一步划分成几类设备驱动,每一种也有对应的子目录,如声卡的驱动对应于,drivers/sound,。,ipc,此目录包含了核心的进程间通讯代码。,modules,此目录包含已建好可动态加载的模块。,fs Linux,支持的文件系统代码。不同的文件系统有不同的子目录对应,如,ext2,文件系统对应的就是,ext2,子目录。,kernel,主要核心代码。同时与处理器结构相关代码都放在,arch/*/kernel,目录下。,61,3.Linux,内核的移植,(,cont.,),net,核心的网络部分代码。里面的每个子目录对应于网络的一个方面。,lib,此目录包含了核心的库代码。与处理器结构相关库代码被放在,arch/*/lib/,目录下。,scripts,此目录包含用于配置核心的脚本文件。,Documentation,此目录是一些文档,起参考作用。,62,3.Linux,内核的移植,(,cont.,),Linux,内核的移植,移植所要做的工作就是根据硬件的配置,修改,Linux,内核目录中的,Makefile,文件、配置文件及某些源代码。,63,3.Linux,内核的移植,(,cont.,),编译内核,1,、安装内核 如果内核已经安装(,/usr/src/,目录有,linux,子目录),跳过;如果没有安装,在光驱中放入,linux,安装光盘,找到,kernel-source-2.xx.xx.rpm,文件(,xx,代表数字,表示内核的版本号),比如,RedHat linux,的,RPMS,目录是,/RedHat/RPMS/,目录,然后使用命令,rpm -ivh kernel-source2.xx.xx.rpm,安装内核,64,3.Linux,内核的移植,(,cont.,),2,、清除从前编译内核时残留的,.o,文件和不必要的关联,cd /usr/src/linux make mrproper,删除所有因构造内核过程中产生的所有文件,除了,Make clean,所删除的文件之外,还要删,除,.config,,,.depend,等文件,把核心源码恢复到最原始的状态。,65,3.Linux,内核的移植,(,cont.,),3,、配置内核,修改相关参数在图形界面下,,make xconfig,;,字符界面下,,make menuconfig,调用,./scripts/Configure,按照,arch/i386/config.in,来进行配置。命令执行完后产生文件,.config,,其中保存着配置信息。下一次再做,make config,将产生新的,.config,文件,原,.config,被改名为,.config.old,在内核配置菜单中正确设置个内核选项,保存退出,66,3.Linux,内核的移植,(,cont.,),4,、正确设置关联文件,make dep,寻找依存惯性,产生两个文件,.depend,和,.hdepend,,其中,.hdepend,表示每个,.h,文件都包含其他哪些嵌入文件,而,.depend,文件有多个,在每个会产生目标文件,(.o),文件的目录下均有,它表示每个目录文件都依赖哪些嵌入文件,(.h)5,、编译内核 对于大内核(比如需要,SCSI,支持),,make bzImage,对于小内核,,make zImage,根据可用的系统资源和引导装载程序的功能,内核可以编译成,vmlinux,、,Image,或,zImage,。,67,3.Linux,内核的移植,(,cont.,),6,、编译模块,make modules 7,、安装模块,make modules_install,68,内核链接和装入,为目标系统编译了内核后,通过使用引导装载程序(,bootloader,),内核就被装入到目标系统的内存(在,DRAM,中或者在闪存中)。,通过使用串行、,USB,或以太网端口,引导装载程序与主机通信以将内核传送到目标的闪存或,DRAM,中。,在将内核完全装入目标后,引导装载程序将控制传递给装入内核的地址。,69,内核链接和装入,内核可执行文件,由许多链接在一起的对象文件组成。对象文件有许多节,如文本、数据、,init,数据、,bass,等等。对象文件都是由一个称为链接器脚本的文件链接并装入的。,链接器脚本,的功能是将输入对象文件的各节映射到输出文件中;即将所有输入对象文件都链接到单一的可执行文件中,将该可执行文件的各节装入到指定地址处。,vmlinux.lds,是,存在于,arch/,目录中的内核链接器脚本,负责链接内核的各个节并将它们装入内存中特定偏移量处。,70,典型的,vmlinux.lds,文件,OUTPUT_ARCH() /* includes architecture type */,ENTRY(stext) /* stext is the kernel entry point */,SECTIONS /* SECTIONS command describes the layout,of the output file */,. = TEXTADDR; /* TEXTADDR is LMA for the kernel */,.init : /* Init code and data*/,_stext = .; /* First section is stext followed,by _init data section */,_init_begin = .;,*(.text.init),_init_end = .;,.text : /* Real text segment follows _init_data section */,_text = .;,*(.text),_etext = .; /* End of text section*/,71,4.,根文件系统的制作,嵌入式系统需要一种以结构化格式存储和检索信息的方法;这就需要文件系统的参与。,Ramdisk,是通过将计算机的,RAM,用作设备来创建和挂装文件系统的一种机制,它通常用于无盘系统(当然包括微型嵌入式设备,它只包含作为永久存储媒质的闪存芯片)。,72,RamDisk,简介,将,RAM,模拟当做硬盘来使用的一种技术。相对于传统的硬盘文件访问来说,这种技术可以极大的提高在其上进行的文件访问的速度。但是,RAM,的易失性也意味着当关闭电源后的数据将会丢失。,Ramdisk,的速度特别快,大概是现在最快的,7200,转硬盘速度的,30,倍。,VSuite Ramdisk ,推荐,免费版。,RamDisk Plus ,需要序列号,。,73,创建基于,Ext2fs,的,Ramdisk,mke2fs -vm0 /dev/ram 4096,mount -t ext2 /dev/ram /mnt,cd /mnt,cp /bin, /sbin, /etc, /dev . files in mnt,cd ./,umount /mnt,dd if=/dev/ram bs=1k count=4096 of=ext2ramdisk,74,ramfs,一种基于,ram,的文件系统,开发,ramfs,的目的是因为,ramdisk,浪费了太多的内存,cache,页,,ramfs,是基于,tmpfs,的一个实例。,75,Initrd,与,initramfs,initrd,是,init ramdisk,的缩写,,initramfs,是,init ramfs,的缩写。,init,前缀代表它们具有了引导内核启动的功能。,ramfs,比,ramdisk,更加高效,自然,initramfs,也更加优秀,是,2.6,内核新加入的推荐使用的机制,虽然可能,pc,中,grub,使用的内核,cmd line,参数是,kernel /vmlinuz-2.6.25-14.fc9.i686 ro root=UUID=11d7ac51-2b45-489e-8a48-8d2a28e2c04e rhgb quiet,initrd /initrd-2.6.25-14.fc9.i686.img,实际上使用的是,initramfs,,,文件格式不同,,initrd,是,gziped,的,,initramfs,是,cpio,的,76,initrd,initrd,的作用:精简的根文件系统,包含必备的目录和程序。,内核镜像不应该静态包含进太多驱动模块。但是,Linux,内核启动最后一步,创建,init,内核线程,需要执行的,init,程序或者脚本在根文件系统中。根文件系统可能在硬盘、磁盘阵列、,nfs,、,flash,上。此时,可使用,initrd,作为一个过渡。,77,initrd,initrd,,或者,initramfs,,无论在,pc,还是嵌入式,都是可以选择的,分,3,种情况,1.,完全不要,initrd2.initrd,作为最终的根文件系统,3.initrd,作为过渡,由,initrd,的,init,来加载最终的根文件系统,78,情况,1,,比如嵌入式,linux,静态包含了,nand flash,驱动和,jffs2,驱动,指定内核启动参数,root=/dev/mtdblock2 rootfs=jffs2 rw console=ttySAC0,115200 init=/linuxrc (,使用,busybox,作为根文件系统,),情况,2,,将根文件系统做成,ramdisk,镜像,使用,ubbot,下载到,0x30800000,内核启动参数,root=/dev/ram,rw init=/linuxrc initrd=0x30800000,8M console=ttySAC0,115200,注意,一旦使用了,ramdisk,作为内核命令行参数,root,的参数,,root=/dev/ram,那么就直接把,initrd,当做最终的根文件系统,情况,3,,,pc,常见,嵌入式,linux,也可见这样的启动参数,console=ttySAC0,115200 root=nfs nfsroot=192.168.1.9:/source/rootfs initrd=0x10800000,0x14af47,79,4.,根文件系统的制作,一、根文件系统的基本结构和内容,Linux,系统的根文件的基本结构,如图,1,所示,其中每个目录中都包含特定内容:,1. /bin,目录,/bin,目录包含了引导启动所需的命令或普通用户可能用的命令,(,可能在引导启动后,),。这些命令都是二进制文件的可执行程序。,80,4.,根文件系统的制作,(,cont.,),2. /sbin,目录,/sbin,目录类似,/bin,,也用于存储二进制文件。因为其中的大部分文件多是系统管理员使用的基本的系统程序,所以虽然普通用户必要且允许时可以使用,但一般不给普通用户使用。,81,4.,根文件系统的制作,(,cont.,),3. /etc,目录,/etc,目录存放着各种系统配置文件,其中包括了用户信息文件,/etc/passwd,,系统初始化文件,/etc/rc,等。,Linux,正是靠这些文件才得以正常地运行。,4. /root,目录,/root,目录是超级用户的目录。,82,4.,根文件系统的制作,(,cont.,),5. /lib,目录,/,根文件系统上的程序所需的共享库,存放根文件系统程序运行所需的共享文件。,/lib/modules,目录包含系统核心可加载各种模块,尤其是那些在恢复损坏的系统时重新引导系统所需的模块,(,例如网络和文件系统驱动,),。,83,4.,根文件系统的制作,(,cont.,),6. /dev,目录,/dev,目录存放了设备驱动程序,用户通过这些文件访问外部设备。比如,用户可以通过访问,/dev/mouse,来访问鼠标的输入。,7. /tmp,目录,/tmp,目录存放程序在运行时产生的信息和数据。,8. /boot,目录,/boot,目录存放引导加载器,(bootloader),使用的文件,如,LILO,、,grub,,核心映像也经常放在这里,而不是放在根目录中。,84,4.,根文件系统的制作,(,cont.,),9. /mnt,目录系统管理员临时安装,(mount ),文件系统的安装点。程序并不自动支持安装到,/mnt,。,/mnt,下面可以分为许多子目录,例如,/mnt/dosa,可能是使用,MSDOS,文件系统的软驱,而,/mnt/exta,可能是使用,ext2,文件系统的软驱,,/mnt/cdrom,光驱等等。,10. /proc, /usr,/var,/home,目录其他文件系统的安装点。,85,4.,根文件系统的制作,(,cont.,),二、嵌入式,Linux,系统的根文件系统的制作,第一步:确定根文件系统的目录结构,在嵌入式,Linux,系统中,必须有的目录包括:,/bin,/dev,/etc/,/lib,/proc,/sbin,和,/usr,,其他目录都是可选的。,86,4.,根文件系统的制作,(,cont.,),第二步:在根文件系统中各个目录的添加必要的内容,包括:,1,、链接库,glibc,2,、内核映象,内核配置文件等;,3,、内核模块;,4,、设备文件,87,4.,根文件系统的制作,(,cont.,),只需要一些必备的条目及符号链接就可以满足系统的运行。,基本的,/dev,条目包括:,文件名 说明 类型 主编号 次编号 权限位,mem,物理内存存取 字符,1 1 600,null,黑洞设备 字符,1 3 666,zero,以,null byte,字符,1 5 666,为数据来源,random,随机数产生器 字符,1 8 644,88,4.,根文件系统的制作,(,cont.,),tty0,现行的虚 字符,4 0 600,拟控制台,tty1,第一个虚 字符,4 1 600,拟控制台,ttyS0,第一个,UART,字符,4 64 600,串行端口,tty,现行的控制台 字符,5 0 666,console,系统控制台 字符,5 1 600,89,4.,根文件系统的制作,(,cont.,),创建,/dev,中的条目:(使用,mknod,命令),mknod m 600 mem c 1 1,mknod m 666 null c 1 3,创建符号链接:(使用,ln s,命令),链接名称 链接对象,fd /proc/self/fd,stdin fd/0,stdout fd/1,stderr fd/2,90,4.,根文件系统的制作,(,cont.,),5,、主要的系统应用程序,标准的,Linux,工作站和服务器发行套件中都配备了数以千计的二进制命令文件,并且不同的发行套件提供的命令集还各不相同。嵌入式,Linux,系统中不需要这么多的二进制文件。,一般有两种方法来定制嵌入式,Linux,系统中的二进制命令文件:,1,、挑选若干标准命令;,2,、尽可能把命令集浓缩成仅仅实现必要功能的极少数应用程序(如,BusyBox,)。,91,4.,根文件系统的制作,(,cont.,),BusyBox,简介,BusyBox,包含了一些简单的工具,例如,cat,和,echo,,还包含了一些更大、更复杂的工具,例如,grep,、,find,、,mount,以及,telnet,(不过它的选项比传统的版本要少);,BusyBox,称为,Linux,工具里的瑞士军刀。,92,4.,根文件系统的制作,(,cont.,),BusyBox,使用了符号链接以便使一个可执行程序看起来像很多程序一样。对于,BusyBox,中包含的每个工具来说,都会这样创建一个符号链接,这样就可以使用这些符号链接来调用,BusyBox,。然后,BusyBox,可以通过,argv0,来调用内部工具。,有关,BusyBox,的参考网站:,93,4.,根文件系统的制作,(,cont.,),6,、,init,程序,内核初始化的最后一个动作是启动,init,程序。,init,程序启动后会根据,inittab,文件的内容启动指定的系统服务。,大多数,Linux,使用的,init,跟,System V,的,init,类似,嵌入式,Linux,系统可用,BusyBox,来提供,init,的功能。用户需要定制目标平台的,inittab,、,rc.sysinit,、,rc,等文件。,94,4.,根文件系统的制作,(,cont.,),三、制作根文件系统的镜像,根文件系统的目录结构和内容都准备好了之后,需要把它制成一个镜像文件,以便于将其下载到开发板上。,嵌入式系统常用的文件系统介绍:,(,1,),CRamfs,cramfs,是一个压缩式的只读文件系统,不需要一次性地将文件系统中的所有内容都解压缩到内存之中,而只是在系统需要访问某个位置的数据的时侯,马上计算出该数据在,cramfs,中的位置,将其实时地解压缩到内存之中,然后通过对内存的访问来获取文件系统中需要读取的数据。,95,4.,根文件系统的制作,(,cont.,),cramfs,中的解压缩以及解压缩之后的内存中数据存放位置都是由,cramfs,文件系统本身进行维护的,用户并不需要了解具体的实现过程,因此这种方式增强了透明度,对开发人员来说,既方便,又节省了存储空间。,96,4.,根文件系统的制作,(,cont.,),cramfs,特性:,采用实时解压缩方式,但解压缩的时侯有延迟。,cramfs,的数据都是经过处理、打包的,对其进先写操作有一定困难。所以,cramfs,不支持写操作,这个特性刚好适合嵌入式应用中使用,Flash,存储文件系统的场合。,97,4.,根文件系统的制作,(,cont.,),cramfs,中文件最大不能超过,16MB,。,支持组标识,(gid),,但是,mkcramfs,只将,gid,的低,8,位保存下来,因此只有这,8,位是有效的。,支持硬链接。但是,cramfs,并没有完全处理好,硬链接的文
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!