第20章Linux内核移植ppt课件_第1页
第20章Linux内核移植ppt课件_第2页
第20章Linux内核移植ppt课件_第3页
第20章Linux内核移植ppt课件_第4页
第20章Linux内核移植ppt课件_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第2020章章 LinuxLinux内核移植内核移植软件移植的概念简单的说就是让一套软件在指定的硬软件移植的概念简单的说就是让一套软件在指定的硬件平台上正常运行。移植至少包括了两个不同的硬件或者软件平台上正常运行。移植至少包括了两个不同的硬件或者软件平台。对于应用软件来说,移植主要考虑操作系统的差异件平台。对于应用软件来说,移植主要考虑操作系统的差异,重点在修改系统调用。本章的重点是,重点在修改系统调用。本章的重点是Linux内核移植,需内核移植,需要考虑的硬件平台的差异,涉及较多知识。主要内容如下:要考虑的硬件平台的差异,涉及较多知识。主要内容如下:Linux内核移植要点内核移植要点内核体

2、系结构框架内核体系结构框架从现有代码移植内核从现有代码移植内核20.1 Linux20.1 Linux内核移植要点内核移植要点Linux本身对内存管理本身对内存管理MMU有很好的支持。因而有很好的支持。因而,在移植的时候首先要考虑到目标硬件平台是否支持,在移植的时候首先要考虑到目标硬件平台是否支持MMU。以。以ARM平台为例,平台为例,ARM7内核的内核的CPU不支持不支持MMU,无法,无法直接把直接把Linux内核代码移植到内核代码移植到ARM7核的硬件平台。核的硬件平台。cLinux是专门针对是专门针对ARM7这类没有这类没有MMU的硬件平台设计的,它精的硬件平台设计的,它精简了简了MMU

3、部分代码。本书的目标平台是部分代码。本书的目标平台是S3C2440A,该处理,该处理器基于器基于ARM9核,支持核,支持MMU,可以直接移植,可以直接移植Linux 2.6版本版本的内核代码。的内核代码。1目标平台目标平台2内存管理单元内存管理单元MMU)3内存映射内存映射4存储器存储器20.2 20.2 平台相关代码结构平台相关代码结构Linux内核代码目录基本是安装功能块划分的,每个功能内核代码目录基本是安装功能块划分的,每个功能块的代码存放在一个目录下。如块的代码存放在一个目录下。如mm目录存放内存管理单元相目录存放内存管理单元相关代码;关代码;ipc存放了进程间通信相关的代码;存放了进

4、程间通信相关的代码;kernel存放进程存放进程调度相关代码等。调度相关代码等。arch目录下每个平台的代码都采用了与内核代码相同的目录下每个平台的代码都采用了与内核代码相同的目录结构。以目录结构。以arch/arm目录为例,该目录下目录为例,该目录下mm、lib、kernel、boot目录与内核目录下对应目录的功能相同。此外,还有一目录与内核目录下对应目录的功能相同。此外,还有一些以字符串些以字符串mach开头的目录,对应不同处理器特定的代码。开头的目录,对应不同处理器特定的代码。从从arch目录结构可以看出,平台相关的代码都存放到目录结构可以看出,平台相关的代码都存放到arch目录目录下,

5、并且使用与内核目录相同的结构。使用下,并且使用与内核目录相同的结构。使用SourceInsight工具工具可以看到许多的同名称函数,原因就是内核代码调用的函数可以看到许多的同名称函数,原因就是内核代码调用的函数是平台相关的,每个平台都有自己的实现方法。对于内核来是平台相关的,每个平台都有自己的实现方法。对于内核来说,使用相同的名字调用,通过编译选项选择对应平台的代说,使用相同的名字调用,通过编译选项选择对应平台的代码。码。20.3 20.3 建立目标平台工程框架建立目标平台工程框架Linux内核内核2.6版本已经对版本已经对ARM处理器有很好的支持,处理器有很好的支持,并且对三星公司的并且对三

6、星公司的S3C2440提供一定支持。但是,嵌入式硬提供一定支持。但是,嵌入式硬件系统的差别很大,移植件系统的差别很大,移植Linux内核到新的开发板仍然需要内核到新的开发板仍然需要修改或者增加针对特定硬件的代码。修改或者增加针对特定硬件的代码。20.3.1 20.3.1 加入编译菜单项加入编译菜单项修改修改arch/arm/mach-s3c2410/Kconfig文件,在文件,在“endmenu之前加入下面的内容:之前加入下面的内容: 87 config ARCH_MINI2440 88 bool mini2440 89 select CPU_S3C2440 90 help 91 Say Y

7、here if you are using the mini2440.20.3.2 20.3.2 设置宏与代码文件的对应关系设置宏与代码文件的对应关系在设置宏与代码文件对应关系之前,首先建立一个空在设置宏与代码文件对应关系之前,首先建立一个空的代码文件。在的代码文件。在arch/arm/mach-s3c2410目录下建立目录下建立mach-mini2440.c文件,用于存放与文件,用于存放与mini2440开发板相关的代码。开发板相关的代码。建立建立mach-mini2440.c文件后,修改文件后,修改arch/arm/mach-s3c2410/Makefile文件,在文件最后加入文件,在文件

8、最后加入mach-mini2440.c文文件的编译信息:件的编译信息:43 obj-$(CONFIG_ARCH_MINI2440) += mach-mini2440.o20.3.3 20.3.3 测试工程框架测试工程框架工程框架配置修改完毕后,需要进行简单的测试,根据工程框架配置修改完毕后,需要进行简单的测试,根据测试结果判断框架是否搭建成功。回到内核代码顶层目录,测试结果判断框架是否搭建成功。回到内核代码顶层目录,输入输入“make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig命令,出现内核设置图形界面。命令,出现内核设置图形界面。加载默认配置文件

9、后,可以开始配置新增加的菜单。进加载默认配置文件后,可以开始配置新增加的菜单。进入入“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 NEXCODE

10、R 2440 Light Board mini244020.4 20.4 建立目标平台代码框架建立目标平台代码框架在在20.2.2节编译的内核代码最后出现了链接错误,提示节编译的内核代码最后出现了链接错误,提示vmlinux.lds文件链接失败。文件链接失败。lds文件是文件是GNU ld工具使用的一工具使用的一种脚本文件,该文件描述了如何分配链接后的内存区域和地种脚本文件,该文件描述了如何分配链接后的内存区域和地址等信息,通过址等信息,通过lds文件报的错误可以顺藤摸瓜分析问题所文件报的错误可以顺藤摸瓜分析问题所在。在。20.4.1 ARM20.4.1 ARM处理器相关结构处理器相关结构首先

11、打开首先打开arch/arm/kernel/vmlinux.lds文件,找到文件,找到815行行,代码如下:,代码如下:815 ASSERT(_proc_info_end - _proc_info_begin), missing CPU support)20.4.2 20.4.2 建立建立machine_descmachine_desc结构结构Linux内核提供了内核提供了MACHINE_START和和MACHINE_END宏供建立宏供建立machine_desc结构使用,建议使结构使用,建议使用宏建立结构。用宏建立结构。打开打开arch/arm/mach-s3c2410/mach-mini2

12、440.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) & 0 xfffc, 57 .boot_params = S3C2410_SDRAM_PA + 0 x100, 58 .init_irq = mini2440_init_irq, 59 .map_io = mini2440_map_io, 60

13、.init_machine = mini2440_init, 61 .timer = &s3c24xx_timer, 63 MACHINE_END20.4.3 20.4.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 2

14、0.4.4 20.4.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 .re

15、sume = s3c2410_timer_setup/ 恢复定时恢复定时器器 256 ;20.4.5 20.4.5 测试代码结构测试代码结构回到内核源代码根目录,执行回到内核源代码根目录,执行“make ARCH=arm CROSS_COMPILE=arm-linux- bzImage开始编译内核。开始编译内核。这次编译没有出错信息,会得到正确的编译结果,查看这次编译没有出错信息,会得到正确的编译结果,查看arch/arm/boot目录已经有目标文件目录已经有目标文件Image.gz,表示已经编译,表示已经编译生成运行于生成运行于ARM处理器的内核。处理器的内核。到目前为止,已经可以编译工作在

16、到目前为止,已经可以编译工作在ARM处理器上的代处理器上的代码,但是内核代码还不能启动,因为还没有加入实际的代码码,但是内核代码还不能启动,因为还没有加入实际的代码,在下节介绍如何加入目标平台相关的代码。,在下节介绍如何加入目标平台相关的代码。20.5 20.5 构建目标板代码构建目标板代码Linux内核已经为内核已经为ARM处理器设计好了代码框架,只要处理器设计好了代码框架,只要按照这个框架加入针对某种开发板和处理器的代码即可工作按照这个框架加入针对某种开发板和处理器的代码即可工作。加入代码还是按照前面提到的原则,能使用已有的通用代。加入代码还是按照前面提到的原则,能使用已有的通用代码尽量使

17、用,并且尽可能的参考现有开发板代码的处理方法码尽量使用,并且尽可能的参考现有开发板代码的处理方法。20.5.1 20.5.1 处理器初始化处理器初始化首先在首先在mach-mini2440.c文件加入处理器初始化代码如文件加入处理器初始化代码如下:下: 56 void _init mini2440_init(void) 57 58 set_s3c2410ts_info(&mini2440_ts_cfg);/ 注册注册触摸屏结构触摸屏结构 59 set_s3c2410udc_info(&mini2440_udc_cfg);/ 注注册册UDC结构结构 60 set_s3c2410f

18、b_info(&mini2440_lcdcfg);/ 注注册册LCD结构结构 61 20.5.2 20.5.2 端口映射端口映射端口映射函数设置端口映射函数设置S3C2440处理器的处理器的I/O端口描述结构端口描述结构、时钟频率、串口等,代码如下:、时钟频率、串口等,代码如下: 150 void _init mini2440_map_io(void) 151 152 s3c24xx_init_io(mini2440_iodesc, ARRAY_SIZE(mini2440_iodesc); 153 s3c24xx_init_clocks(12000000); 154 s3c24xx_i

19、nit_uarts(mini2440_uartcfgs, ARRAY_SIZE(mini2440_uartcfgs); 155 s3c24xx_set_board(&mini2440_board); 156 s3c_device_nand.dev.platform_data = &bit_nand_info; 157 20.5.3 20.5.3 中断处理中断处理内核提供了一个内核提供了一个s3c24xx_init_irq()处理函数,因此中断处理函数,因此中断处理函数直接引用即可:处理函数直接引用即可: 186 void _init mini2440_init_irq(void

20、) 187 188 s3c24xx_init_irq(); / 调用系统提供的中断处理调用系统提供的中断处理函数函数 189 20.5.4 20.5.4 定时器处理定时器处理内核提供了一个定时器处理函数结构如下:内核提供了一个定时器处理函数结构如下:struct sys_timer s3c24xx_timer = .init= s3c2410_timer_init,/ 定时器初始化函数定时器初始化函数.offset= s3c2410_gettimeoffset,/ 获取定时器值获取定时器值.resume= s3c2410_timer_setup/ 恢复定时器设置恢复定时器设置;20.5.5 20.5.5 编译最终代码编译最终代码到目前为止,已经添加了所有与到目前为止,已经添加了所有与mini2440开发板有关的开发板有关的代码,保存文件后,可以开始编译内核。回到内核代码根目代码,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论