Bootloader学习笔记----系统移植

(学习资料摘抄和总结,非原创,勿载)

第一节   Bootloader基本概念

什么是Bootloader:是硬件启动的引导程序。是运行操作系统的前提。(类似于BIOS,将硬件信息告知操作系统来进行引导启动)

它是在操作系统内核和用户的应用程序之前就会运行的一段代码,用来对软硬件进行相应地初始化和设定,为最终运行操作系统准备好环境。

在嵌入式系统中,整个系统的启动加载任务通常由Bootloader来完成。

 

Bootloader的特点:

Bootloader不属于操作系统,采用汇编和C语言开发。需要针对特点的硬件平台编写。

在进行系统移植的时候,需要首先为开发板移植Bootloader,因为它是硬件启动的引导程序。

Bootloader依赖于CPU的体系结构,还依赖于嵌入式系统板设备的配置。

 

Bootloader操作模式:

自启动模式:过程没有用户介入,Bootloader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行。

交互模式:可以通过串口接受用户的命令。目标机上的Bootloader通过串口或网络等从开发主机(HOST)上,下载内核映像和根文件系统映像等到RAM中。

常用的Bootloader工具:

第二节 U-Boot命令

命令类型:环境设置,数据传输,存储器访问,加载运行

命令: 1. printenv  显示所有环境变量

eg:  U-boot #printenv

        baudrate=115200

        ipaddr=192.168.1.100

      ethaddr=12:34:56:78:9A:BC

  server ip=192.168.1.10

..............

            2.setenv设置新的变量

U-boot # setenv  myboard  FS4412

U-boot# printenv 

          baudrate=115200

          ipaddr=192.168.1.100

         ethaddr=11:22:33:44:55:66

         serverip=192.168.1.10

         myboard=FS4412

         Environment size:320/16380 bytes

 

         3.saveenv 将当前定义的所有的环境变量值存入flash中

         4.tftp通过网络下载程序

U-boot # setenv ethaddr 11:22:33:44:55:66

U-boot # setenv  ipaddr    192.168.1.100

U-boot # setenv  serverip 192.168.1.10

U-boot # tftp  41000000  application.bin

U-boot # tftp  41000000  zimage

           

         5.protect : 对Nor Flash写保护

protect on 0 10000 :对区间【0x0,0x10000】写保护

protect off 0 10000: 对FLASH区间【0x0,0x10000】取消保护

           

          6.erase:   擦除Nor FLASH

erase all :擦除FLASH所有的扇区

erase 0 10000:擦除FLASH区间【0x0,0x10000】

        

           7.Nand相关命令

 nand read addr off size

nand  write addr off size

nand  erase [clean] [off size]

 

           8.movi命令

movi   init :初始化eMMC并显示相关信息

movi   read   u-boot/kernel   addr

movi   read   rootfs  addr    size

movi   write   u-boot/kernel   addr

movi   write   rootfs  addr    size

 

          9.bootcmd  自启动命令:如果定义了该变量,在自启动模式下将会执行该环境变量中的命令

 U-boot  # setenv  bootcmd  tftp  41000000  uImage\; bootm 41000000

 U-boot  # saveenv

 

          10.go addr:执行内存中的二进制代码,简单的跳转到指定的地址

          11.bootm  kernel-addr   ramdisk-addr   dtb-addr:引导内核为内核传参,其中内核和ramdisk通常为mkimage处理过的二进制文件

          

 

 

           第三节.U-boot配置编译

1.平台相关:arch     board     include......

2.平台无关:common     net      fs    drivers  ...........

3.工具和文档:tools     doc

目录结构如下:

 

 

U-boot的编译:

     整个工程通过Makefile来组织编译。

     顶层目录下的Makefile中包含了开发板的配置信息。从顶层目录开始递归地调用各级子目录下的Makefile,最后链接成u-boot映像。

    ------顶层目录下的Makefile------

它负责u-boot整体配置和编译

在Makefile中指定使用的交叉工具链

配置u-boot:  make   origen_config

编译:        make 

 

   -----------U-boot编译生成的映像文件--------

          文件名                                       内容

       u-boot.map                  u-boot映像的符号表(方便源码跟踪)

       u-boot                          u-boot映像的ELF格式

       u-boot.bin                    u-boot映像原始的二进制格式(烧录用)(exynos4412需加入BL1)

       u-boot.srec                  u-boot映像的S-Record格式

 

----------------------烧录编译产生的镜像  u-boot.bin  -----------------------

 -------初次或开发板代码损坏不能正常启动时,可采用JTAG工具烧录

          专用的烧录工具如h-jtag或者DNW等

--------在u-boot已经能工作,升级或修正u-boot时,可用u-boot中的命令来烧录

其他方式如sd卡,Fastboot 命令

 

-------------------------------镜像固化位置-----------------------------------------

ROM, NOR,  FLASH,  NAND  FLASH   EMMC等  

 

 

 

 

第四节     U-boot启动

第一条指令如何执行?

初始化哪些硬件,先后顺序如何?

如何加载内核?

性能提升?

注解:

-------BL1文件是一段外部代码,存放在SD卡或者nandflash上,除了BL1文件,还有BL0和BL2文件。

-------BL0文件是存放在CPU内部IROM中的一段固化代码,CPU上点之后,首先去运行BL0文件。

-------BL2文件是完整的U-boot代码。

-------三个文件的关系:BL0运行时,会将BL1拷贝到CPU的IRAM中,执行BL1

                                     BL1文件执行起来之后会先初始化内存,后将BL2拷贝到外部内存中

 

 

======U-boot启动源码分析===========

----第一条指令位置(参考u-boot.map) arch/arn/cpu/armv7/start.S里的 _start:b   reset

----设置为SVC模式    msr   cpsr , r0

----关闭MMU  Cache  cpu_init_cp15

----基本硬件设备初始化:  board/samsung/fs4412/lowlevel_init.S的 lowlevel_init

关中断,看门狗,初始化时钟,串口,flash内存

----自搬移到内存:relocate_code

----设置栈:  IRQ  stack  frame

 

 

----主播进入C部分: bl  _main(参见u-boot.map)

----大部分硬件初始化:arch\arm\lib\board.c\board_init_f  里的init_sequence

----搬移内核到内存运行:

common/main.c              main_loop->getenv("bootcmd")

bootdelay >=   0  &&  s  &&  !abortboot(bootdelay))下的run_command(bootcmd)

 

 

 

 

 

第五节     U-boot移植方法

----擅用对比软件Beyond

----选择官方源码版本下载,配置编译

指定交叉编译工具链-->指定CPU和board(参考最类似配置如origen)-->编译

----实现串口信息输出

跟踪运行路径(led点灯法);

串口输出(检查uart初始化相关部分代码,见lowlevel_init.s);

----网卡移植(实现能用tftp  nfs  方便开发调试)

寄存器地址;

参数设置;

----FLASH移植(实现能下载软件到FLASH,产品能离线运行)

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值