uboot 学习笔记

  1. ram 初始化: 在 start.S 中, bl cpu_init_crit 这句,在 tq2440 中是直接调用,在韦东山里面是通过和 TEXT_BASE 进行比较,如果从 RAM 中运行就不进行 初始化。

  2. uboot 第一阶段初始化主要在 start.S 里面,主要是芯片本身初始化。第二阶段初始化是从 lib_arm/board.c 里面的 start_armboot 开始的,里面有一个 for 循环,通过函数指针调用函数,存储这些指针的结构体 gd 在 SDRAM 中的 128 字节的 CPU_GBL_DATA_SIZE 里面,相应的函数实现在 board/EmbedSky/EmbedSky.c 里面。

  3. 在 start_armboot 函数中,韦东山代码增加了一个判断,从调试器加载时,相应的处理。if (PreLoadedONRAM)

  4. command.c command.h 中有 u_boot_cmd 这个段相关的变量,最后通过 链接文件,链接到一起。然后函数执行的时候,遍历段中所有的结构体的命令,相等的就执行相应的函数。

  5. 增加 uboot 命令,可以仿照 do_bootm 命令来制作自己的命令,需要提供 函数 do_ 和 通过宏定义来实现的结构体变量 U_BOOT_CMD。还有别忘了相应的头文件。

  6. uboot 的 清除编译过程文件是 make distclean,配置命令 make EmbedSky_config,编译是 make。

  7. uboot 读出内核,通过 nand read.jffs2 0x30007FC0 kernel 来从 nand 中的 kernel 分区里面读出内核。nand 中的 kernel 分区是在 include/configs/EmbedSky.h 中定义的,通过宏定义 MTDPARTS_DEFAULT 来定义具体的各个分区。也可以通过 uboot 的命令行模式中输入 mtd 命令来查看当前 uboot 的 分区信息。 分区的名字只是个标识不重要,主要的是分区的开始偏移地址和分区大小。

  8. 命令 nand read.jffs2 不需要页对齐,可以长度是任意的,其他的 read 命令需要对齐。

  9. uboot 的内核镜像是 uImage,由头部和真正的内核组成,头部中的 ih_load 是加载地址,ih_ep 是入口地址,uboot 通过读取头部数据,把内核放到加载地址,然后跳转到入口地址执行。

  10. 编译时链接地址 0x30007FC0,这个地址加上 64 字节的 uImage 头部内容,结果就是 0x30008000,这个就是真正的内核加载地址。这样做的好处是,因为地址能够匹配上,那么 cmd_bootm.c 中 ntohl(hdr->ih_load) == addr 成立,就不会移动内核,否则通过 memmove 函数在调用把内核移动到加载地址处,这样能够加快启动速度。

  11. do_bootm_linux 来启动内核。

    扫描二维码关注公众号,回复: 7422646 查看本文章
  12. uboot 通过设置启动参数的方法告诉内核一些必要的参数,然后跳转到入口地址,真正的开始启动内核。

  13. ih_ep 中包含函数指针,把这个函数指针交给 theKernel,然后调用 theKernel 来启动内核。

  14. uboot 在 0x30001000 按照一定的格式存放内核参数,然后由内核来读取这些参数。 在 cmd_bootm.c 中使用 setup_start_tag(bd),setup_memory_tags(bd), setup_end_tag(bd) 这种格式来存放 tag 参数。

猜你喜欢

转载自www.cnblogs.com/ramlife/p/11621317.html