首先要理解嵌入式系统移植的基本概念:
软件的移植是系统开发中最常见的一项工作。嵌入式系统移植一般来说指的是引导程序、操作系统等和硬件关系
比较密切的软件在一个新的硬件平台上运行起来的过程。
嵌入式系统移植分为以下几种:
引导程序移植
操作系统移植
应用程序移植
引导程序移植
1、引导程序就是在操作系统内核运行之前运行的一段程序。通过这段程序,可以初始化硬件设备、将系统的软硬件
环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境
2、引导程序的主要目的有两个:初始化硬件和引导操作系统。一般来说,只要能在硬件平台上把这两个部分做好就可以了
操作系统移植中关心的是以下几个:
中断系统的移植:不同的硬件系统中断结构差别都非常大,正确的移植是设备驱动能正常工作的前提
时钟系统的移植:时钟是维系整个操作系统的运行的基石
内存管理系统的移植:一般对linux来说主要是IO映射的移植
设备驱动的移植
os移植需要掌握的概念
时钟系统在线程切换中的作用——时钟与中断(重中之重)
mmu的概念
虚拟内存的映射
应用程序移植
应用程序移植一般指的是将其移植到某个操作系统上,难度一般是体现在将一个应用移植到一个新的操作系统的情
况下存在的。硬件平台的差异对于应用影响不是很大,当然也不排除一些需要特殊硬件支持的应用程序。
系统移植的难点
一般来说,嵌入式系统移植工作中的代码编写量不会很大,代码的逻辑也不会非常复杂。移植的难度并不在于代码
的编写,而在于移植者对于系统的理解程度。移植者必须对所移植的系统的硬件结构、操作系统的基本工作原理等
非常理解,才可能把移植工作很好的完成
Bootloader移植
什么是bootloader
简单地说,bootloader就是在操作系统内核运行之前运行的一段小程序。通过这段程序,我们可以初始化硬件设
备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好
正确的环境。
bootloader的主要功能
1、PC系统中的
BIOS启动和自检
OS Loader:grub 或LILO
PC系统启动过程
2、嵌入式系统中的
初始化硬件,为系统运行建立环境,类似PC的BIOS
读入OS核心并引导
为系统的可升级性和可调试性提供方便
-将系统的可执行image进行替换和升级
-从串口或Ethernet向目标系统中下载image
建立一个基本的命令环境
bootloader——stage1
硬件设备初始化(内存控制器的设置)
为加载bootloader的stage2部分的代码准备RAM空间
拷贝bootloader的stage2部分的代码到RAM空间中,并跳转执行
设置好堆栈,Heap等
跳转到stage2的C入口点
bootloader——stage2
初始化本阶段要使用到的硬件设备(net,flash等)
将OS映像从flash上读到RAM空间中
为OS设置启动参数
跳转到OS内核image的入口点
U-Boot(Universal Bootloader)
GPL下资源代码最完整的一个通用BootLoader
支持绝大部分处理器架构
Powerpc arm mips i386 nios m68k ......
支持大量开发板:214个开发板(u-boot1.1.6)
大量外设驱动
http://sourceforge.net/projects/u-boot
U-Boot的目录树结构
board/:所有支持的开发板
cpu/:所有支持的cpu
disk/,drivers/,fs/,lib_xxx/,net/,toos/,etc
u-boot的编译
重点理解 链接脚本
- start.o_____________ /
- u-boot.lds----------- =========>link<===========与开发板相关的*.c文件
- libgcc.a-------------/
link-------------->u-boot(elf)------------------>OBJCOPY -O binary---------------->u-boot.bin
u-boot的启动过程分析(第一阶段)
- 关中断,初始化PLL,设置时钟,MMU操作,lowlevel_init(初始化bank时序)
- 重定位u-boot,实际大部分情况是将u-boot第二阶段代码和数据拷贝到SDRAM中
- 设置stack,这里实际也包括设置heap等
- clear BSS段
- 跳转到第二阶段(注意已经是在C的环境中)
u-boot的启动过程分析(第二阶段)
- 分配gd:gd = (gd_t*)(_armboot_start-CFG_MALLOC_LEN-sizeof(gd_t);
- 调用初始化序列 board_init interrupt_init
- 一系列的初始化
- 进入主循环,等待输入命令
linux核心的启动
cmd_myboot.c
检查image信息
设置引导参数
启动核心:两个函数mach_type,addr