2.16.2.head.S文件分析1

Posted ocean-star

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.16.2.head.S文件分析1相关的知识,希望对你有一定的参考价值。

本节开始分析head.S文件,主要分析了内核运行的虚拟地址与物理地址,内核真正入口以及启动条件等。

2.16.2.1、内核运行的物理地址与虚拟地址

(1)KERNEL_RAM_VADDR(VADDR就是virtual address),这个宏定义了内核运行时的虚拟地址。值为0xC0008000
(2)KERNEL_RAM_PADDR(PADDR就是physical address),这个宏定义内核运行时的物理地址。值为0x30008000
(3)总结:内核运行的物理地址是0x30008000,对应的虚拟地址是0xC0008000。

2.16.2.2、内核的真正入口

(1)内核的真正入口就是ENTRY(stext)处
(2)前面的__HEAD定义了后面的代码属于段名为.head.text的段

2.16.2.3、内核运行的硬件条件

(1)内核的起始部分代码是被解压代码调用的。回忆之前讲zImage的时候,uboot启动内核后实际调用运行的是zImage前面的那段未经压缩的解压代码,解压代码运行时先将zImage后段的内核解压开,然后再去调用运行真正的内核入口。
(2)内核启动不是无条件的,而是有一定的先决条件,这个条件由启动内核的bootloader(我们这里就是uboot)来构建保证。
(3)ARM体系中,函数调用时实际是通过寄存器传参的(函数调用时传参有两种设计:一种是寄存器传参,另一种是栈内存传参)。所以uboot中最后theKernel (0, machid, bd->bi_boot_params);执行内核时,运行时实际把0放入r0中,machid放入到了r1中,bd->bi_boot_params放入到了r2中。ARM的这种处理技巧刚好满足了kernel启动的条件和要求。
(4)kernel启动时MMU是关闭的,因此硬件上需要的是物理地址。但是内核是一个整体(zImage)只能被连接到一个地址(不能分散加载),这个连接地址肯定是虚拟地址。因此内核运行时前段head.S中尚未开启MMU之前的这段代码就很难受。所以这段代码必须是位置无关码,而且其中涉及到操作硬件寄存器等时必须使用物理地址。

2.16.2.4、内核启动要求的传参方式







以上是关于2.16.2.head.S文件分析1的主要内容,如果未能解决你的问题,请参考以下文章

内核启动12

dump 怎么分析死锁

[恶意代码分析]恶意代码种类以及分析环境介绍

1-漏洞分析——tomcat任意文件写入漏洞分析

1-漏洞分析——tomcat任意文件写入漏洞分析

Linux系统应急响应