1、物理与电子工程大学设计实验报告化学与电子工程大学嵌入式系统设计课程小论文课题题目Linux系统在ARM上的内核移植系别化学与电子工程大学年级专业电子科学与技术学号中学生姓名日期2012.6.1目录摘要11.课题要求21.1课题目的21.2课题背景32.Linux系统及Linux内核以及移植简介32.1Linux系统简介32.2Linux内核简介42.3内核移植简介52.3.1移植的基本概念52.3.2内核移植的打算63.内核移植73.1内核移植基本流程73.2内核配置73.2.1更改Makefile73.2.2设置NANDFlash
2、分区73.2.3配置内核选项93.3内核编译103.3.1交叉编译环境的构建103.3.2交叉编译113.4内核下载114技术实现问题135.结束语14参考文献15设计性实验报告成绩:指导班主任签名:16摘要随着计算机技术、通信技术以及Internet的急速发展。嵌入式系统已得到越来越广泛的应用。与此同时,嵌入式系统的复杂性也在不断降低,嵌入式操作系统早已成为其中最重要的组成部份。本文是基于ARM的平台上进行嵌入式操作系统LINUX的移植,其中ARM选用S3C2410。文中首先对内核移植的背景以及Linux操作系统内核进行了介绍,之后对移植的步骤及要点做了详尽的介绍,最
3、后实现编译的过程。操作系统移植是嵌人式系统开发的前提和基础,对嵌入式系统的开发具有重要意义1.课题要求1.1课题目的1.了解移植的基本概念;2.熟悉Linux内核的配置过程;3.熟悉Linux内核的编译过程;4.了解根文件系统的作用;5.学会BusyBox工具的使用;6.学会建立Cramfs文件系统。1.2课题背景Linux内核发展速率迅猛,是目前市场上惟一可以挑战Windows的操作系统。在其发展过程中得到分布于全世界的广大OpenSource项目跟随者的大力支持。尤其是一些以前参与Unix开发的人员,她们把应用于Unix上的许多应用程序移植到Linux上来,致使L
4、inux的功能得到巨大的扩充。随着其功能不断强化,灵活多样的实现加上其可订制的特点以及开放源码的优势,Linux在各个领域的应用正显得越来越广泛。其中uClinux的设计就是通过对标准Linux内核裁减,除去虚拟显存管理部份的代码,并对显存分配进行优化,进而达到提升系统运行效率的目的。它似乎容积小但仍然保存了Linux内核的大多数优点。诸如:支持通用LinuxAPI、内核容积可以大于512K、具有完整的TCP/IP合同栈等等。2.Linux系统及Linux内核以及移植简介2.1Linux系统简介一个完整的系统主要5部份组成:硬件、Bootloader、操作系统内核、操作系统
5、服务和用户应用程序,如图1所示:图1一个系统的组成各模块作用:(1)用户应用程序是指这些字处理程序、互联网应用程序或其它用户自行编制的各类应用程序;(2)操作系统服务程序是指向用户提供的系统调用等插口程序;(3)Bootloader主要完成硬件监测和系统引导;(4)操作系统内核是操作系统的主要核心部份,是整个系统的灵魂。其中arm 处理器 linux 移植,操作系统服务程序、操作系统内核及Bootloader被看作是操作系统部份。2.2Linux内核简介Linux内核主要由进程调度模块、内存管理模块、文件系统模块、进程间通讯模块和网路插口模块5个模块构成,如图2所示。图2Linux内核系统模块结构及互相依赖关
6、系各模块作用:(1)进程调度模块负责控制进程对CPU资源的使用,所采用的调度策略使各进程能公正合理地访问CPU,同时保证内核能及时执行硬件操作;(2)显存管理模块用于确保所有进程安全共享机器主显存区,它还支持虚拟显存管理方法,使Linux的进程可以使用比实际显存更多的显存容量,并可以借助文件系统把暂时不用的显存数据块交换到外部储存设备起来,当须要的时侯再交换回去;(3)文件系统模块用于支持对外部设备的驱动和储存;(4)进程间通讯模块用于支持多种进程间的信息交换方法;(5)网路插口模块提供对多种网路通讯标准的访问并支持许多网路硬件。Linux是开放源代码的,Linux操作系统设计本身具有的不同平
7、台之间的可移植性,但是所需的储存空间也很小。Linux内核是Linux最底层、最核心的部份,Linux操作系统就是在Linux内核上发展壮大上去的,而内核的移植则是任何嵌入式Linux开发中最关键部份。所有的内核源程序都可以在usrsrclinux下找到,大部份应用软件也都是遵照GPL而设计,遍及全球的诸多Linux爱好者又是Linux开发者的强悍技术支持。诸如:在Linux26的内核里主要包含有以下目录:arch主要是和体系结构相关的代码,里边几乎包含了目前流行的多数处理器体系结构,如ARM、Alpha、1386、MIpS、M68K、powerpC等。block主要是块设备的驱动程序。d
8、rivers字符设备以及一些常用计算机外设的驱动程序,主要针对通用计算机,也有针对具体嵌入式处理器的外设驱动。fs文件系统相关代码,有些用于虚拟文件系统。include主要包含各类CPU的头文件,也有一些通用的肉文件。initLinux内核的初始化代码linux系统镜像下载,有main函数以及init线程的代码。incLinux进程通讯机制相关代码。kemel通用的内核文件,包含内核基本功能部份的实现,如进程、时间等。mm显存管理部份。net网路设备的驱动程序。2.3内核移植简介2.3.1移植的基本概念移植,从广义上讲,移植包括软件移植和硬件移植;从狭义上讲,移植就是指软件移植,将要一个软件从
9、一个平台迁移到另外一个与众不同的平台上工作。移植可分为三种情况:1.从一个硬件平台移植到另外一个硬件平台首先是工具链的移植,在PC机上编译时要构建交叉编译工具链,同时还要考虑binutils、glibe等移植;其次是内核移植,主要包括两方面,一是arch目录下的体系结构的移植,二是移植drivers目录下的许多硬件驱动程序;最后是应用程序的移植,如Qt/embedded库的移植等。2.从一个操作系统移植到另外一个操作系统这些移植较常见。如:将Windows系统下运行的程序移植到Linux/UNIX系统中。3.从一种软件库环境移植到另外一种软件库环境这种类型的移植也较常见,如:将基于gli
10、bc库环境的程序移植到基于uclibc库环境去。2.3.2内核移植的打算Linux内核相对于其他操作系统而言有好多优点,如:平台的独立性、代码开放性等,所以被大多数硬件平台所选用,它现今早已成为嵌入式系统中的一个主流操作系统。移植内核首先要确保打算好编译内核的工具,Linux内核归根结底也是一个程序,所以它必须通过编译器编译后才会在硬件上执行;其次,从站点下载要移植的内核代码;最后检测要移植的开发板硬件是否打算就绪,打算完成后就可以即将移植内核了。3.内核移植3.1内核移植基本流程图3内核移植的过程3.2内核配置3.2.1更改Makefile(1)更改内核
11、根目录下的Makefile文件,指明要用的编译器为arm-linux-交叉编译器,使用的体系结构为ARM。具体操作如下:#cdlinux-2.6.10#viMakefile3.2.2设置NANDFlash分区首先构建一个NANDFlash分区表,该分区表拿来定义开发板上64MB的空间界定,以及定义各分区储存的起始地址以及大小等。该部份实现在arch/arm/mach-s3c2410/devs.c源文件中,需更改如下:/首先添加相应的头文件#include#include#inc
12、lude/新建64MB的NANDFlash分区表*/*1MB*/name:”bootloader”,size:0x00100000,offset:0x0,/定义一个NANDFlash分区数据结构structs3c2410_nand_setnamdset=nr_partitions:4,/定义分区数partitions:partitions_info,/定义分区表;其中,name为分区的名称,size为分区的大小,offset为分区在Flash中的起始地址,同时还定义了NANDFlash的分区数据结构。(2)紧接着要构建内核对NAND
13、Flash芯片的支持,同时加入对NANDFlash芯片的支持代码到NANDFlash的驱动程序。Arch/arm/mach-s3c2410/devs.c中的具体代码实现如下:/构建NANDFlash的芯片支持数据结构structs3c2410_platform_nandsuperlpplatform=tacls:0,twrph0:1,twrph1:0,sets:&nandset,/定义支持的分区集nr_sets:1,/定义分区集数,tacls:0,twrph0:1,twrph1:0含意为:tacls=1个HCLK时钟,twrph0=2个HCLK时钟,twrph1=1个
14、HCLK时钟。(3)在内核启动时正确添加对NANDFlash分区表的初始化配置,还须要更改Arch/arm/mach-s3c2410/mach-smdk2410.c源文件arm 处理器 linux 移植,更改如下:/降低对NANDFlash设备的支持staticstructplatform_device*smdk2410_devices_initdata=&s3c_divece_usb,&s3c_divece_lcd,&s3c_divece_wdt,&s3c_divece_i2c,&s3c_divece_iis,&s3c_divece_nand/添加此行来初始化新增
15、的NANDFlash分区,(4)严禁FlashECC校准因为BootLoader通过软件早已形成了ECC校准码,这与内核的ECC校准码不一致,所以要禁用严禁内核ECC校准。3.2.3配置内核选项操作如下:#cdlinux-2.6.10#cparch/arm/configs/sndk2410_defconfig.config#makemenuconfig配置内核的方式:1.makeconfigmakeconfig提供了一个命令行插口方法来配置内核,它会一个接着一个的寻问关于每一个选项。2.makeoldconfigmakeoldconfig会使用一个已有的config配
16、置文件,提示行会提示这些之前还没有配置过的选项,完成配置。3.makemenuconfigmakemenuconfig显示一个基于文本的图形化终端配置菜单,目前公觉得是使用最广泛的配置内核方法。4.makexconfigmakexconfig显示一个基于X窗口的配置菜单,用户可以通过图形用户界面和键盘来对内核进行配置3.3内核编译3.3.1交叉编译环境的构建无论编译器的功能有多么强悍,但它的实质都是一样的,都是把某种以数字和符号为内容的中级编程语言转换成机器语言指令的集合。所谓的交叉编译就是:借助运行在某类机器上的编译器编译某个源程序生成在另一类机器上运行的目标代码的过程,如图
17、4所示:图4交叉编译开发模型目前,常用的交叉开发环境主要有开放和商业两种类型。开放的交叉开发环境的典型代表是GNU工具链(Toolschain),目前早已才能支持x86、ARM、MIPS、PowerPC等多种处理器;商业的交叉开发环境主要有MetrowerksCodeWarrior、ARMSoftwareDevelopmentToolkit、SDSCrosscompiler、WindRiverTornado、MicrosoftEmbeddedVisualC+等。Linux使用GNU的工具,社区的开发者早已编译出了常用体系结构的交叉编译工具链。交叉编译环境工具链通常包括arm
18、-gcc,binutils(含AS汇编器,LD链接器等),glibc等。arm-linux-gcc是交叉编译器,arm-linux-ld是交叉链接器。Glibc是C语言库linux 命令,它们既要运行于当前体系的系统下,又要能生成和处理目标体系的文件。编撰好的嵌人式软件经过交叉编译和交叉链接后,一般会生成两种类型的可执行文件:用调试的可执行文件和用于固化的可执行文件。下载交叉编译工具armlinux-gcc341,将交叉编译器解压到相应的目录下,相应的命令为:#tarjxfarmlinuxgcc341tarbztarbz2,要注意解压后的路径。使用GNU编译程序,须要有Makefile文件。编译命令将按照Make
19、file文件的规则来决定怎样编译和联接程序。Makefile文件的作用可想而知。更改内核目录下的makefile文件,主要是以下几行:(1)注释掉ARCH:=$(shelluname-m|sed-esi86i386-essun4usparc64-esarmarm-essall0arm)这一行。(2)将ARCH:=改为ARCH:=arm(3)将CROSS_COMPILE:=改为CROSS_COM-PILE:=交叉编译工具中arm-linux所在目录arm-linux-(如:CROSS_COMPILE:=usrlocalarm2953binarm-linux-)随后就可以进行编译。
20、3.3.2交叉编译配置完毕后用make命令编译内核,内核的编译就是一个十分简单的过程。执行:1)#makeclean这条命令是在即将编译你的内核之前先把环境给清除干净,保证没有不正确的依赖文件存在;2)#makedep因为内核源码树中的大多数文件都与一些头文件有依赖关系,因而要将内核源码树中每位子目录形成的“depend”文件构建起依赖关系;3)#makezImage构建压缩的linux内核映像。编译完毕,在archarmboot目录下将会生成ARMLinux内核映像文件zImage,这就是即将移植到目标机的内核映像文件;4)#makemodules这条命令是编译在配置时选
21、择为模块的,即选项前为M的。假如内核配置选项中有选择编译为模块的,就须要此命令;假如将来还要对内核重新进行编译,则需执行命令“makedistclean”,消除依赖关系并清乘以前编译形成的文件,之后重复上述步骤即可;5)#makemodules_install将#makemodules生成的模块文件复制到相应的目录下。3.4内核下载内核下载就是将内核映像文件烧讲到目标板上,内核下载的前提是早已在目标板上下载了相应的Bootloader程序。以U-Boot为例:首先在开发使用的宿主机上构建一个tftp服务,之后使用超级终端或DNW工具板启动目标板,之后在U-Boot的命令行输入以下命令
22、:MIKE2410#tftp0x30008000zImageTFTPformserver;ourIPaddressis0FilenamezImage.Loadaddress:0xx3000800030008000Loading:##doneBytestransferred=890752(d9780hex)其中,0x30008000为指定下载到显存的地址,zImage就是生成的内核映像文件。下载完可以通过bootm命令来启动内核,具体如下:MIKE2410#bootm0x30008000#Bootingimageat0x30
23、008000StartingkernelUncompressinglinuxdone,bootingthekernel.4技术实现问题Linux具有开放、稳定和驱动资源丰富等特征,通过多年的发展,Linux核心中对ARM的支持已逐渐产生了完备的移植层结构,所以也就成为诸多Soc芯片设计商和板级开发商首选进行移植的操作系统。但对于移植者来说,移植系统涉及到中断、定时器、内存管理等多方面知识的实际运用,另外,对好多问题的出现无法快速定位,更得不到正确有效的解决。5.结束英语中探讨了在基于ARM核的S3C2410处理器为核心的ARM9平台上移植Linux操作系统的环境、方案和过程,对移
24、植的各个步骤进行了剖析,这对ARM9平台上的嵌入式Linux移植具有较好的实用价值和参考价值,同时对于其它平台上的嵌入式Linux移植的方式也具有一定的借鉴意义。目前,市场上存在着诸多的嵌入式操作系统,而在这种系统之中,兼有Linux和嵌入式优点的嵌入式Linux操作系统,凭着其在结构清晰、源代码开放性、裁剪性好,开发与使用均易实现等方面的优势,拥有巨大的市场前景和商业机会。参考文献1金建设.嵌入式系统基础教程M.上海:上海理工学院出版社.20092李亚锋,欧文盛等.ARM嵌入式Linux系统开发M.上海:复旦学院出版社.20073刘凯.ARM嵌入式插口技术应用M.上海:复旦学院出版社.20094刘淼.嵌入式系统插口设计与Linux驱动程序开发M.上海:上海航天民航学院出版社.20065郑灵翔.嵌入式Linux系统设计M.上海:上海民航学院出版社.2008设计性实验报告成绩:指导班主任签名:16