10.艰难学习Linux之u-boot分析

U-boot分析
一.前言
Windows:
上电 --》 BIOS –》引导操作系统 –》识别出c盘D盘等 –》运行应用程序
嵌入式系统
上电 –》bootloader à启动内核 –》挂接根文件系统 –》运行应用程序
二.目的:
(1)官方下载普通的u-boot,通过打补丁变为自己开发板用的u-boot. (打补丁就是代码
添加替换的过程)
(2)了解u-boot 的功能和结构
(3)从什么地方开始入手分析 u-boot更为方便。
(4)u-boot如何实现命令的,怎么添加一个自己的命令。
(5)启动内核的过程分析。

说明:把上面的问题都搞明白了,就可以根据需要制作出自己的bootloader,一个功能强大的boot可以方便开发,不过它最主要的功能还是启动内核。U-boot相当于一个比较复杂的单片机程序。

三.开始u-boot 的学习
1.打补丁,编译,烧写。
(1).想要学好一个东西,肯定要先会用,首先下载好官方的u-boot,然后将补丁打上去,
何为打补丁,一个程序你想修改要找到位置,然后替换你想要的代码。这么庞大的代码量,不需要你手工替换,只要把想改的代码做成补丁文件,打补丁操作就为你把代码替换了。
(2)
解压缩 :tar  xjf  u-boot-1.1.63.tar.bz2
打补丁:patch –p1 <../u-boot-1.1.6_jz2440.path 打补丁操作。(-p1忽略第一个斜杠之前的
路径)
  配置:make 100ask24x0_config
  编译:make
(3)烧写到开发板里面,串口能够打印出信息,然后就可以根据提示,通过usb下载文件或者直接启动文件。

2.u-boot 功能
u-boot最终目的为启动内核(从falsh读出内核放到SDRAM,然后启动内核)
硬件相关初始化:
(1)关看门狗
(2)初始化时钟(跑的更快),初始化串口(查看打印信息)
(3)初始化SDRAM
(4)启动内核
能够读FLASH,写FLASH(为了开发方便,通过网卡usb等来下载程序)

3.通过makefile来分析u-boot
想分析这么多的文件,最好的方法就是通过makefile。
(1)配置过程:make 100ask24x0_config
打开 makefile文件,找到100ask24x0_config位置(这个东西是自己打补丁替换的)
Make 100ask24x0_config  
à 相当于执行以下命令:
 @$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0
MKCONFIG    := $(SRCTREE)/mkconfig
à相当于执行
Mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0
然后开始分析mkconfig脚本文件
脚本文件中$0表示传入的第一个参数
$0           $1        $2      $3          $4      $5   $6
Mkconfig 100ask24x0 arm  arm920t  100ask24x0  NULL  s3c24x0
BOARD_NAME = 100ask24x0 (文件名字)
ln -s asm-$2 asm 指向ARM架构(源码架构很多)用来包含用到的架构的文件,类似于宏定义,传参数一类的,方便移植
ln –s  arch-s3c24x0 asm-arm/arch (将处理器指向为s3c24x0) 
CPU 设置为 arm920t  
Soc = s3c24x0

脚本文件写了这么多,其实就类似于一个传参数过程,源码为了兼容各个系统,包含
了很多架构和CPU,配置过程就相当于指定过程,这样系统才会加载适合你单板的文件。
配置完成后会生成个config.mk,下面的编译需要用到,这样配置和编译过程就联系到一起了
(2)make命令分析
通过生成的东西,makefile则可以判断选择相应的编译工具。
通过各个的依赖关系,来生成最后的文件

OBJS = cpu/arm920t/start.o
LIBS =lib_generic/libgeneric.a
LIBS+=board/100ask24x0/lib100ask24x0.a
LIBS+=cpu/arm920t/libarm920t.a

$(obj)u-boot:        depend version $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT) UNDEF_SYM=`$(OBJDUMP) -x $(LIBS) |sed  -n -e 
's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\  cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \--start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \-Map u-boot.map -o u-boot
在makefile中就是这么个链接过程,可以直接执行make指令,查看执行结果,最后输出u-boot.

(1)首先编译CPU/$(CPU)/start.s,对于不同的CPU,还可能编译CPU/$(CPU)下的其他文件。
(2)对于平台开发板相关的目录,每个通用目录使用各自的makefaile生成相应的库。
(3)将1.2步骤的o .a文件按照board/$(boarffir)/config.mk 文件中指定的代码段起始地址,board/$(BOARDDIR)/U-boot.lds连接脚本进行连接。
(4)将第三步骤生成的.Elf格式的U-boot,makefile再将他们生成二进制,
s-record格式等。

4.分析u-boot源码第一阶段
单片机开始的启动工作
(1)初始化(关看门狗  初始化时钟  初始化SDRAM)
(2)把程序从Nand转移到SDRAM(如果程序大的情况)
(3)设置栈(调用C函数用到栈)指定一块内存
U-boot为复杂点的单片机程序流程与之前应用的相差应该不大,只是更复杂些。
(1)硬件相关的初始化(以上的初始化工作)
(2)调用c函数(复杂的功能用汇编写比较困难)读出内核,启动内核等工作

第一阶段主要是初始化硬件设备,为加载u-boot的第二阶段代码准备RAM空间

从第一个开始编译的文件 CPU/$(CPU)/start.s,开始进行源码的分析
(1)设置CPU为svc32管理模式
u-boot第一阶段
(2)关看门狗,关中断 关闭MMU,CACHE
(3)初始化SDRAM
(4)设置栈
(5)设置CLKDIVN寄存器(FCLK,HCLK PCLK的比例)时钟
(6)代码从 flash(nor flash 或者NAND flash) 拷贝到SDRAM
(7)清BSS段(无初始值的静态变量和全局变量在BSS段)
(8)调用start.armboot C函数(实现更为复杂的功能)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值