由上面的编译过程可知,内核一般是压缩后保存,并由引导程序加载到内存,然后CPU跳到相应的位置运行的,因为压缩后的代码是不能直接运行,所以必须存在一个解码的过程,而这个解码过程是怎么样执行呢?又是怎么样实现的呢?下面带着这两个问题来学习解压的过程。
从上面分析编译过程,就可以知道需要从目录/Android-2.0/kernel/arch/arm/boot入手,在这个目录里主有piggy.S、head.S、misc.c、vmlinux.lds文件,在连接时是把head.S连接到内核的最开始位置,以便最先运行,这是由vmlinux.lds里决定。因此,就是从head.S来开始分析。
/*
* linux/arch/arm/boot/compressed/head.S
*
* Copyright (C) 1996-2002Russell King
* Copyright (C) 2004 Hyok S.Choi (MPU support)
*
* This program is free software;you can redistribute it and/or modify
* it under the terms of the GNUGeneral Public License version 2 as
* published by the Free SoftwareFoundation.
*/
#include
在head.S的第一段代码,主要描述了本文件名称和位置,以及作者、版权、编写和修改时间。接着包括linux/linkage.h头文件。在内核文件里,都遵守这样的编码规范,添加上开发人员,方便大家跟开发人员交流,并提出建议。添加上修改时间,方便验证文件是否最新的,并且做了那些修改,作为备忘录的作用。
包含linkage.h文件,主要是声明一些宏定义,比如ALIGN、ENTRY(name)、WEAK(name)、KPROBE_ENTRY(name)、KPROBE_END(name)、END(name)、ENDPROC(name)等宏。使用这些宏,可以在多个汇编文件里使用,方便代码维护,比如只需要修改头里的宏定义,就可以把所有使用到这些宏定义的文件进行修改了。