LK的大体过程

LK过程中的程序控制和关键过程
spmi_init从XBL已经在指定位置存放好的值初始化SPMI
target_sdc_init初始化SD卡的控制器
partition_read_table读取磁盘的分区表,包括MBR或GPT,填充到全局变量partition_entries中
target_crypto_init_params处理签名内核
VERIFIED_BOOT宏非零的情况下,会通过qseecom、rpmb等操作执行安全操作,其中可以通过smc汇编指令进入TrustZone安全模式执行命令。rpmb也是通过qseecom_register_listener注册一个监听器。load_sec_app中会启动名为keymaster的qseecom app。
在aboot中的update_cmdline、boot_linux等函数处理了cmdline的传递。


LK的大体过程
由于不同处理器芯片厂商对 arm core的封装差异比较大,所以不同的arm处理器,对于上电引导都是由特定处理器芯片厂商自己开发的程序,这个上电引导程序通常比较简单,会初始化硬件,提供下载模式等,然后才会加载通常的bootloader。
这个过程典型是通过bootROM来实现的,也就是基于ROM中指定位置存储的指令完成的(bootROM可参见后面对它的描述)。
加载BootLoader的过程中,会按照CPU执行环境的要求来完成环境初始化(也就是各section的存储位置与汇编语言使用的语法一一对应,有重定位段、数据段等),并转到指定位置执行指令,进入BootLoader的代码中。
而汇编语言会用到的一些变量和表示方法,也就指明了有多少种内存定位方法。其中整体内存区域划分的一些变量,如RAM_HIGH_ADRS,估计是内存配置脚本之类的传入到ld的。
在该阶段能够完成ROM到RAM的拷贝,其实也来源于ROM可以直接被CPU读取这个基础,如果NAND Flash的话,还需要驱动支持才可以,只能通过函数调用来完成。
汇编语言中应该有一个语法指定入口指令地址,比如ENTRY,该语法的实际基础也会取决于程序约定,比如bootROM到BootLoader时跳转到哪个地址执行,R0等寄存器分别存在什么数据,从BootLoader跳转到Kernel时也是相同的道理。
所以,我们可以记住UBoot的第一条命令是cpu/arm920t/start.S,而Kernel的第一条命令是arch/arm/kernel/head.S,而进入C代码的接口则是start_kernel()。


BootLoader的类型
先区分一下Bootloader和Monitor,严格来说,Bootloader只是引导OS运行起来的代码;而Monitor另外还提供了很多的命令行接口,可以进行调试、读写内存、烧写Flash、配置环境变量等。在开发过程中Monitor提供了很好地调试功能,不过在开发结束之后,可以完全将其设置成一个Bootloader。所以习惯上将其叫做Bootloader。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值