• uboot启动第二阶段


      这里先对我们的sd卡和内存的存储分布进行描述:

    1  总内存为:0x30000000~0x40000000和0x40000000~0x50000000共512MB

    uboot占用内存2MB,起始地址:0xc3e00000

    启动时会将ZIMAGE放置0x30008000

    将tag信息放置0x30000100

    2  sd卡存储分布:存储信息定义include/movi.h

        1~17(block)    BL1    8KB

        17~49(block)    ENV    16KB

        49~1073      BL2    512KB

        1073~9265    ZIMAGE    4MB

        9265~62513    ROOTFS   26MB

      uboot第一阶段通过长跳转进入start_armboot函数即进入第二阶段,该函数位于lib_arm/board.c

    此时整个完整的uboot在内存空间0xc3e00000处占2MB

    1  463~479 uboot堆空间向下偏移方式分配空间给gd和gd->bd指针的数据结构,

        gd的定义在70行:DECLARE_GLOBAL_DATA_PTR即gd绑定寄存器r8

    2  483开始遍历init_sequence数组中的函数指针

    3  遍历1:cpu_init  位于cpu/s5pc11x/cpu.c  这里什么也没做

    4  遍历2:board_init  位于board/samsung/x210/x210.c  这里初始化网卡DM9000的一些寄存器

        gd->bd->bi_arch_number赋值(机器码2456)gd->bd->bi_boot_params赋值(内核传参内存地址)(0x3000 0100)

    5  遍历3:interrupt_init  位于cpu/s5pc11x/interrupts.c  将timer4定时为10ms一次溢出。

    6  遍历4:env_init  位于common/env_auto.c ENV_IS_EMBEDDED宏未定义,

        将gd->env_addr赋值为内存中默认的环境变量的首地址,gd->env_valid = 1(表明环境变量可用);

    7  遍历5:init_baudrate  位于lib_arm/board.c  将环境变量中的波特率赋值给gd->bd->bi_baudrate = gd->baudrate

    8  遍历6:serial_init  位于cpu/s5pc11x/serial.c  这里什么也没做

    9  遍历7:console_init_f  位于common/console.c  这里只将gd->have_console = 1;

    10  遍历8:display_banner  位于common/board.c  用串口打印版本信息。此时控制台未初始化printf会调用serial_puts输出

        打印信息为“U-Boot 1.3.4 (Nov 5 2019 - 20:45:46) for x210”

    11  遍历9:print_cpuinfo  位于cpu/s5pc11x/s5pc11o/speed.c  用于打印cpu时钟信息还打印"Serial = CLKUART "

    12  遍历10:checkboard位于board/samsung/x210/x210.c中用于打印板子版本这里是printf(" Board:   X210 ");

    13  遍历11:dram_init  位于board/samsung/x210/x210.c就是gd->bd->bi_dram[]这个结构体进行赋值

    14  遍历12:display_dram_config  位于lib_arm/board.c  用于计算dram的大小并且将其打印出来,同时遍历结束。

    15  490~494 为详细分析会打印“Flash:   8 MB”

    16  496~523 未编译

    17  527 初始化堆管理器由于栈是向下减的所以我们设置栈在堆得上面 CFG_MALLOC_LEN=912KB

    18  600~633 初始化mmc其实就是初始化mmc的结构体,这里根据我们的配置初始化了通道0和2对应的结构体为mmc_channel[0],mmc_channel[2]

       并将其加入mmc_devices全局链表,我们还打印了通道2的容量“SD/MMC:  15193MB”

    19  777行env_relocate (),初始化环境变量。先malloc一段内存作为环境变量空间,从sd中读取环境变量crc检验出错则用系统定义的环境变量,

        将gd->env_addr指向这段内存空间。

    20  789行从环境变量中获取IP地址赋值给gd->bd->bi_ip_addr

    21  792~817从环境变量获取MAC地址赋值给gd->bd->bi_enetaddr[]

    22  819行devices_init该函数位于common/devices.c,首先devlist是ListStruct结构体的二维指针,分配ListStruct和ListStruct一维指针空间

        并被devlist指向,并在devlist中注册串口设备

    23  825行jumptable_init ();将二维函数指针gd->jt 指向分配的函数指针空间,并填充函数

    24  827行console_init_r控制台初始化,将标准输入,输出,错误的设备文件指针stdio_devices[0~2]设置为加入设备列表的串口设备指针

        同时将gd->jt中相应的输入输出函数设置为串口的输入输出函数,gd->flags |= GD_FLG_DEVINIT表明最基本的系统设备已添加成功

        同时打印:  In: serial  Out: serial  Err: serial,表示可以使用标准输入输出设备,这里是指向串口设备

    25  836行enable_interrupts函数为空,因为把中断的宏关了,uboot一般不需要中断

    26  857~863从环境变量中读取"loadaddr"和"bootfile"分别赋值给全局变量load_addr和BootFile,因为环境变量中未设置所以保持原样

        这两个变量与系统的启动有关

    27  867行board_late_init函数为空

    28  873行eth_initialize函数为空

    28  888行x210_preboot_init初始化LCD,打印LOGO

    29  893~906行判断进入启动模式还是更新模式,启动模式则进入main_loop

    30  397~412进入启动倒计时,按下任意键打断启动进入shell模式

    31  输入movi read kernel 30008000命令从sd卡中读取ZIMAGE到30008000中

    32  输入bootm 30008000启动先进入do_bootm校验ZIMAGE文件调用do_bootm_linux

        从环境变量中获取bootargs和machid将bootargs和内存容量。。。等信息分别制作成tag存放在0x30000100中

        跳转内核入口传参为  0  机器码  tag地址

  • 相关阅读:
    关于视图的说明和设计
    关于REST风格API的设计
    关于 Linux 操作
    文件删除
    文件写入有读取
    生成器,迭代器
    Linux防火墙相关命令
    Linux下安装Maven
    Linux下安装Nginx
    Word相关知识点
  • 原文地址:https://www.cnblogs.com/genshu123/p/11801906.html
Copyright © 2020-2023  润新知