内核中关于启动条件的英文说明整理
Posted 代二毛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内核中关于启动条件的英文说明整理相关的知识,希望对你有一定的参考价值。
内核中关于启动条件的说明
/*
* Kernel startup entry point.
* ---------------------------
*
* This is normally called from the decompressor code. The requirements
* are: MMU = off, D-cache = off, I-cache = dont care, r0 = 0,
* r1 = machine nr, r2 = atags pointer.
*
* This code is mostly position independent, so if you link the kernel at
* 0xc0008000, you call this at __pa(0xc0008000).
*
* See linux/arch/arm/tools/mach-types for the complete list of machine
* numbers for r1.
*
* We're trying to keep crap to a minimum; DO NOT add any machine specific
* crap here - that's what the boot loader (or in extreme, well justified
* circumstances, zImage) is for.
*/
上面的英文说明是摘抄自内核的head.S文件,是关于内核启动条件的说明。head.S文件是整个内核的入口,内核的启动顺序和uboot是一样的,先执行汇编语句再跳转到C语言。
启动条件整理
(1)这些代码通常被解压缩代码调用,要求关闭MMU、关闭D-cache、r0 = 0、r1 = 机器码、r2 =uboot传参的地址,I-cache的状态不关心。如果不清楚为什么被解压缩代码调用,参考博客:《vmlinuz/vmlinux、Image、zImage与uImage的区别》。
(2)uboot给内核传参是通过r0、r1、r2三个寄存器,其中:r0一般都是填零,r1是传机器码,r2是uboot给内核传参的tags的地址。
(3)内核前期的启动代码必须是位置无关码,如果你内核的链接地址是0xc0008000,那你必须将虚拟地址转换为物理地址,即__pa(0xc0008000)。__pa()是将虚拟地址转换为物理地址的宏。
(4)linux/arch/arm/tools/mach-types文件里是内核支持的机器码,也就是r1寄存器的值要在mach-types进行匹配,如果匹配成功则启动内核;如果匹配不上,则说明内核不支持该机器码,启动失败。
(5)尽量保持内核启动代码的简短,保持内核启动代码都是共用部分的代码,特定CPU部分的代码都放在bootloader(比如uboot)里。
以上是关于内核中关于启动条件的英文说明整理的主要内容,如果未能解决你的问题,请参考以下文章