嵌入式Linux驱动学习之路(六)u-boot启动内核

  内核启动是需要必要的启动参数。不能开机自动完全从0开始启动,需要uboot帮助内核实现重定位并提供参数。

   首先,uboo会从Kernel分区中读取bootcmd环境变量,根据环境变量可自动启动。

分区:

  每个硬盘上都有一个分区表。由于Flash中没有分区表,所以Flash的分区只能在源代码中定义,故无法更改。

mtdparts=nandflash0:256k@0(bootloader),128k(params),2m(kernel),-(root)

  注:@0 表示从0开始。  

  在启动之前,先从NandFlash中读出内核,放到内存中。而uImage = 头部+真正的内核。

  头(64字节):

    ih_load:加载地址,即内核运行是应该位于的地方。

    ih_ep: 入口地址,即内核的入口地址。

  这和uboot很相似。uboot的加载地址是TEXT_BASE,入口地址是start.S中的_start。

  bootm完成的工作:

    1.读取头部

    2. 根据头部信息移动内核

    2. 启动内核。

  在启动的时候,uboot需要告诉内核一些启动参数。即设置参数。

  跳转到内核的第一条代码。

  启动内核时,用头部的入口地址作为函数指针(thekernel),来启动。

  setup_start_tag()

  setup_memory_tag()

  setup_commandline_tag()

  setup_end_tag()

  

sd

原文地址:https://www.cnblogs.com/ynxf/p/5979027.html