资源预览内容
第1页 / 共28页
第2页 / 共28页
第3页 / 共28页
第4页 / 共28页
第5页 / 共28页
第6页 / 共28页
第7页 / 共28页
第8页 / 共28页
第9页 / 共28页
第10页 / 共28页
亲,该文档总共28页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
Linux内核移植,TPV XM-SWD1 2012.12.21,Linux内核移植 2012-12-21 chuxu,主要内容 什么是移植? 内核组成 Linux内核移植要点 平台相关代码结构 建立目标平台工程框架 建立目标平台代码框架 构建目标板代码,Linux内核移植 2012-12-21 chuxu,1、什么是移植? 移植就是让一个平台的代码能够在其它平台上运行。 将Linux运行在ARM上,即称为Linux在ARM上的移植。 移植大致分3个层次:体系结构、处理器和板级移植。 通常所说的移植指的是Linux内核移植,而不是发行版本的移植。 将Linux移植到ARM的前提:熟悉Linux系统运行机理、熟悉Linux内核代码结构、 掌握ARM体系结构、目标处理器、目标系统、掌握GNU汇编和C编程以及Linux 下脚本编程。 通常仅需要作板级移植,有必要时进行处理器级移植。 参考现有的移植。,Linux内核移植 2012-12-21 chuxu,软件移植的概念简单的说就是让一套软件在指定的硬件平台上正常运行。移植至少包括了两个不同的硬件或者软件平台。对于应用软件来说,移植主要考虑操作系统的差异,重点在修改系统调用。,Linux内核移植 2012-12-21 chuxu,2、内核组成Linux内核由进程管理、内存管理、文件系统、 网络接口、进程间通信、设备驱动等模块组成。Linux内核代码包含这些目录: arch Documentation drivers fs init include ipc kernel lib mm net scripts,Linux内核移植 2012-12-21 chuxu,/arch目录包含各体系结构特定的代码,如ARM、i386、PPC、MIPS等。 /Documentation目录存放相关说明文档。 /include目录存放相关头文件。 /kernel目录包含Linux内核管理代码。 /scripts目录存放一些脚本文件。 /drivers目录包含Linux内核所有设备驱动。 /init目录包含内核初始化代码。 /lib目录包含一些库文件。 /mm目录存放内存管理代码。 /fs目录存放所有文件系统代码。 /ipc目录存放进程间通信代码。 /net目录存放网络相关代码。,Linux内核移植 2012-12-21 chuxu,3、Linux内核移植要点Linux本身对内存管理(MMU)有很好的支持。因此,在移植的时候首先要考虑到目标硬件平台是否支持MMU。以ARM平台为例,ARM7内核的CPU不支持MMU,无法直接把Linux内核代码移植到ARM7核的硬件平台。cLinux是专门针对ARM7这类没有MMU的硬件平台设计的,它精简了MMU部分代码。本讲义以S3C2440A目标平台为例进行说明,该处理器基于ARM9核,支持MMU,可以直接移植Linux 2.6版本的内核代码。,Linux内核移植 2012-12-21 chuxu,(1)目标平台目标平台包括了嵌入式处理器和周围器件,处理器可能整合了一些周围器件,如中断控制器、定时器、总线控制器等。在移植之前需要确定被移植系统对外部设备和总线的支持情况。ARM开发板采用mini2440平台,在S3C2440A外围连接了许多外围设备,包括NOR Flash存储器、NAND Flash存储器、网络接口芯片、USB控制器等。在S3C2440A处理器内部集成了许多常用的控制器以及嵌入式领域常用的总线控制器。对于移植Linux内核来说,操作处理器内部的控制器要比外部的设备容易得多。,Linux内核移植 2012-12-21 chuxu,(2)内存管理单元(MMU)对于现代计算机来说,MMU负责内存地址保护、虚拟地址和物理地址相互转换工作。在使用MMU的硬件平台上,操作系统通过MMU可以向应用程序提供大于实际物理内存的地址空间,使应用程序获得更高性能。Linux的虚拟内存管理功能就是借助MMU实现的。在移植的时候要考虑目标平台的MMU操作机制,这部分代码是较难理解的,最好能在相似代码基础上修改,降低开发难度。,Linux内核移植 2012-12-21 chuxu,(3)内存映射嵌入式系统大多都没有配备硬盘,外部存储器只有Flash,并且系统内存也非常有限。内存控制器(Memory Controller)负责内部和外部存储器在处理器地址空间的映射,由于硬件预设的地址不同导致每种平台内存映射的地址也不同。在移植时需要参考硬件的用户手册,得到内存地址的映射方法。,Linux内核移植 2012-12-21 chuxu,(4)存储器由于嵌入式系统大多数用Flash存储器作为存储装置。对于文件系统来说,在PC流行的ext2、ext3文件系统在嵌入式系统无法发挥作用。幸好Linux支持许多文件系统,针对Flash存储器可以使用JFFS2、YAFFS等文件系统。在移植的时候,不必要的文件系统都可以裁剪掉。,Linux内核移植 2012-12-21 chuxu,4、平台相关代码结构Linux内核代码目录基本是按照功能块划分的,每个功能块的代码存放在一个目录下。如mm目录存放内存管理单元相关代码;ipc存放了进程间通信相关的代码;kernel存放进程调度相关代码等。arch目录下每个平台的代码都采用了与内核代码相同的目录结构。以arch/arm目录为例,该目录下mm、lib、kernel、boot目录与内核目录下对应目录的功能相同。此外,还有一些以字符串mach开头的目录,对应不同处理器特定的代码。从arch目录结构可以看出,平台相关的代码都存放到arch目录下,并且使用与内核目录相同的结构。使用Source Insight工具可以看到许多的同名称函数,原因就是内核代码调用的函数是平台相关的,每个平台都有自己的实现方法。对于内核来说,使用相同的名字调用,通过编译选项选择对应平台的代码。,Linux内核移植 2012-12-21 chuxu,5、建立目标平台工程框架Linux内核2.6版本已经对ARM处理器有很好的支持,并且对三星公司的S3C2440提供一定支持。但是,嵌入式硬件系统的差别很大,移植Linux内核到新的开发板仍然需要修改或者增加针对特定硬件的代码。,Linux内核移植 2012-12-21 chuxu,(1)加入编译菜单项修改arch/arm/mach-s3c2410/Kconfig文件,在“end menu”之前加入下面的内容:87 config ARCH_MINI2440 88 bool “mini2440“ 89 select CPU_S3C2440 90 help91 Say Y here if you are using the mini2440.,Linux内核移植 2012-12-21 chuxu,(2)设置宏与代码文件的对应关系在设置宏与代码文件对应关系之前,首先建立一个空的代码文件。在arch/arm/mach-s3c2410目录下建立mach-mini2440.c文件,用于存放与mini2440开发板相关的代码。建立mach-mini2440.c文件后,修改arch/arm/mach-s3c2410/Makefile文件,在文件最后加入mach-mini2440.c文件的编译信息: 43 obj-$(CONFIG_ARCH_MINI2440) += mach-mini2440.o,Linux内核移植 2012-12-21 chuxu,(3)测试工程框架工程框架配置修改完毕后,需要进行简单的测试,根据测试结果判断框架是否搭建成功。回到内核代码顶层目录,输入“make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig”命令,出现内核设置图形界面。加载默认配置文件后,可以开始配置新增加的菜单。进入“System Types”菜单项,打开“S3C24XX Implementations”菜单,出现一个目标开发板的列表: Simtec Electronics BAST (EB2410ITX) IPAQ H1940 Acer N30 SMDK2410/A9M2410 SMDK2440 AESOP2440 QQ2440/mini2440 Thorcom VR1000 HP iPAQ rx3715 NexVision OTOM Board NexVision NEXCODER 2440 Light Board mini2440,Linux内核移植 2012-12-21 chuxu,6、建立目标平台代码框架 (1) ARM处理器相关结构首先打开arch/arm/kernel/vmlinux.lds文件,找到815行,代码如下: 815 ASSERT(_proc_info_end - _proc_info_begin), “missing CPU support“),Linux内核移植 2012-12-21 chuxu,(2)建立machine_desc结构Linux内核提供了MACHINE_START和MACHINE_END宏供建立machine_desc结构使用,建议使用宏建立结构。打开arch/arm/mach-s3c2410/mach-mini2440.c文件,加入下面的代码:53 MACHINE_START(MINI2440, “MINI2440“)54 .phys_ram = S3C2410_SDRAM_PA, 55 .phys_io = S3C2410_PA_UART, 56 .io_pg_offst = (u32)S3C24XX_VA_UART) 18) & 0xfffc,57 .boot_params = S3C2410_SDRAM_PA + 0x100, 58 .init_irq = mini2440_init_irq, 59 .map_io = mini2440_map_io, 60 .init_machine = mini2440_init, 61 .timer = &s3c24xx_timer, 63 MACHINE_END,Linux内核移植 2012-12-21 chuxu,(3)加入处理函数在mach-mini2440.c文件加入MINI2440结构中指定的几个函数定义如下:52 void _init mini2440_init_irq(void) 53 54 55 56 void _init mini2440_init(void) 57 58 59 60 void _init mini2440_map_io(void) 61 62 ,Linux内核移植 2012-12-21 chuxu,(4)加入定时器结构在MINI2440结构定义中,使用了一个名为s3c24xx_timer的sys_timer结构变量,该变量定义在arch/arm/mach-s3c2410/timer.c文件定义如下:252 struct sys_timer s3c24xx_timer = 253 .init = s3c2410_timer_init, / 定时器初始化函数254 .offset = s3c2410_gettimeoffset, / 读取定时器延时255 .resume = s3c2410_timer_setup / 恢复定时器256 ;,Linux内核移植 2012-12-21 chuxu,(5)测试代码结构回到内核源代码根目录,执行“make ARCH=arm CROSS_COMPILE=arm-linux- bzImage”开始编译内核,得到正确的编译结果,查看arch/arm/boot目录已经有目标文件Image.gz,表示已经编译生成运行于ARM处理器的内核。到目前为止,已经可以编译工作在ARM处理器上的代码,但是内核代码还不能启动,因为还没有加入实际的代码,下面介绍如何加入目标平台相关的代码。,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号