uboot源代码第一阶段分析(感性认识)


    源代码位置 cpu/arm920t/start.S  这个文件我们一般称之为 uboot的第一阶段代码,是 ARM GNU 汇编写成的,我们如何理解代码构思思路

  1. 以现实社会中的火车作为实例来类比运行的系统,这样方便理解记忆。

  2. cpu(火车头)以管理模式(SVC32 模式)

    整个单板就像一列飞速疾驰的火车,一旦上电以后,他将飞快的速度运行,就是没有代码,他也照样以一定的频率(速度)跑。火车运行一般分为几种模式,无人驾驶,有人驾驶。因为此时没有代码的指引,所以我们的cpu(火车头)必须有人来操作他的运行(当然是为了车上的乘客的安全着想了),这种模式我们称之为(管理模式 SVC32 模式,全权管理火车的所有部件,具有至高无常的权利,可以操作所有的硬件设备)

  3. 关闭看门狗 关闭所有中断

    车运行以后,我们需要关闭所有的报警装置,和一些外面的干扰,因为此时车上没有指令,除了驾驶人员,其他什么人都没有,没人其他的人来处理外界的,所以索性屏蔽所有的干扰。

  4. 初始化时钟(车运行的速度)

    此时火车的运行在一个相对安静的状态,不过,此时的速度是太慢了,所以还需全面提升车的速度,这就需要驾驶人员来配置各个车厢速度的比例,来重新配置整个火车的运行速度。

    相信我们的车此时以高速疾驰在铁轨之上,我们引导linux kernel 的终极任务还将继续把。也就是还要完成更生层次的任务啦,天将降大任于斯人也,所以我们还得把车头配置一下,来适应更加复杂的任务。这就是cpu的深度初始化

  5. CPU深度初始化

    深度初始化,那得想想cpu里面到底有什么,这样才知道深度初始化啥啊!cpu里面有 mmu(内存管理单元)、cashe ,以及一些必要的寄存器组(RS);我们此时应该清楚ashe ,关闭MMU,寄存器组在设置svc32模式、中断以及时钟的时候已经配置过了。

  6. 初始化内存

    cpu此时才是真正的整装待发,万事俱备,只是少一些连续的0101010011100这些的二进制数来配置里面的上百门的开关,驱动外部电路。也就是说此时 程序是关键的部分咯。那么,程序是在我们的NAND或者是NOR里面的,程序的执行必须要在sdram里面呀,所以,需要程序,带让程序有处可放,内存的初始化是当务之急。

  7. 重定位代码

    代码有了好的运行环境(SDRAM),此时程序不得不被请君入座咯,代码的重定位说的就是将FLASH中的代码复制到 SDRAM中。

  8. 设置栈帧

    感慨今日长樱在手,试问合适傅住苍龙。英雄宝剑在手,无处施展。代码是有了,但是运行C代码还需要特殊的要求,就是设置 栈 ,栈的作用就是为函数的调用提供了短暂的存储空间,存储 返回地址,局部变量,以及中间数据,调用返回之后就会释放,至关重要。

  9. 清除bss段

    按道理说此时应该直接调用C函数进入uboot第二阶段的代码的。可是,ELF可执行文件有一个特殊的段,这个段保存着未初始化的全局变量和静态变量,这些变量的值是需要在运行的时候才确定的,所以我们必须要这个区域清零。

  10. 调用 _armboot_start 进入第二阶段代码

你可能感兴趣的:(Bootloader,移植)