android系统重新刷ROM简记(二)

在Android顶层源码目录使用make编译完成后,会生成这样一个目录:

out/target/product/xxx,该目录内部有我们需要的boot.img,system.img等文件,boot.img使用kernel和out/target/product/xxx/root(广义的ramdisk)目录打包而成,也就是说boot.img是由kernel和ramdisk.img生成得到。

在android的编译框架中,把许多固定的、反复用到的目录路径定义为宏变量,而上述生成的目录

out/target/product/xxx的宏为PRODUCT_OUT

out/target/product/xxx/system的宏即为:TARGET_OUT

而out/target/product/xxx/root的宏即为:TARGET_ROOT_OUT,

out/target/product/xxx/root主要是由system/core/rootdir目录拷贝得到的,

而对于编译过程中bootloader,kernel以及system的规定都是放在build/core/Makefile文件中。启动规定了编译生成的规则。

1

2

3

4

5

6

7

#build/core/Makefile

INTERNAL_BOOTIMAGE_ARGS := \

--kernel $(INSTALLED_KERNEL_TARGET) \

--ramdisk $(INSTALLED_RAMDISK_TARGET)

显然,boot.img中包含了Image和ramdisk.img文件,但boot.img中的内容远不只这么多,本文将介绍

boot.img中的其它参数,boot.img的生成以及最终boot.img的组成格式.

INTERNAL_BOOTIMAGE_ARGS还包含以下内容:

1.附加的内核命令行(cmdline): BOARD_KERNEL_CMDLINE

同样在build/core/Makefile中,有以下一段内容(strip起到去除空格的作用):

?

1

2

3

4

5

6

7

BOARD_KERNEL_CMDLINE := $(strip $(BOARD_KERNEL_CMDLINE)

ifdef BOARD_KERNEL_CMDLINE

INTERNAL_BOOTIMAGE_ARGS += --cmdline "$(BOARD_KERNEL_CMDLINE)"

#endif

而BOARD_KERNEL_CMDLINE则在文件device/telechips/tcc88xx-common/BoardConfigCommon.mk中定义:

?

1

BOARD_KERNEL_CMDLINE := console=ttyTCC, 115200n8

2.内核加载的基地址,BOARD_KERNEL_BASE

同样在build/core/Makefile中,有以下一段内容:

?

1

2

3

4

5

6

7

BOARD_KERNEL_BASE := $(strip $(BOARD_KERNEL_BASE))

ifdef BOARD_KERNEL_BASE

INTERNAL_BOOTIMAGE_ARGS += --base $(BOARD_KERNEL_BASE)

endif

而BOARD_KERNEL_BASE也在device/telechips/tcc88xx-common/BoardConfigCommon.mk中定义。

?

1

BOARD_KERNEL_BASE := 0x40000000

3.映像的页面大小:BOARD_KERNEL_PAGESIZE

同样在build/core/Makefile中,有以下一段内容:

?

1

2

3

4

5

6

7

BOARD_KERNEL_PAGESIZE:= $(strip $(BOARD_KERNEL_PAGESIZE))

ifdef BOARD_KERNEL_PAGESIZE

INTERNAL_BOOTIMAGE_ARGS += --pagesize $(BOARD_KERNEL_PAGESIZE)

endif

而BOARD_KERNEL_PAGESIZE 却在device/telechips/tcc8800/BoardConfig.mk中定义:

?

1

BOARD_KERNEL_PAGESIZE := 8192

剩下的内容就是生成boot.img的关键语句,在 build/core/Makefile中,内容如下:

?

1

2

3

4

5

INSTALLED_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/boot.img

$(INTALLED_BOOTIMAGE_TARGET) : $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILE

$(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS)  --output [email protected]

到此,我们可以知道 INTERNAL_BOOTIMAGE_ARGS的内容是:

?

1

2

3

4

--kernel     out/target/product/tcc8800/kernel

--ramdisk   out/target/product/tcc8800/ramdisk.img

--cmdline   console=ttyTCC,115200n8

--base 0x40000000  --pagesize 8192

而预知boot.img的格式,必须查看MKBOOTIMG这个程序,其实就是out/host/linux-x86/bin/mkbootimg中的mkbootimg程序。

mkbootimg程序由system/core/mkbootimg工程生成得到,为此我们来看看其中的mkbootimg.c文件,其中有这样一段:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

//信息头部分

if(write(fd,&hdr,sizeof(hdr))
!= sizeof(hdr)) goto fail;

if(write_padding(fd,pagesize,sizeof(hdr))) goto fail;

//内核部分

if(write(fd,&kernel_data, hdr.kernel_size)!= hdr.kernel_size)

goto fail;

if(write_padding(fd,pagesize,hdr.kernel_size)) goto fail;

//文件系统部分

if(write(fd,&ramdisk_data,hdr.ramdisk_size)!= hdr.ramdisk_size)

goto fail;

if(wirte_padding(fd,pagesize,hdr.ramdisk_size)) goto fail;

可见boot.img是由文件头信息,内核数据以及文件系统数据组成,它们之间非页面对齐部分用0填充(可以

查看write_padding的代码),文件头信息的具体结构可以在system/core/mkbootimg/bootimg.h中看到:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

struct boot_img_hdr

{

unsigned char magic[BOOT_MAGIC_SIZE];

unsigned  kernel_size;

unsigned  kernel_addr;

unsigned  ramdisk_size;

unsigned  ramdisk_addr;

unsigned  second_size;

unsigned  second_addr;

unsigned  tags_addr;

unsigned  page_size;

unsigned  unused[2];

unsigned  char  name[BOOT_NAME_SIZE]

unsigned  char cmdline[BOOT_ARGS_SIZE]

unsigned  id[8]; //存放时间戳,校验和,SHA加密等内容

}

其它成员也很明了,由此可知boot.img的大致组成结构了。

时间: 2024-11-05 20:48:10

android系统重新刷ROM简记(二)的相关文章

android系统重新刷ROM简记

当需要对android系统进行大刀阔斧的改造的时候,应该清晰的了解android各个image的组成才能做到庖丁解牛. 首先在android烧写过程中需要烧写的文件主要包括uboot.bin\boot.img\system.img\userdata.img\recovery.img等文件. 小米的刷机文件主要包括data\META-INF\recovery\system\blob\boot.img\file_contexts文件. Data文件夹下只有一个文件夹miui从名字可以知道里面存放的文

android系统又一次刷ROM简记(一)

当须要对android系统进行大刀阔斧的改造的时候,应该清晰的了解android各个image的组成才干做到庖丁解牛. 首先在android烧写过程中须要烧写的文件主要包含uboot.bin\boot.img\system.img\userdata.img\recovery.img等文件. 小米的刷机文件主要包含data\META-INF\recovery\system\blob\boot.img\file_contexts文件. Data目录下仅仅有一个目录miui从名字能够知道里面存放的文件

理解Android系统的进程间通信原理(二)----RPC机制

理解Android系统中的轻量级解决方案RPC的原理,需要先回顾一下JAVA中的RMI(Remote Method Invocation)这个易于使用的纯JAVA方案(用来实现分布式应用).有关RMI的相关知识,可以通过下图来归纳: Android中的RPC也是参考了JAVA中的RMI方案,这里我们再详细了解一下RPC的实现过程. Android中的RPC机制是为了实现一个进程使用另一个进程中的远程对象,它使用了Android自己的AIDL(接口定义语言),使用户很方便地定义出一个接口作为规范,

【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)

作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/51592930 手机的两种模式 : 在下面有详细的图片示例; -- Recovery 模式 : 音量键增加 + 电源键, 长按上述组合键, 看到 "MI" 的 LOGO 后即进入 Recovery 模式; -- Fastboot 模式 : 音量键减小 + 电源键, 长按上述组合键, 看到 "FASTBOOT" 后, 即 进入 FA

给Lumia 520/521/525/526/720刷Android系统

感谢XDA论坛上的开发者为Android for Lumia开发工具和ROM. 开篇的话就不多写了,这次我们直入主题. 注意事项: 一.Android for Lumia目前适用的机型有Lumia 520.Lumia 521.Lumia 525.Lumia 526和Lumia 720,其他的大多数WP机型理论上可以刷Android,不过Bootloader和ROM还没适配,什么时候可以适配,笔者也不知道. 二.笔者发现,在刷了Android系统的Lumia 520和Lumia 525上(其他机型

Android系统源码下载与编译、刷机--Nexus6实测

前言 此博文记录一下Android从系统源码下载到刷机的全过程. (https://source.android.com/source/build-numbers.html 页面中列表信息找到自己设备对应的Android版本进行选择,博文中选择MOB301) 硬件:Google 亲儿子 Nexus6("shamu") Android系统:选择了Android官网上的MOB301对应的android-6.0.1_r42 驱动:自然就是MOB301_Nexus6对应的驱动了 编译系统:Ub

分析:Android系统刷机后,第一次开机启动很慢的原因

在做Android内核开发的过程中,我们会发现,每次编译完系统源码,烧录到设备/手机中后,第一次启动都会很慢很慢,要好几分钟甚至十几分钟,为什么会出现这样的现象呢?系统刷机后第一次启动与后面再次启动有什么不同呢? 要解答这个问题,首先我们需要了解一下Android Dalvik虚拟机,以及Dalvik-cache. 由于嵌入式设备内存有限.CPU处理器不够强大.功耗敏感等原因,Google没有使用标准的JVM虚拟机,而是为Android单独开发了Dalvik虚拟机. Dalvik虚拟机与JVM虚

深入浅出 - Android系统移植与平台开发(十二)- Android JNI机制

第五章.JNI机制 4.1 JNI概述 由前面基础知识可知,Android的应用层由Java语言编写,Framework框架层则是由Java代码与C/C++语言实现,之所以由两种不同的语言组合开发框架层,是由于Java代码是与硬件环境彻底"隔离"的跨平台语言,Java代码无法直接操作硬件. 比方:Android系统支持大量传感器.Java运行在虚拟机中,无法直接得到传感器数据.而Android系统基于Linux操作系统.在Linux操作系统中C/C++通过Linux提供的系统调用接口能

修改Android系统字号(二)

/*********************************************************************** * 修改Android系统字号(二) * 说明: * 虽然在<修改Android系统字号(一)>中修改了Launcher中修改了界面, * 但是在其他的系统软件里还是有很多地方需要另外修改的,所以那是不行, * 今天Charlie给出意见,修改DPI,效果很好. * * 2016-5-19 深圳 南山平山村 曾剑锋 *****************