优快云仅用于增加百度收录权重,排版未优化,日常不维护。请访问:www.hceng.cn 查看、评论。
本博文对应地址: https://hceng.cn/2017/03/26/U-Boot分析、移植及使用/#more
该系列主要是为驱动学习提供基石,从0到Qt。本文是该系列的第二篇:对U-Boot进行分析及移植.
1.U-Boot结构分析
Bootloader一般可以分成两个阶段:
- 第一个阶段通常使用汇编进行必要的硬件初始化,例如:关看门狗、关中断、设置时钟频率、RAM初始化等。除此之外,还要将第二阶段的代码复制到RAM中,设置好栈,然后跳到第二阶段,该阶段主要是与SOC平台相关。
- 第二阶段一般是用c语言编写,该阶段主要和开发板板载资源相关。该阶段主要初始化后续的硬件,处理内存映射、以及将内核和根文件系统从Flash“搬运”到RAM中运行,然后传入启动参数,最后启动引导内核,完成使命。
Linux中系统一般的分区结构,如下图:
分区主要分为四个分区:Bootloader、Boot parameters、Kernel、Root filesystem。其中Boot parameters是待传入内核的参数,Kernel即内核、Root filesystem是根文件系统。Bootloader在第一个分区(假设该储存介质为Nand Flash),则在Nand Flash的地址为0x0000 0000,S3C2440上电后,硬件自动把Nand Flash上前4k代码复杂到自己内部RAM中运行。该4k代码先要初始化一些必要的硬件,如看门狗,中断等,然后准备好SRAM,并将后续的代码复制到SDRAM中,再跳到SDRAM中运行,完成Bootloader第一阶段。此时在SDRAM中的第二阶段代码开始工作,首先还是初始化硬件,处理内存映射,把Nand Flash上内核和根文件系统“搬运”到SDRAM准备运行,然后根据用户通过串口传入的启动参数放在Boot parameters,然后内核启动,完成使命。内核启动后,开始去Boot parameters寻找启动参数,根据启动参数做出相应的操作,如:控制台输出、串口波特率、根文件系统位置。
2.U-Boot源码分析
这里根据u-boot-1.1.6的源码进行分析,,主要工作有:
- 第一阶段的硬件初始化(CPU模式、看门狗、中断)
- 准备SDRAM
- 设置堆栈
- 搬运FLASH中的代码到SDRAM
- 清除.bss段并跳转至第二阶段
- 第二阶段的硬件初始化(时钟、串口)
- 内存映射
- 根据传入参数启动内核
2.1第一阶段
该阶段的源码在/arch/cpu/arm920t/start.S
中:首先进行硬件初始化,包括设置CPU模式,关闭看门狗、关闭中断。这里把时钟配置放在了第二阶段。
- 设置CPU模式
把CPU设置为SVC模式,将当前程序状态计数器CPSR的值保存到r0中,利用bic指令清除r0的0x1f并存入r0中,再利用orr指令或运算上0xd3并存入r0,最后r0写回CPSR,这一过程就把CPSR设置为SVC模式:
{% cod