内核启动第一步的物理内存分布

描述

  • • 1.uboot 调用do_bootm_linux 中的 theKernel (0, machid, bd->bi_boot_params)进入kernel部分代码

    该函数最终会通过r0,r1,r2这三个寄存器分别把0、machid、传递传参的首地址传给kernel。

  • • 2.Kernel 的入口 在head.S中ENTRY(stext)处, 此阶段是汇编阶段 ,此阶段会解析r0,r1,r2(也就是uboot的传参)最终会通过进入start_kernel,进入到c语言环境执行。

经过前面uboot的准备工作,通过theKernel (0, machid, bd->bi_boot_params);

开始进入到kernel部分开始执行。

其中 第二个参数为机器 ID,第三参数为 u-boot 传递给内核参数存放在内存中的首地址 ,此处是 0x30000100

由 zImage 的生成过程我们可以知道,第一阶段运行的内核映像实际就是arch/arm/boot/compressed/vmlinux,而这一阶段所涉及的文件也只有三个:

  • • (1)arch/arm/boot/compressed/vmlinux.lds
  • • (2)arch/arm/boot/compressed/head.S
  • • (3)arch/arm/boot/compressed/misc.c

Kernel

下面我们的分析集中在 arch/arm/boot/compressed/head.S, 适当参考 vmlinux.lds 。

从linux/arch/arm/boot/compressed/vmlinux.lds文件可以看出head.S的入口地址为ENTRY(_start),也就是head.S汇编文件的_start标号开始的第一条指令。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分