内核中关于启动条件的英文说明整理

内核中关于启动条件的说明

/*
 * 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)里。

猜你喜欢

转载自blog.csdn.net/weixin_42031299/article/details/121738068
今日推荐