日期 | 内核版本 | CPU架构 | 作者 |
2019.04.06 | Linux-4.4 | PowerPC | LoneHugo |
系列文章:https://blog.csdn.net/Vince_/article/details/89055979
1. 基本概念
在介绍系统启动阶段的内容之前先来了解一些基本的知识,方便我们理解相应的准备和操作的原理是什么。
主要有五点:
- elf format
- load address:内核镜像加载地址
- entry point:内核启动执行的入口地址
- bootm address:bootm指令从改地址启动,需要判断address与load address的异同,不同的话需要进行move操作,将镜像拷贝到对应的地址之后才能跳转运行
- kernel运行地址
参考:https://blog.csdn.net/qq_21792169/article/details/50098749
2. 启动准备
2.1 压缩和解压
在编译生成内核镜像的时候会进行压缩,并提取关键信息添加内核头部。所以系统启动跳转到内核执行之前需要由u-boot(bootloader)将内核Image解压后放置到对应的内存位置,然后跳转到内核入口处执行。当然也有可能是内核进行自解压之后再跳转执行,跟体系结构有关,比如arm架构下是自解压的方式,具体压缩和解压算法可以在编译内核的时候进行配置。
相对比较简单处理方式是PowerPC,采用gzip压缩,直接由u-boot进行解压,并去掉头部信息,放置到内存特定位置之后进行跳转到内核开始执行。
2.2 内存相关
根据内核镜像头部信息可以获取到entry point和load address信息,接下来跳转到entry point进行执行,其中load address为镜像在内存中的起始地址。如果bootm指定的address与load address不同,则需要进行move操作,将去掉头部之后的Image从其指定的地方转移到load address,然后跳转到内核运行。
2.3 MMU和TLB
在普遍情况下,启动阶段内核运行在实模式,也就是直接访问物理地址