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。
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。