1 / 23
文档名称:

linux内核启动Android系统启动过程详解.docx

格式:docx   大小:34KB   页数:23页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

linux内核启动Android系统启动过程详解.docx

上传人:guoxiachuanyue001 2020/12/5 文件大小:34 KB

下载得到文件列表

linux内核启动Android系统启动过程详解.docx

相关文档

文档介绍

文档介绍:linux 内核启动 +Android 系统启动过程详解
第一部分:汇编部分
Linux 启动之 linux-rk3288-tchip/kernel/arch/arm/boot/compressed/ 分析这段代码是 linux boot 后执行的第一个程序, 完 成的主要工作是解压内核,然后跳转到相关执行地址。这部 分代码在做驱动开发时不需要改动,但分析其执行流程对是 理解 android 的第一步
开头有一段宏定义这是 gnu arm 汇编的宏定义。关于 GUN 的汇编和其他编译器,在指令语法上有很大差别,具体可查 询相关 GUN 汇编语法了解 另外此段代码必须不能包括重定位部分。因为这时一开始必 须要立即运行的。所谓重定位,比如当编译时某个文件用到 外部符号是用动态链接库的方式,那么该文件生成的目标文 件将包含重定位信息,在加载时需要重定位该符号,否则执 行时将因找不到地址而出错
#ifdef DEBUG// 开始是调试用,主要是一些打印输出函数, 不用关心
#if defined(CONFIG_DEBUG_ICEDCC)
具体代码略
#endif 宏定义结束之后定义了一个段, .section ".start", #alloc, #execinstr
这个段的段名是 .start , #alloc 表示 Section contains allocated data, #execinstr 表示 Section contains executable instructions. 生成最终映像时,这段代码会放在最开头
.align
start:
.type start,#function /*.type 指定
start 这个符号是函数类型 */
.rept 8
mov r0, r0 // 将此命令重复 8 次,相当于 nop , 这里是为中断向量保存空间
.endr
b 1f
.word 0x016f2818 @
Magic numbers to help the loader
start
.word
absolute load/run zImage //此处保存了内核加载和运行的地址,实质上也是本函数的 运行地址
address
.word _edata
@ 内核结束地址
//注意这些地址在顶层 (具体在 /kernel 文件夹里) 里进行了定义,是链接的地址,加载内核后可能会进行重定 位
1: mov r7, r1 @ 保存 architecture ID ,这里是从 bootload 传递进来的
mov r8, r2 @ 保存
参数列表 atags 指针
r1 和 r2 中分别存放着由 bootloader 传递过来的 architecture ID 和指向标记列表的指针。这里将这两个参数先保存。
#ifndef __ARM_ARCH_2__
/*
* Booting from Angel - need to enter SVC
mode and disable
FIQs/IRQs (numeric definitions from
angel source).
* We only do this if we were in user mode
on entry.
*/
读取 cpsr 并判断是否处理器处于 supervisor 模式——从 bootload 进入 kernel ,系统已经处于 SVC32 模式;而利用 angel 进入则处于 user 模式,还需要额外两条指令。之后是 再次确认中断关闭,并完成 cpsr 写入
Angel 是 ARM 的调试协议 ,一般用的是 MULTI-ICE 。 ANGLE 需要在板子上有驻留程序 ,然后通过串口就可以调试 了。用过的 AXD 或 trace 调试环境的话, 对此应该比较熟悉。 not_angel: // 若不是通过 angel 调试进入内核
mrs r2, cpsr @ turn off interrupts to
orr r2, r2, #0xc0 @ prevent
angel from running
msr cpsr_c, r2 //这里将 cpsr 中 I、 F 位
分别置“ T,关IRQ和FIQ
#else
teqp pc, #0x0c000003
@ turn
off interrupts
常用 TEQP PC,#( 新模式编号 )来改变模式
#endif
另外链接器会把一些处理器相关的代码链接到这个位置, 也就是 arch/arm/boot/compressed/hea