u-boot启动过程 u-boot (3)

1.u-boot启动模式简介

uboot包含启动模式和下载模式。

启动模式(boot loading)这种模式也称之为“自主”,整个过程是没有用户的参与的

下载模式(downloadig)这种模式下。目标机上的bootloader通过串口或者是网络来从主机上下载文件,然后控制启动流程

 

2.u-boot启动分析

由于一个可执行的image文件必须有一个入口点,这个入口点通常是放在flash的0x0处,因此必须通知编译器使其知道这个

工作是通过/board/smdk2410/uboot.lds来实现的

ENTRY(_start)
SECTIONS
{
        . = 0x00000000;

        . = ALIGN(4);
        .text      :
        {
          cpu/arm920t/start.o   (.text)
          *(.text)
        }

       *****

u-boot在代码区的位置在board/smdk2410/config.mk

# Linux-Kernel is expected to be at 3000'8000, entry 3000'8000
# optionally with a ramdisk at 3080'0000
TEXT_BASE = 0x33F80000

 

###################################

下面开始分析start.S文件

###################################

/*

 * 当发生异常时,执行/cpu/arm920t/interrupts.c中的中断处理函数

 */

.globl _start
_start: b       reset
        ldr     pc, _undefined_instruction
        ldr     pc, _software_interrupt
        ldr     pc, _prefetch_abort
        ldr     pc, _data_abort
        ldr     pc, _not_used
        ldr     pc, _irq
        ldr     pc, _fiq
/*
 * the actual reset code,实际开始运行点,设置为特权模式SVC
 */

/* turn off the watchdog,设置cpu频率*/

/* 与内存管理相关寄存器的设置 */

 /* relocate U-Boot to RAM           */

 /* Set up the stack  */

/* clear bss */

ldr     pc, _start_armboot跳转到start_armboot(lib_arm/board.c)的c代码开始执行

 

###########################

board.c

############################

board.c文件中主函数是start_armboot函数,该函数同时也是整个uboot的主函数。

        for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
                if ((*init_fnc_ptr)() != 0) {
                        hang ();
                }
        }

调用init_sequence中函数

/* configure available FLASH banks */

configure LCD

configure network

            *

 

最后调用函数main_loop来实现接受串口中传来的命令,调用相应函数(main_loop在common/main.c中定义)       *

/* main_loop() can return to retry autoboot, if so just run it again. */
        for (;;) {
                main_loop ();
        }

 

#############################

main.c

##############################

在main.c中接受串口的命令来执行

 for (;;)

      // get command and execute the command

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
U-boot是一个开放源代码的引导加载程序,它是嵌入式Linux系统中非常重要的一部分。它主要负责完成硬件初始化、文件系统加载、内核启动、DTB传递等工作。下面是U-boot启动过程的详细分析: 1. 通电启动 当开关通电时,处理器会执行引导ROM中的启动代码。 2. 初始化寄存器 在进入U-boot之前,系统所有的寄存器都是未初始化的。U-boot要负责初始化CPU的所有寄存器,以确保所有设备都能正常工作。 3. 读取U-boot U-boot位于NOR或NAND闪存器中。为了读取U-boot,首先必须确定闪存器的类型和接口。当读取闪存器中的第一个块(一般是U-boot头)时,U-boot校验它的合法性,包括校验和、magic number、版本号等。如果校验失败,U-boot将停止执行。 4. 解压缩U-boot 如果U-boot被压缩了,那么需要用解压缩算法对其进行解压缩。在这个过程中,需要注意解压缩的起始地址和大小。 5. 设置环境变量 U-boot提供了一些环境变量,可以用来配置系统参数,例如:IP地址、MAC地址等。在这一步骤中,U-boot会将环境变量加载到DRAM中进行管理。同时,也可以通过TFTP、NFS等方式从外部存储设备中加载环境变量。 6. 初始化硬件 在U-boot启动过程中,需要对各种设备进行初始化。这些设备包括:串口、网络接口、SD卡、USB设备、SPI设备等。初始化完成后,U-boot才能正常使用这些设备。 7. 加载内核 U-boot负责加载内核到指定的内存地址。这个过程可以通过很多方式来完成:串口、SD卡、网络等。在加载内核之前,U-boot还会加载设备树文件(DTB)。 8. 启动内核 U-boot会将内核启动参数(包括设备树的地址)传递给内核,并通过软件跳转实现内核启动。此时,U-boot的使命就完成了,内核将接管系统的控制权。 总之,U-boot启动过程非常复杂,但是也非常重要。因为U-boot提供了系统启动所需的所有基础设施,从而保证了Linux系统的正常运行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值