Linux内核移植 (china-unix)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

首先打开arch/arm/kernel/vmlinux.lds文件,找到815行 ,代码如下: 815 ASSERT((__proc_info_end - __proc_info_begin), "missing CPU support")
20.4.2
建立machine_desc结构
Linux内核提供了MACHINE_START和 MACHINE_END宏供建立machine_desc结构使用,建议使 用宏建立结构。 打开arch/arm/mach-s3c2410/mach-mini2440.c文件,加 入下面的代码:
20.2
平台相关代码结构
Linux内核代码目录基本是安装功能块划分的,每个功能 块的代码存放在一个目录下。如mm目录存放内存管理单元相 关代码;ipc存放了进程间通信相关的代码;kernel存放进程 调度相关代码等。 arch目录下每个平台的代码都采用了与内核代码相同的 目录结构。以arch/arm目录为例,该目录下mm、lib、kernel 、boot目录与内核目录下对应目录的功能相同。此外,还有一 些以字符串mach开头的目录,对应不同处理器特定的代码。 从arch目录结构可以看出,平台相关的代码都存放到arch目录 下,并且使用与内核目录相同的结构。使用SourceInsight工具 可以看到许多的同名称函数,原因就是内核代码调用的函数 是平台相关的,每个平台都有自己的实现方法。对于内核来 说,使用相同的名字调用,通过编译选项选择对应平台的代 码。
20.4
建立目标平台代码框架
在20.2.2节编译的内核代码最后出现了链接错误,提示 vmlinux.lds文件链接失败。lds文件是GNU ld工具使用的一 种脚本文件,该文件描述了如何分配链接后的内存区域和地 址等信息,通过lds文件报的错误可以顺藤摸瓜分析问题所 在。
20.4.1
ARM处理器相关结构
20.4.5
测试代码结构
回到内核源代码根目录,执行“make ARCH=arm CROSS_COMPILE=arm-linux- bzImage”开始编译内核。这 次编译没有出错信息,会得到正确的编译结果,查看 arch/arm/boot目录已经有目标文件Image.gz,表示已经编译 生成运行于ARM处理器的内核。 到目前为止,已经可以编译工作在ARM处理器上的代 码,但是内核代码还不能启动,因为还没有加入实际的代码 ,在下节介绍如何加入目标平台相关的代码。
ቤተ መጻሕፍቲ ባይዱ0.5.3
中断处理
内核提供了一个s3c24xx_init_irq()处理函数,因此中断 处理函数直接引用即可: 186 void __init mini2440_init_irq(void) 187 { 188 s3c24xx_init_irq(); // 调用系统提供的中断处理 函数 189 }
53 MACHINE_START(MINI2440, "MINI2440") 54 55 56 57 58 59 60 61 .phys_ram = S3C2410_SDRAM_PA, .phys_io = S3C2410_PA_UART, .io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc, .boot_params = S3C2410_SDRAM_PA + 0x100, .init_irq = mini2440_init_irq, .map_io = mini2440_map_io, .init_machine = mini2440_init, .timer = &s3c24xx_timer, 63 MACHINE_END
下: 56 void __init mini2440_init(void) 57 { 58 set_s3c2410ts_info(&mini2440_ts_cfg); // 注册 触摸屏结构 59 set_s3c2410udc_info(&mini2440_udc_cfg); // 注 册UDC结构 60 set_s3c2410fb_info(&mini2440_lcdcfg); // 注 册LCD结构 61 }
20.5.4
定时器处理
内核提供了一个定时器处理函数结构如下: struct sys_timer s3c24xx_timer = { .init = s3c2410_timer_init, // 定时器初始化函数 .offset = s3c2410_gettimeoffset, // 获取定时器值 .resume = s3c2410_timer_setup // 恢复定时器设置 };
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 .resume = s3c2410_timer_setup // 恢复定时 器 256 };
20.1
Linux内核移植要点
Linux本身对内存管理(MMU)有很好的支持。因此 ,在移植的时候首先要考虑到目标硬件平台是否支持MMU 。以ARM平台为例,ARM7内核的CPU不支持MMU,无法 直接把Linux内核代码移植到ARM7核的硬件平台。μcLinux 是专门针对ARM7这类没有MMU的硬件平台设计的,它精 简了MMU部分代码。本书的目标平台是S3C2440A,该处理 器基于ARM9核,支持MMU,可以直接移植Linux 2.6版本 的内核代码。 1.目标平台 2.内存管理单元(MMU) 3.内存映射 4.存储器
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 }
lds文件是gnuld工具使用的一种脚本文件该文件描述了如何分配链接后的内存区域和地址等信息通过lds文件报的错误可以顺藤摸瓜分析问题所2041arm处理器相关结构首先打开archarmkernelvmlinuxlds文件找到815行代码如下
第20章
Linux内核移植
软件移植的概念简单的说就是让一套软件在指定的硬 件平台上正常运行。移植至少包括了两个不同的硬件或者软 件平台。对于应用软件来说,移植主要考虑操作系统的差异 ,重点在修改系统调用。本章的重点是Linux内核移植,需 要考虑的硬件平台的差异,涉及较多知识。主要内容如下: Linux内核移植要点 内核体系结构框架 从现有代码移植内核
20.6
小结
本章介绍了如何移植Linux内核代码到新的开发板。移 植内核到新的硬件平台是一件繁琐的事情,读者在移植过程 中需要有耐心。移植内核代码要涉及到软件和硬件相关的知 识,读者应该结合硬件提供的电路图纸和手册,利用现有的 软件工具和代码,构建符合需求的内核代码。第21章讲解 Linux内核和应用程序的调试技术。
20.3.2
设置宏与代码文件的对应关系
在设置宏与代码文件对应关系之前,首先建立一个空 的代码文件。在arch/arm/mach-s3c2410目录下建立machmini2440.c文件,用于存放与mini2440开发板相关的代码。 建立mach-mini2440.c文件后,修改arch/arm/machs3c2410/Makefile文件,在文件最后加入mach-mini2440.c文 件的编译信息: 43 obj-$(CONFIG_ARCH_MINI2440) += machmini2440.o
20.5.5
编译最终代码
到目前为止,已经添加了所有与mini2440开发板有关 的代码,保存文件后,可以开始编译内核。回到内核代码根 目录,执行“make ARCH=arm CROSS_COMPILE=armlinux- bzImage”重新编译代码,最终在arch/arm/boot目录下 生成bzImage文件,针对开发板的内核代码编译成功。 通过U-Boot或者其他的Bootloader工具可以把代码烧写 到开发板的Flash存储器,然后重新启动开发板,可以从液 晶屏看到启动过程打印的提示信息。 提示:由于没有设置USB控制器和声音控制器,因此 开发板上USB和声音相关的功能都无法使用。
20.3
建立目标平台工程框架
Linux内核2.6版本已经对ARM处理器有很好的支持, 并且对三星公司的S3C2440提供一定支持。但是,嵌入式硬 件系统的差别很大,移植Linux内核到新的开发板仍然需要 修改或者增加针对特定硬件的代码。
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 here if you are using the mini2440.
20.5
构建目标板代码
Linux内核已经为ARM处理器设计好了代码框架,只 要按照这个框架加入针对某种开发板和处理器的代码即可工 作。加入代码还是按照前面提到的原则,能使用已有的通用 代码尽量使用,并且尽可能的参考现有开发板代码的处理方 法。
20.5.1
处理器初始化
首先在mach-mini2440.c文件加入处理器初始化代码如
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_init_uarts(mini2440_uartcfgs, ARRAY_SIZE(mini2440_uartcfgs)); 155 s3c24xx_set_board(&mini2440_board); 156 s3c_device_nand.dev.platform_data = &bit_nand_info; 157 }
[ ] 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
20.3.3
测试工程框架
工程框架配置修改完毕后,需要进行简单的测试,根据 测试结果判断框架是否搭建成功。回到内核代码顶层目录, 输入“make ARCH=arm CROSS_COMPILE=arm-linuxmenuconfig”命令,出现内核设置图形界面。 加载默认配置文件后,可以开始配置新增加的菜单。进 入“System Types”菜单项,打开“S3C24XX Implementations”菜单,出现一个目标开发板的列表:
相关文档
最新文档