手机开发之二:Boot代码深入分析

本文详细分析Boot代码的各个关键组件,包括mmu_enable_instruction_cache、boot_hw_ctrl_init、boot_hw_tlmm_init等,阐述它们在系统初始化过程中的作用及OEM商的定制需求。此外,文章还介绍了Boot的模块化设计、内存初始化流程以及堆初始化过程,旨在为开发者提供深入理解Boot代码的全面视角。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二、Boot代码深入分析
    Boot代码大部分是用汇编语言写的,也有小部分,可能需要由OEM商修改,所以用C语言来写。另外,Boot代码属于Driver范围,所以大家可以在 drivers/boot目录里面找到相应的代码。Boot的代码组织得非常模块化,整个boot的入口点是在 Boot_function_table.s里面,这个汇编代码里面实际上是将Boot需要完成的任务封装成了不同的函数,由不同的函数来完成相应的工作,接下来,我将深入分析这些函数所完成的工作,如下所述。

    a)mmu_enable_instruction_cache;
   
这个只有在Nand启动模式时才需要,打开ARM的指令Cache.
    b)boot_hw_ctrl_init
   
此函数主要是完成两条总线(EBI1EBI2)控制器的初始化,这个函数执行完了之后,系统就可以知道两条总线上连接了哪些设备,同时也可以找得到这些设备,不过,至于单个设备自身的初始化,则不在这里。

    []
   
这个函数很重要,OEM商如果需要加新的设备到系统中(挂在两条总线上),则需要定做此模块,目前阶段主要是内存。另外,如前文所述,这个函数是由C语言来写的,主要目的就是为了方便OEM商定做。内存设备的修改,可以在这个模块里找到相应的数据结构,相对还是比较简单的。
    c)boot_hw_tlmm_init
    1.
晶振时钟的初始化;
    2.中断表的初始化;
    3.GPIO的初始化;
    4.Msm本身的驱动,除了EBI2;
    d)boot_rom_test
   
这个函数非常简单,只是做一个很简单的Rom检查.(比对两个标志位来检查,并没有一块一块地去检查)。
    e)boot_ram_test
    Ram
自检,具体算法其实也很简单,就是读、写内存以判断是否成功。
    f)boot_ram_init
    1.
拷贝手机代码从Nand FlashSDRAM
    a.Image__BB_RAM__Base:Core Code;
    b.Image__APP_RAM__Base:App Code;

    [
]
   
上述动作是分块进行的,原因是因为Qualcomm支持分块Boot Load.
    2.
Image__ZI_REGION__ZI区域初始化为0;
    3.
初始化OEM要求的动态Heap;
    4.
至于代码段里的数据初始化,直接在Image里就完成了(编译器完成);
    g)boot_stack_initialize
    ARM
栈初始化,主要是为分块代码加载而预留的.
    h)boot_cache_mmu_init
    ARM Mmu
初始化
    注意:到此为止,整个Boot的工作就告完结了,那么,它又是如何跳到AMSSmain入口点呢?原因很简单,ARM编译器在链接的时候会自动做出一个 __rt_entry(),由此函数来完成ARM库函数的初始化,并最后将代码执行点跳转到main()。而__rt_entry()会在 boot_reset_handler.s里调用,具体细节,大家可以不用太过关心,只需要明白,Boot跑完之后,手机软件就跑到了main里就Ok了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值