您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > 基于S3C2440的Linux内核移植和yaffs2文件系统制作
基于S3C2440的Linux内核移植和yaffs2文件系统制作[ARM]第一章移植内核1.1Linux内核基础知识1.1.1Linux版本1.1.2什么是标准内核1.1.3Linux操作系统的分类1.1.4linux内核的选择1.2Linux内核启动过程概述1.2.1Bootloader启动过程1.2.2Linux启动过程1.3Linux内核移植1.3.1移植内核和根文件系统准备工作1.3.2修改Linux源码中参数1.3.3配置Linux内核1.3.4、编译内核第二章制作根文件系统2.1根文件系统预备知识2.2、构建根文件按系统2.2.1、建立根文件系统目录2.2.2、建立动态链接库2.2.3交叉编译Bosybox2.2.4建立etc目录下的配置文件2.2.5制作根文件系统映像文件第三章启动系统第四章总结第一章移植内核1.1Linux内核基础知识在动手进行Linux内核移植之前,非常有必要对Linux内核进行一定的了解,下面从Linux内核的版本和分类说起。1.1.1Linux版本Linux内核的版本号可以从源代码的顶层目录下的Makefile中看到,比如2.6.29.1内核的Makefile中:VERSION=2PATCHLEVEL=6SUBLEVEL=29EXTRAVERSION=.1其中的“VERSION”和“PATCHLEVEL”组成主版本号,比如2.4、2.5、2.6等,稳定版本的德主版本号用偶数表示(比如2.6的内核),开发中的版本号用奇数表示(比如2.5),它是下一个稳定版本内核的前身。“SUBLEVEL”称为次版本号,它不分奇偶,顺序递增,每隔1~2个月发布一个稳定版本。“EXTRAVERSION”称为扩展版本号,它不分奇偶,顺序递增,每周发布几次扩展本版号。1.1.2什么是标准内核按照资料上的习惯说法,标准内核(或称基础内核)就是指主要在维护和获取的内核,实际上它也有平台属性的。这些linux内核并不总是适用于所有linux支持的体系结构。实际上,这些内核版本很多时候并不是为一些流行的嵌入式linux系统开发的,也很少运行于这些嵌入式linux系统上,这个站点上的内核首先确保的是在IntelX86体系结构上可以正常运行,它是基于X86处理器的内核,如对linux-2.4.18.tar.bz2的配置makemenuconfig时就可以看到,Processortypeandfeatures---中只有386、486、586/K5/5x86/6x86/6x86MX、Pentium-Classic、Pentium-MMX、Pentium-Pro/Celeron/Pentium-II、Pentium-III/Celeron(Coppermine)、Pentium-4、K6/K6-II/K6-III、Athlon/Duron/K7、Elan、Crusoe、Winchip-C6、Winchip-2、Winchip-2A/Winchip-3、CyrixIII/C3选项,而没有类似Samsun2410等其他芯片的选择。如果需要用在其他特定的处理器平台上就需要对内核进行打补丁,形成不同的嵌入式内核。实际上,不同处理器系统的内核下载站点中提供的也往往是补丁patch而已,故原x86平台上的内核变成了基础内核,也被称为标准内核了。1.1.3Linux操作系统的分类第一层次分类:以主要功能差异和发行组织区分(基础linux系统/内核)。1、标准linux2、μClinux无MMU支持的linux系统,运行在无MMU的CPU上。3、Linux-RT是最早在linux上实现硬实时支持的linux发行版本。4、Linux/RTAI支持硬实时的linux,于RT-linux最大的不同之处在于RTAI定义了RTHAL,它将RTAI需要在linux中修改的部分定义成一组API接口,RTAI只使用API接口与linux交互。5、Embedix由Lineo公司开发,基于PowerPC和x86平台开发的。6、BlueCatLinux7、HardHatLinux8、其他第二层分类:以应用的嵌入式平台区分(嵌入式linux系统/内核,使上面第一类中的各种linux系统扩展为对特定目标硬件的支持,成为一种具体的嵌入式linux系统)由于嵌入式系统的发展与linux内核的发展是不同步的,所以为了要找一个能够运行于目标系统上的内核,需要对内核进行选择、配置和定制。因为每一种系统都是国际上不同的内核开发小组维护的,因此选择linux内核源码的站点也不尽相同。第二层分类中的linux系统/内核相对于第一层分类的标准内核来说,也可以称为嵌入式linxu系统/内核。如应用在ARM平台上的嵌入式Linux系统通常有arm-linux(常运行在arm9平台上),μClinux(常用在arm7平台上),在标准linux基础上扩展对其他的平台的支持往往通过安装patch实现,如armlinux就是对linux安装rmk补丁(如patch-2.4.18-rmk7.bz2)形成的,只有安装了这些补丁,内核才能顺利地移植到ARMLinux上。也有些是已经安装好补丁的内核源码包,如linux-2.4.18-rmk7.tar.bz2。不同处理器系统的内核/内核补丁下载站点:处理器系统适合的内核站点下载方式x86://://penguinppc.org/ftp,http,rsync,BitKeeperMIPS://linuxsh.sourceforge.net/cvs,BitKeeperM68K://这些站点不仅仅是linux内核站点,它们可能直接提供了针对你的目标硬件系统的linux内核版本。1.1.4linux内核的选择选择内核版本是很困难的,应该与负责维护该内核的小组保持联系,方法是通过订阅一些合适的邮件列表(maillist)并查看邮件中相关的重要新闻,以及浏览一些主要站点,可以得到该内核的最新发展动态。如针对ARM的Linux内核,可以访问并订阅该网站上提供的maillist就可以了。如果觉得查阅邮箱中的邮件列表耗费太多时间,那么至少每周访问所关心的内核网站,并阅读KernelTraffic提供的过去一周中在内核邮件清单中发生的重要的摘要,网址为这样就可以得到相关Linux内核的最新信息。并不是Linux的每个版本都适合ARM-Linux的移植,可以加入其邮件列表(maillist)以获得内核版本所支持硬件的相关信息,表中列出的资源可以帮助你找到哪些没有列出的功能可以被你的系统支持。ARMLinux的移植,建议使用2.4.x或2.6.x版本。Linux内核补丁可以到ARMLinux的ftp()下载。1.2Linux内核启动过程概述一个嵌入式Linux系统从软件角度看可以分为四个部分:引导加载程序(Bootloader),Linux内核,文件系统,应用程序。其中Bootloader是系统启动或复位以后执行的第一段代码,它主要用来初始化处理器及外设,然后调用Linux内核。Linux内核在完成系统的初始化之后需要挂载某个文件系统做为根文件系统(RootFilesystem)。根文件系统是Linux系统的核心组成部分,它可以做为Linux系统中文件和数据的存储区域,通常它还包括系统配置文件和运行应用软件所需要的库。应用程序可以说是嵌入式系统的“灵魂”,它所实现的功能通常就是设计该嵌入式系统所要达到的目标。如果没有应用程序的支持,任何硬件上设计精良的嵌入式系统都没有实用意义。1.2.1Bootloader启动过程Bootloader在运行过程中虽然具有初始化系统和执行用户输入的命令等作用,但它最根本的功能就是为了启动Linux内核。1、Bootloader的概念和作用Bootloader是嵌入式系统的引导加载程序,它是系统上电后运行的第一段程序,其作用类似于PC机上的BIOS。在完成对系统的初始化任务之后,它会将非易失性存储器(通常是Flash或DOC等)中的Linux内核拷贝到RAM中去,然后跳转到内核的第一条指令处继续执行,从而启动Linux内核。由此可见,Bootloader和Linux内核有着密不可分的联系,要想清楚的了解Linux内核的启动过程,我们必须先得认识Bootloader的执行过程,这样才能对嵌入式系统的整个启动过程有清晰的掌握。2、Bootloader的执行过程不同的处理器上电或复位后执行的第一条指令地址并不相同,对于ARM处理器来说,该地址为0x00000000。对于一般的嵌入式系统,通常把Flash等非易失性存储器映射到这个地址处,而Bootloader就位于该存储器的最前端,所以系统上电或复位后执行的第一段程序便是Bootloader。而因为存储Bootloader的存储器不同,Bootloader的执行过程也并不相同,下面将具体分析。嵌入式系统中广泛采用的非易失性存储器通常是Flash,而Flash又分为NorFlash和NandFlash两种。它们之间的不同在于:NorFlash支持芯片内执行(XIP,eXecuteInPlace),这样代码可以在Flash上直接执行而不必拷贝到RAM中去执行。而NandFlash并不支持XIP,所以要想执行NandFlash上的代码,必须先将其拷贝到RAM中去,然后跳到RAM中去执行。3、Bootloader的功能实际应用中的Bootloader根据所需功能的不同可以设计得很复杂,除完成基本的初始化系统和调用Linux内核等基本任务外,还可以执行很多用户输入的命令,比如设置Linux启动参数,给Flash分区等;也可以设计得很简单,只完成最基本的功能。但为了能达到启动Linux内核的目的,所有的Bootloader都必须具备以下功能:(1)、初始化RAM因为Linux内核一般都会在RAM中运行,所以在调用Linux内核之前bootloader必须设置和初始化RAM,为调用Linux内核做好准备。初始化RAM的任务包括设置CPU的控制寄存器参数,以便能正常使用RAM以及检测RAM大小等。(2)、初始化串口串口在Linux的启动过程中有着非常重要的作用,它是Linux内核和用户交互的方式之一。Linux在启动过程中可以将信息通过串口输出,这样便可清楚的了解Linux的启动过程。虽然它并不是Bootloader必须要完成的工作,但是通过串口输出信息是调试Bootloader和Linux内核的强有力的工具,所以一般的Bootloader都会在执行过程中初始化一个串口做为调试端口。(3)、检测处理器类型Bootloader在调用Linux内核前必须检测系统的处理器类型,并将其保存到某个常量中提供给Linux内核。Linux内核在启动过程中会根据该处理器类型调用相应的初始化程序。(4)、设置Linux启动参数Bootloader在执行过程中必须设置和初始化Linux的内核启动参数。目前传递启动参数主要采用两种方式:即通过structparam_struct和structtag(标记列表,taggedlist)两种结构传递。structparam_struct是一种比较老的参数传递方式,在2.4版本以前的内核中使用较多。从2.4版本以后Linux内核基本上采用标记列表的方式。但为了保持和以前版
本文标题:基于S3C2440的Linux内核移植和yaffs2文件系统制作
链接地址:https://www.777doc.com/doc-4223968 .html