本文主要分析u-boot中与PowerPC 440体系结构紧密相关的汇编语言代码,不涉及u-boot整体启动流程。
我用的芯片是ppc 460-s,由于它和ppc 440的差别较小,我们不妨把两者混为一谈。在u-boot代码中也是以ppc4xx呈现的,即ppc 440, 460或405等系列,都使用同一套引导代码。
1. 准备工作
uboot版本:u-boot-2016.03
Linux版本:debian 10
1.1 安装powerpc gcc交叉编译工具
参考以前写的文章[powerpc linux 交叉编译环境配置],网址:
https://blog.csdn.net/eugenelyq/article/details/119734517
1.2 编译
make gdppc440etx_defconfig
make
这里以gdppc440etx配置为蓝本,分析主要涉及第一阶段启动代码的汇编语言部分。
1.3 涉及的文件
arch\powerpc\cpu\ppc4xx\resetvec.S (reset instruction)
arch\powerpc\cpu\ppc4xx\start.S (boot code)
arch\powerpc\cpu\ppc4xx\u-boot.lds (linker script)
board\gdsys\gdppc440etx\init.S (tlbtab)
include\configs\gdppc440etx.h (config)
1.4 涉及的知识点
ppc 440 体系结构及指令
gnu汇编语法
gnu链接脚本
2. powerpc 440 体系结构之启动流程
想看懂代码,必须要了解不同体系结构的引导流程。
[PowerPC 460-S Embedded Processor Core User’s Manual] ppc460-s用户手册的第三章专门用了一章讲解该cpu core的初始化(引导)流程,其中比较重要的是下面一段话:
这里要说的意思是:
复位后,(硬件)设置内存管理资源以便处理器能够取指,执行,从地址空间的最高4k有效地址处读取数据。具体如何设置,每个处理器的实现不同。不管硬件如何实现访问4K内存空间,处理器都将从0xffff_fffc处开始执行指令,这里是有效地址的最后一个字(最后4个字节)。该地址处的指令必须是一个无条件分支指令,必须跳转到4K地址空间内。在这4K地址空间内,作必要的初始化工作。
熟悉arm体系结构者应该清楚,arm核的mmu默认是关闭的,在此情况下,理论上32位地址空间可以随便访问。但powerpc 440系列不同,它们的mmu是常开的,即如果不经过mmu映射,地址空间中的任何地址都无法访问,不能读写。
那么,最后4K的地址空间又是怎么实现取指和执行的呢?
是的,是硬件通过shadow TLB实现的,硬件把rom开始的4K映射到32位地址空间的最后4K。这也解释了”必须跳转到