U-boot 2011.09 启动内核分析

U-Boot启动内核分析 

先来引用一下这篇介绍“ARM Linux内核启动要求的文章ARM Linux Kernel 

Boot Requirements,是ARM Linux内核的维护者Russell King写的。  

 CPU register settings 

 o r0 = 0. 

 o r1 = machine type number.  

 o r2 = physical address of tagged list in system RAM.  ? CPU mode  

 o All forms of interrupts must be disabled (IRQs and FIQs.) 

 o The CPU must be in SVC mode. (A special exception exists for 

Angel.)  ?

 Caches, MMUs  

o The MMU must be off.  

o Instruction cache may be on or off.  

o Data cache must be off and must not contain any stale data.  ? Devices  

o DMA to/from devices should be quiesced.  ? The boot loader is expected to call the kernel image by jumping directly to the first instruction of the kernel image. 

U-boot针对arm体系结构的CPUdo_bootm_linux()函数的实现就是在arch/arm/lib/bootm.c这个文件当中。

可以看到从arch/arm/lib/bootm.c中的第96 行开始就是do_bootm_linux()函数的实

现。 

  

其中第101行声明了这样一个函数指针theKernel: 

void (*theKernel)(int zero, int arch, uint params); 

看看它的名字和参数的命名我们 也可以猜到这个其实就是内核的入口函数的指

针了。几个参数的命名也说明了上文提到的ARM Linux内核启动要求的第一条,

因为根据ACPSARM/Thumb Procedure Call Standard)的规定,这三个参数就是依次使用r0r1r2来传递的。 

  

接下来第123行就是给这个函数指针赋值: 

theKernel = (void (*)(int, int, uint))images->ep; 

可以看到theKernel被 赋值为images->ep,,即内核的入口点(Entry Point)。   

  

最后是对内核入口函数的调用,发生在第155行: 

theKernel (0, machid, bd->bi_boot_params); 

这里machid = bd->bi_arch_number

调用的时候对参数进行赋值,r0=0r1=bd->bi_arch_number

r2=bd->bi_boot_params,一个都不少。至此U-Boot的使命完成,开始进入ARM 

Linux的美丽新世界。  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值