一切的开端

在经过解压缩、增强,并收到了设备树块(DTB)之后,程序计数器(pc)被置于符号stext()的物理地址(即文本段的开始)处,从而调用ARM32内核。

SofTool.CN Notes:
DTB = Device Tree Block

这段代码可以参考Linux内核源码:arch/arm/kernel/head.S

__HEAD 会将这里的代码放到一个名为 .head.text 的链接器节中。查看ARM架构的链接器文件(arch/arm/kernel/vmlinux.lds.S)就会发现,这一操作表明了该节中的目标代码为首先被执行的代码。

此处的物理地址被平均分割为16MB加上额外的32KB的 TEXT_OFFSET(其原因稍后会详细解释),所以stext()的地址大致为0x10008000(即本例中使用的地址)。

arch/arm/kernel/head.S 包含一小段密集的异常处理,用于各种旧的ARM平台,因此很难读懂。ATAGs和设备树引导的标准问世大致与 head.S 的建立处于同一时间,所以多年来这段代码变得越来越复杂。

为了理解下面的内容,你需要对页式虚拟内存有基本的了解。如果觉得维基百科上的介绍太粗略,可以参考Hennesy & Patterson的《计算机体系结构:量化研究方法》一书。本文还假设你懂得一些基本的ARM汇编语言,以及Linux内核的基础知识。