ARM平台下的嵌入式linux移植大纲(一)

2019-07-13 04:40发布

首先要理解嵌入式系统移植的基本概念: 软件的移植是系统开发中最常见的一项工作。嵌入式系统移植一般来说指的是引导程序、操作系统等和硬件关系 比较密切的软件在一个新的硬件平台上运行起来的过程。   嵌入式系统移植分为以下几种: 引导程序移植 操作系统移植 应用程序移植   引导程序移植 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的编译 重点理解   链接脚本
  1. start.o_____________ /
  2. u-boot.lds-----------  =========>link<===========与开发板相关的*.c文件
  3. 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