单片机有最小系统,所谓最小系统,就是单片机能正常工作所需要的最少外设。对于Uboot来说,同样有个最小系统,因为Uboot最主要的功能就是引导内核。下面我们通过一个简单的Mini-Uboot来分析Uboot的启动加载过程。(只是分析过程,此Uboot具有引导内核功能)

注:这个uboot 只是具有基本的内核引导功能,只是作为前期简单的学习使用,入门而已,并不是正常的uboot 启动流程

具体uboot (u-boot-2013.01)启动过程移步Exynos4412 Uboot 移植(二)—— Uboot 启动流程分析

下面是mini-uboot 的根目录树状图:

我们拿到一个工程,想了解它的功能,最方便的就是读它的makefile。

一、Makefile

  1. sinclude include/config.mk
  2. #ARCH=arm
  3. #CPU=arm920t
  4. #VENDOR=samsung
  5. #SOC=s3c2410
  6. #BOARD=smdk2410
  7. SRC_TREE:=$(shell pwd)
  8. MKCONFIG=$(SRC_TREE)/mkconfig
  9. INCLUDE_PATH=include
  10. DRIVER_PATH=driver
  11. LIB_DIR=lib
  12. CFLAG=-mabi=apcs-gnu -fno-builtin  -fno-builtin-function -g -O0 -c  -I$(INCLUDE_PATH) -I$(DRIVER_PATH) -o
  13. LDFLAG=-Tcpu/arm/arm_cortexa8/map.lds  -o
  14. OBJS= cpu/$(ARCH)/$(CPU)/start.o
  15. OBJS+=lib_arm/board.o
  16. OBJS+=board/$(VENDOR)/$(BOARD)/lowlevel_init.o
  17. OBJS+=board/$(VENDOR)/$(BOARD)/mem_setup.o
  18. OBJS+=board/$(VENDOR)/$(BOARD)/nand.o
  19. OBJS+=driver/uart.o
  20. OBJS+=lib/string.o
  21. OBJS+=common/do_go.o
  22. OBJS+=common/main.o
  23. ifeq ($(ARCH), arm)
  24. CROSS_COMPILE=arm-cortex_a8-linux-gnueabi-
  25. endif
  26. PROJ_NAME=mini_uboot
  27. all: $(OBJS)
  28. $(CROSS_COMPILE)ld $(OBJS) $(LDFLAG) $(PROJ_NAME).elf
  29. $(CROSS_COMPILE)objcopy -O binary $(PROJ_NAME).elf $(PROJ_NAME).bin
  30. $(CROSS_COMPILE)objdump -D $(PROJ_NAME).elf  > $(PROJ_NAME).dis
  31. cp *.bin /tftpboot
  32. %.o: %.S
  33. $(CROSS_COMPILE)gcc $(CFLAG) $@ $<
  34. %.o: %.s
  35. $(CROSS_COMPILE)gcc $(CFLAG) $@ $<
  36. %.o: %.c
  37. $(CROSS_COMPILE)gcc $(CFLAG) $@ $<
  38. fsc100_config:          #    ARCH  CPU       VENDOR   BOARD  SOC
  39. $(MKCONFIG) $(@:_config=) arm arm_cortexa8 samsung fsc100 s5pc100
  40. #mkconfig  fsc100 arm arm_cortexa8 samsung fsc100 s5pc100
  41. smdk2410_config:            #    ARCH  CPU       VENDOR   BOARD  SOC
  42. $(MKCONFIG) $(@:_config=) arm arm920t samsung smdk2410 s3c2410
  43. clean:
  44. @rm -rf $(OBJS) *.bin *.elf config.mk

这里以2440为例,咱们来分析:

  1. #ARCH=arm
  2. #CPU=arm920t
  3. #VENDOR=samsung
  4. #SOC=s3c2410
  5. #BOARD=smdk2410

架构为arm,CPU为arm920t,生产商 samsung,片上系统sc2410,板子为smdk2410。

  1. OBJS= cpu/$(ARCH)/$(CPU)/start.o
  2. OBJS+=lib_arm/board.o
  3. OBJS+=board/$(VENDOR)/$(BOARD)/lowlevel_init.o
  4. OBJS+=board/$(VENDOR)/$(BOARD)/mem_setup.o
  5. OBJS+=board/$(VENDOR)/$(BOARD)/nand.o
  6. OBJS+=driver/uart.o
  7. OBJS+=lib/string.o
  8. OBJS+=common/do_go.o
  9. OBJS+=common/main.o

OBJS为依赖文件,生成的.o文件。

  1. ifeq ($(ARCH), arm)
  2. CROSS_COMPILE=arm-cortex_a8-linux-gnueabi-
  3. endif

根据相应的架构,制作相应的交叉编译工具。

  1. all: $(OBJS)
  2. $(CROSS_COMPILE)ld $(OBJS) $(LDFLAG) $(PROJ_NAME).elf
  3. $(CROSS_COMPILE)objcopy -O binary $(PROJ_NAME).elf $(PROJ_NAME).bin
  4. $(CROSS_COMPILE)objdump -D $(PROJ_NAME).elf  > $(PROJ_NAME).dis

第一步:连接 ;第二步:格式转换;第三步:反汇编 " >" 为重定向的意思;

  1. %.o: %.S
  2. $(CROSS_COMPILE)gcc $(CFLAG) $@ $<
  3. %.o: %.s
  4. $(CROSS_COMPILE)gcc $(CFLAG) $@ $<
  5. %.o: %.c
  6. $(CROSS_COMPILE)gcc $(CFLAG) $@ $<

将所有的.S 文件、.s文件、.c文件编译成.o文件。

注意:.S文件可以在编译过程接受参数,.s文件不可以。

二、链接文件

  1. OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
  2. /*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
  3. OUTPUT_ARCH(arm)
  4. ENTRY(_start)  //指定入口地址
  5. SECTIONS    //段信息
  6. {
  7. /* . */
  8. . = 0x22000000; //elf文件的入口地址
  9. . = ALIGN(4);   //指定四字节对齐
  10. .text      :    //代码段
  11. {
  12. cpu/arm/arm_cortexa8/start.o(.text) //确保执行的第一段代码是start.o
  13. *(.text)        //所有代码段融合在一起
  14. }
  15. . = ALIGN(4);
  16. .rodata :   //只读数据段
  17. { *(.rodata) }  //所有数据段
  18. . = ALIGN(4);
  19. .data :     //数据段
  20. { *(.data) }
  21. . = ALIGN(4);
  22. _start_bss = .; //bss段开始地址
  23. .bss :
  24. { *(.bss) }
  25. _end_bss = .;       //bss段结束地址,两者可确定bss段大小
  26. }

三、start.s文件(Uboot执行的第一个文件)

    1. @ 汇编中的宏
    2. .equ USER_MODE, 0x10    @define USER_MODE 0x10
    3. .equ IRQ_MODE,  0x12
    4. .equ SVC_MODE,  0x13
    5. .equ MODE_MASK, 0x1f
    6. .section .text
    7. .global _start
    8. @ 不支持异常处理的,这里只写了复位异常处理
    9. _start:
    10. vector:
    11. b  reset_handler
    12. nop     @undef ......
    13. nop
    14. nop
    15. nop
    16. nop
    17. nop
    18. nop
    19. reset_handler:
    20. @step 1: svc close irq fiq      //第一步:将运行模式改成SVC模式
    21. mrs r0, cpsr            //修改cpsr模式位
    22. bic r0, r0, #0x1f
    23. orr r0, r0, #0xc0  @IRQ FIQ     //关闭IRQ FIQ
    24. msr cpsr_c, r0
    25. @step 2: cache 关闭I CACHE D CACHE    //第二步:关闭cache,直接运行,不需缓存
    26. mrc p15, 0, r0, c12, c0, 0
    27. bic r0, #0x1000
    28. bic r0, #0x2
    29. mcr p15, 0, r0, c12, c0, 0
    30. @step 3:                //第三步:调用电路板级初始化程序, system clock , dram, watchdog
    31. @bl low_level_init      //初始化时钟、dram、关闭看门狗
    32. @step 4: sp-> 0x30000000     //第四步:设置栈指针,使其指向一个地址即可
    33. ldr sp, =0x2e000000
    34. @step 5: mini_uboot.bin  > 16KB   bin < 16KB
    35. @step 5 代码自搬移
    36. @copy_miniuboot_rto_sdram 如果你的代码大于了16KB代码需要实现自我搬移
    37. @step 6:                //第六步:清除BSS段,BSS段大小由链接文件里确定
    38. @STEP 6.1 , 清除 BSS段
    39. @
    40. clear_bss:
    41. ldr r0, =_start_bss   @| BSS 起始地址
    42. ldr r1, =_end_bss     @| BSS 终止地址
    43. mov r2, #0
    44. bss_loop:
    45. cmp r0, r1
    46. strne r2, [r0], #4
    47. bne bss_loop
    48. @step  7, 进入C           //跳转到C程序入口
    49. b start_armboot
    50. stop:
    51. b stop
    52. .end

mini-uboot 启动过程简单分析的更多相关文章

  1. U-Boot启动过程完全分析

    U-Boot启动过程完全分析 1.1       U-Boot工作过程 U-Boot启动内核的过程可以分为两个阶段,两个阶段的功能如下: (1)第一阶段的功能 硬件设备初始化 加载U-Boot第二阶段 ...

  2. U-Boot启动过程完全分析<转>

    转载自:http://www.cnblogs.com/heaad/archive/2010/07/17/1779829.html 1.1       U-Boot工作过程 U-Boot启动内核的过程可 ...

  3. 【ARM-Linux开发】U-Boot启动过程--详细版的完全分析

    ---------------------------------------------------------------------------------------------------- ...

  4. Android应用程序组件Content Provider的启动过程源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6963418 通过前面的学习,我们知道在Andr ...

  5. uboot启动过程理解

    对于2440而言,启动的方式不多.一般就是外界一个NAND FLASH ,2440内部有个NAND FLASH Controller,会自动把NAND FLASH的前4K拷贝到2440的片内SRAM. ...

  6. (四)SpringBoot启动过程的分析-预处理ApplicationContext

    -- 以下内容均基于2.1.8.RELEASE版本 紧接着上一篇(三)SpringBoot启动过程的分析-创建应用程序上下文,本文将分析上下文创建完毕之后的下一步操作:预处理上下文容器. 预处理上下文 ...

  7. (五)SpringBoot启动过程的分析-刷新ApplicationContext

    -- 以下内容均基于2.1.8.RELEASE版本 紧接着上一篇[(四)SpringBoot启动过程的分析-预处理ApplicationContext] (https://www.cnblogs.co ...

  8. Android系统默认Home应用程序(Launcher)的启动过程源代码分析

    在前面一篇文章中,我们分析了Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还需要有一个 Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home ...

  9. 海思uboot启动流程详细分析(转)

    海思uboot启动流程详细分析(一) 海思uboot启动流程详细分析(二) 海思uboot启动流程详细分析(三)  

随机推荐

  1. Linux基础学习-使用iSCSI服务部署网络存储

    使用iSCSI服务部署网络存储 iSCSI技术实现了物理硬盘设备与TCP/IP网络协议的相互结合,使得用户可以通过互联网方便地访问远程机房提供的共享存储资源.下面介绍如何在Linux上部署iSCSI服 ...

  2. 面向对象之多态,property

    多态: 同一种事物有多种状态 多态性: 在不考虑对象具体类型的前提下直接调用对象下的方法 静态多态性和动态多态性 静态多态性:都可以进行+操作 动态多态性:不考虑对象具体类型调用方法 多态的好处: ① ...

  3. python中的list、tuple和dictionary

    列表 列表是python中最基本的数据结构之一,并且列表的数据项不需要具有相同的数据类型,创建一个列表,只需把逗号分隔的不同数据项使用方括号括起来即可.具体的定义式如下: list=['变量1','变 ...

  4. 不同深度的图片转换cvConvertScale

    不同深度图像的转换:要注意范围比如IPL_DEPTH_8U 转到 IPL_DEPTH_32U要用cvConvertScale(pImg8, pImg32, 1.0/255, 0); 要除255反过来I ...

  5. OpenGLES2.0着色器语言glsl

    OpenGLES2.0中是强制使用可编程的渲染管线的,使用的是glsl着色器语言,因为着色器语言是使用的GPU,即图形处理单元,而不是CPU,这样可以使CPU从繁重的几何计算和像素的处理中解脱出来了. ...

  6. Idea使用Tomcat乱码 tomcat 9.0 8.5.37乱码

    使用新版tomcat 如8.5.37,9.0.14的时候idea控制台输出乱码,很简单老版本的如8.5.31就不会乱码,使用比较工具比较一下发现如下变化, 关键的关键是\apache-tomcat-8 ...

  7. Python开发:面向对象

    Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的. 如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在 ...

  8. Hive中文注释乱码解决方案(2)

    本文来自网易云社区 作者:王潘安 执行阶段 launchTask    回到Driver类的runInternal方法,看以下执行过程.在runInternal方法中,执行过程调用了execute方法 ...

  9. POJ-2318 TOYS,暴力+叉积判断!

                                                                 TOYS 2页的提交记录终于搞明白了. 题意:一个盒子由n块挡板分成n+1块区 ...

  10. HDU——2444The Accomodation of Students(BFS判二分图+最大匹配裸题)

    The Accomodation of Students Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...