android str流程,Android arm linux kernel启动流程一

虽然这里的Arm Linux kernel前面加上了Android,但实际上还是和普遍Arm linux kernel启动的过程一样的,这里只是结合一下Android的Makefile,讲一下bootimage生成的一个过程。这篇文档主要描述bootimage的构造,以及kernel真正执行前的解压过程。

在了解这些之前我们首先需要了解几个名词,这些名词定义在/Documentation/arm/Porting里面,这里首先提到其中的几个,其余几个会在后面kernel的执行过程中讲述:

1)ZTEXTADDR  boot.img运行时候zImage的起始地址,即kernel解压代码的地址。这里没有虚拟地址的概念,因为没有开启MMU,所以这个地址是物理内存的地址。解压代码不一定需要载入RAM才能运行,在FLASH或者其他可寻址的媒体上都可以运行。

2)ZBSSADDR  解压代码的BSS段的地址,这里也是物理地址。

3)ZRELADDR  这个是kernel解压以后存放的内存物理地址,解压代码执行完成以后会跳到这个地址执行kernel的启动,这个地址和后面kernel运行时候的虚拟地址满足:__virt_to_phys(TEXTADDR) = ZRELADDR。

4)INITRD_PHYS  Initial Ram Disk存放在内存中的物理地址,这里就是我们的ramdisk.img。

5)INITRD_VIRT  Initial Ram Disk运行时候虚拟地址。

6)PARAMS_PHYS 内核启动的初始化参数在内存上的物理地址。

下面我们首先来看看boot.img的构造,了解其中的内容对我们了解kernel的启动过程是很有帮助的。首先来看看Makefile是如何产生我们的boot.img的:

out/host/linux-x86/bin/mkbootimg-msm7627_ffa  --kernel out/target/product/msm7627_ffa/kernel --ramdisk out/target/product/msm7627_ffa/ramdisk.img --cmdline "mem=203M console=ttyMSM2,115200n8 androidboot.hardware=qcom" --output out/target/product/msm7627_ffa/boot.img

根据上面的命令我们可以首先看看mkbootimg-msm7627ffa这个工具的源文件:system/core/mkbootimg.c。看完之后我们就能很清晰地看到boot.img的内部构造,它是由boot header /kernel  /ramdisk /second stage构成的,其中前3项是必须的,最后一项是可选的。

view plaincopy to clipboardprint?

/*

+-----------------+

| boot header     | 1 page

+-----------------+

| kernel          | n pages

+-----------------+

| ramdisk         | m pages

+-----------------+

| second stage    | o pages

+-----------------+

n = (kernel_size + page_size - 1) / page_size

m = (ramdisk_size + page_size - 1) / page_size

o = (second_size + page_size - 1) / page_size

0. all entities are page_size aligned in flash

1. kernel and ramdisk are required (size != 0)

2. second is optional (second_size == 0 -> no second)

3. load each element (kernel, ramdisk, second) at

the specified physical address (kernel_addr, etc)

4. prepare tags at tag_addr.  kernel_args[] is

appended to the kernel commandline in the tags.

5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr

6. if second_size != 0: jump to second_addr

else: jump to kernel_addr

*/

/*

+-----------------+

| boot header     | 1 page

+-----------------+

| kernel          | n pages

+-----------------+

| ramdisk         | m pages

+-----------------+

| second stage    | o pages

+-----------------+

n = (kernel_size + page_size - 1) / page_size

m = (ramdisk_size + page_size - 1) / page_size

o = (second_size + page_size - 1) / page_size

0. all entities are page_size aligned in flash

1. kernel and ramdisk are required (size != 0)

2. second is optional (second_size == 0 -> no second)

3. load each element (kernel, ramdisk, second) at

the specified physical address (kernel_addr, etc)

4. prepare tags at tag_addr.  kernel_args[] is

appended to the kernel commandline in the tags.

5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr

6. if second_size != 0: jump to second_addr

else: jump to kernel_addr

*/

关于boot header这个数据结构我们需要重点注意,在这里我们关注其中几个比较重要的值,这些值定义在boot/boardconfig.h里面,不同的芯片对应vendor下不同的boardconfig,在这里我们的值分别是(分别是kernel/ramdis/tags载入ram的物理地址):

view plaincopy to clipboardprint?

#define PHYSICAL_DRAM_BASE   0x00200000

#define KERNEL_ADDR          (PHYSICAL_DRAM_BASE + 0x00008000)

#define RAMDISK_ADDR         (PHYSICAL_DRAM_BASE + 0x01000000)

#define TAGS_ADDR            (PHYSICAL_DRAM_BASE + 0x00000100)

#define NEWTAGS_ADDR         (PHYSICAL_DRAM_BASE + 0x00004000)

#define PHYSICAL_DRAM_BAS

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值