原创翻译,转载请注明出处。
arm64的异常模型由一组异常级别(EL0-EL3)组成。EL0,EL1有安全模式和非安全模式的区别。EL2是虚拟机管理级别并且只有非安全模式。EL3是最高优先级并且只存在安全模式中。
为了描述方便,下面将使用术语“boot loader”来简化所有执行在cpu将控制权转交给内核之前的软件的称呼。这里包含了安全监视器(secure monitor)和虚拟机管理器(hypervisor)的代码,或者可能是少量用来准备一个最小的启动环境的指令。
基本上,boot loader至少提供以下几个功能:
安装与初始化物理内存
安装设备树
解压内核镜像
启动内核镜像
1、安装与初始化物理内存
boot loader需要初始化物理内存,内核将使用这些内存来存储volatile类型的数据。这个是与机器有关的,可能使用了内部算法自动的定位并取得物理内存的大小,
或者可能是机器有关内存方面的特性,也可能是boot loader设计者知道的获取内存某种方法。(囧)
2、安装设备树
dtb(device tree blob)必须位于8-BYTE对齐的位置并且不能超过2MB的大小。因为dtb会被映射到最大2MB的缓存块上,它不能放在任何映射了特定属性的2M区域内。
注意,在内核4.2以前,要求将DTB放在内核镜像里以text_offset为起始位置的512M区域内。
3、解压内核镜像(这个是可选的)
arm64(aarch64)的内核当前并不提供自解压功能,因此需要解压在boot loader里完成(比如gzip格式)。如果boot loader不支持解压,可以使用不压缩的镜像来启动。
4、启动内核镜像</