基于高通平台的Android系统分区管理

2014-11-27 20:48蔡洁
新媒体研究 2014年19期
关键词:分区高通

摘 要 本文以存储设备管理为出发点,从Android系统的分区管理展开讨论,阐述操作系统的引导方式、分区表的原理、类型、作用,并以开发实例说明产品分区模式,如何对分区进行扩展,以便更为有效的利用内部存储空间,提高存储设备的可用性和扩展性。

关键词 Android;分区;高通

中图分类号:TP316 文献标识码:A 文章编号:1671-7597(2014)19-0044-03

Android是一种基于Linux平台的自由及开放源代码的操作系统,是目前世界上最流行的移动终端操作系统之一,广泛用于手机、平板电脑等设备中。

高通(Qualcomm)是一家美国的无线电通信技术研发公司,其一直致力于电信设备和消费电子设备的新技术研发,尤其是近年来其推出的高度集成的“全合一”移动处理器系列平台,覆盖入门级智能手机乃至高端智能手机、平板电脑以及下一代智能终端。特别是,高通的芯片是首个能够兼容Android系统的,所以国内外众多手机品牌均采用高通作为其智能手机的主要芯片提供商。可以说,高通在智能手机行业的地位就相当于PC领域的芯片巨头因特尔。

1 分区表综述

众所周知,以Android平台设计开发的智能手机和平板电脑都有内部存储器,一般为SDIO(Secure Digital Input and Output Card)接口的EMMC(Embedded Multi Media Card)存储芯片,俗称闪存。根据不同产品的配置和需求,容量从4G到128G不等。在使用时,闪存被分成多个区域,这个过程我们把它叫做“分区”。分区既可以让系统和用户分区相互隔离,也可以增强系统稳定性,有效利用、管理存储区域,就如同在图书馆的不同区域中查找不同类型的书籍。在研究分区管理之前,必须了解分区表的概念。

分区表是将大表的数据分成称为分区的许多小的子集。倘若磁盘丢失了分区表,数据就无法按顺序读取和写入,导致无法操作。对于分区的格式,目前大容量存储区有两种分区方式,即:BIOS和硬盘MBR分区、EFI和硬盘GPT分区。下面就对这两种分区表进行详细的说明。

1.1 MBR分区表

MBR(Master Boot Record),主引导记录,又叫做主引导扇区,是计算机开机后BIOS访问硬盘时所必须要读取的首个扇区,是一段512字节的引导代码,位于磁盘的第一个扇区,在硬盘上的位置为(柱面,磁头,扇区)=(0,0,1)。包含三个部分:主引导程序、磁盘分区表和引导记录。

因主引导记录在这个扇区中占了大部分空间,所以习惯将该扇区称为MBR扇区。主引导程序即主引导记录占446字节,它用于硬盘启动时将系统控制权转给用户指定的并在分区表中登记的某个操作系统。磁盘分区表占64字节,根据规定,每个分区表项占16个字节,所以最多可以描述、存放4个分区信息,这就是为什么MBR模式只能支持4个主分区的原因。

主分区数目不能超过4个的限制,很多时候,4个主分区并不能满足需要。另外最关键的是MBR分区方案无法支持超过2TB容量的磁盘。因为这一方案用4个字节存储分区的总扇区数,最大能表示2的32次方的扇区个数,按每扇区512字节计算,每个分区最大不能超过2TB。磁盘容量超过2TB以后,分区的起始位置也就无法表示了。在硬盘容量迅速递增的今天,2TB的限制早已被突破。由此可见,MBR分区方案现在已经无法再满足需要了。因此在大容量硬盘和分区出现之后,MBR分区方式逐渐被GPT分区表取代。

1.2 GPT分区表

1.2.1 GPT说明

GPT(GUID Partition Table),全球唯一标识分区表,是一种由基于可扩展固件接口(EFI)使用的磁盘分区架构。它属于可扩展固件接口(EFI)标准中的一部分,用来替代主引导记录分区表。

GPT使用逻辑区块地址(LBA)作为寻址方式,在GPT硬盘中,分区表的位置信息存储在GPT头中,但为了兼容MBR,硬盘的第一个扇区LBA 0仍然用作MBR,依旧保留了MBR的结构。GTP头存储于LBA 1,在GPT工作时,会优先读取GPT(LBA 1)内容。接下来是分区表,从LBA 34开始是第一个数据分区的

开始。

1.2.2 GPT分区类型GUID

GPT支持不同的操作系统,如Windows、Mac OS、各主流的发行版Unix和Linux操作系统。GUID的作用是用不同的ID来标记不同的操作系统和分区类型,操作系统在启动时,根据GUID即可判断分区类型的合法性。

操作

系统 分区类型 GUID

Linux 数据分区 EBD0A0A2-B9E5-4433-87C0-68B6B72699C7

RAID分区 A19D880F-05FC-4D3B-A006-743F0F84911E

交换分区 0657FD6D-A4AB-43C4-84E5-0933C84B4F4F

逻辑卷管理器(LVM)分区 E6D6D379-F507-44C2-A23C-238F2A3DF928

保留 8DA63339-0007-60C0-C436-083AC8230908

1.2.3 GPT与MBR对比

与MBR分区模式相比,GPT有以下优点。

1)GPT允许每个磁盘高达128个分区,而MBR磁盘最多只有4个主分区,或者3个主分区加一个扩展分区。

2)GPT支持高达18千兆兆字节(EB)的卷大小,而MBR最大卷为2TB;(18EB= 19327352832GB)。

3)允许将主磁盘分区表和备份磁盘分区表用于冗余。endprint

4)支持唯一的磁盘和分区ID(GUID)。

5)性能更加稳定。

2 高通MSM86XX平台分区模式介绍

近年来,Android作为一个新兴的操作系统,迅速的发展为一个生态圈,随着系统的普及,越来越多的电子产品使用此操作系统。在逐渐被人们熟知的同时,也有更多的芯片公司、产品公司、设计公司和方案公司对其进行研究、开发和扩展。分区的管理是普通消费类电子产品最基本和最重要的一项功能,它既要保证设备稳定工作,又要合理有效的使用存储设备,确保数据文件的正确性。

Android是以Linux内核为基础的一套软件堆叠系统,所以Android系统的分区格式也使用Linux的分区格式。由于GPT也支持Linux操作系统,加上现在使用Linux和Android系统的嵌入式产品,都包含多个分区,例如:启动、内核、缓冲、系统、用户、恢复等分区,需要十几甚至二十多个分区。因为MBR只支持4个主分区,所以已经不能满足以上需求,必须使用GPT分区模式。下面就以现在主流的电子产品解决方案——高通平台,说明GPT分区在Android系统中的应用和开发过程。

前面提到,手机、平板类电子产品都是用EMMC作为内部存储器,EMMC上的内容由系统镜像和用户数据文件组成,用户数据文件是用户在使用过程中创建的个人文件,而系统镜像是在产品出厂前,使用烧录软件下载到EMMC中,产品才能正常工作。每个平台的生产厂商都会提供一套这样的工具和配置文件,用于开发和生产阶段下载系统镜像,其作用类似于使用Win7系统安装光盘,在PC上安装操作系统。配置文件按照一定格式描述该产品的EMMC划分为多少个分区、分区的顺序、大小、格式等内容。高通平台也提供了平台开发软件包,称之为QPST(Qualcomm Product Support Tool)。QPST就是通过配置文件的描述,来给内部存储器划分分区,并下载镜像。分区格式描述文件是partition.xml,分区镜像配置文件Boardconfig.mk。下面就详细叙述这两个文件的使用。

2.1 分区格式描述文件partition.xml

分区配置文件partition.xml用于指定分区名称、分区大小和类型,例如boot、kernel、cache、system、userdata、recovery等,并用于生成GPT分区表,主要包含以下参数。

参数名 参数说明

WRITE_PROTECT_BOUNDARY_IN_KB 为防止分区的意外写入,分区之间保留一段隔离区域,称之为写保护区域。写保护区域的基准大小,在高通平台中默认设置为64M

GROW_LAST_PARTITION_TO_FILL_DISK 此字段的作用类似于在Windows系统下给硬件进行分区时,最后一个分区默认使用剩余全部空间,此值为真时,最后一个分区的大小会自动调整为EMMC剩余所有空间大小,充分利用空间。如果为假,最后一个分区将按设定的大小去分配,并预留一部分空间不使用

partition label 分区名字

type 分区类型

size_in_kb 分区大小

bootable 是否可以引导

readonly 是否为只读

filename 分区对应的镜像名字

sparse 烧录的镜像是否是展开的

例如,在partition.xml文件中关于system分区的配置信息如下所示。

<!—NOTE: entries here are used by the parser when generating output

<!—NOTE: each filename must be on its own line as in varable=value

WRITE_PROTECT_BOUNDARY_IN_KB=65536 GROW_LAST_PARTITION_TO_FILL_DISK=true

该文件是system分区的配置文件,主要作用包括:

WRITE_PROTECT_BOUNDARY_IN_KB= 65536 写保护区域的基准大小为64M,保证同一读写属性的分区64M对齐

GROW_LAST_PARTITION_TO_FILL_DISK=true 最后一个分区的大小会自动扩充到最大

partition label=”system” 指定分区的名字为system

size_in_kb=”819200” 指定分区大小为800M

type=”EBD0A0A2-B9E5-4433-87C0-68B6B72699C7” 分区类型为数据分区

bootable=”false” 设置该分区为不可引导

分区

readonly=”true” 读写属性为只读

filename=”system.img” 分区对应的镜像名字

sparse=”true” 烧录镜像是展开的镜像

文件

2.2 分区镜像配置文件Boardconfig.mk

分区镜像配置文件Boardconfig.mk的作用一般包括两个方面:指定对应分区镜像文件格式化的大小和分区镜像文件的文件系统类型。例如,在Boardconfig.mk文件中关于分区格式和分区大小的部分配置信息:

TARGET_USERIMAGES_USE_EXT4 := true

BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE := true

……

BOARD_BOOTIMAGE_PARTITION_SIZE := 0x00A00000

BOARD_SYSTEMIMAGE_PARTITION_SIZE := 838860800

……

当编译的时候makefile就会从Boardconfig.mk获取system分区的大小和文件系统类型并用调用make_ext4fs把out/target/product/msm8610/system的文件制作成大小为800M ext4格式的system.img分区压缩文件。需要说明的是:编译生成的system.img里面包含了对应分区的文件系统类型,以及挂载分区的大小,所以改变分区时一定要更新对应分区镜像文件。

3 高通平台项目分区整改案例

高通MSM8X10平台原生Android方案,使用4G内置EMMC,划分了25个分区,系统镜像大约使用约2G空间,针对不同的产品,分区个数和大小各有差异,下面就以开发实例说明如何调整分区大小,以及如何新增分区。

3.1 调整system分区大小

各分区均可根据需要进行调整,原生系统的system分区规划了800M空间,但实际镜像只有300多M,为有效利用存储器,可以将此分区缩小为400M:

1)修改文件partition.xml中的字段,size_in_kb=”409600”。

2)修改文件Boardconfig.mk中的字段,BOARD_SYSTEMIMAGE_PARTITION_SIZE = 419430400。

3)重新编译生成system.img镜像。

3.2 增加vendor分区

原生平台仅提供基本和有限的功能,不适合产品化的要求,为扩展原生平台的功能,需要增加一个300M空间的vendor分区,可用于支持存放不同厂商的Logo、预装应用、定制程序和配置文件,如前所述partition.xml用于定义和描述分区信息,供烧录软件QPST使用,增加分区需要做如下修改:

1)文件里面需要新增一个分区信息,并配置对应的分区大小、类型和要烧写镜像的名字等等信息,内容如下。

2)device/qcom/msmxx/Boardconfig.mk里面的分区宏,使这个分区恰好小于等于modem侧的partition.xml分区大小:

BOARD_SYSTEMIMAGE_PARTITION_SIZE := 419430400

3.3 增大userdata分区

Android系统中,内部存储器的最后一个分区一般命名为userdata分区,是用户可以使用的分区,其他分区是系统使用的,用户不能操作。前两个实例说明了如何实际镜像大小调整分区、如何根据需求增加分区。最后说明如何去除由于对齐而造成的空间浪费,并尽可能的为用户增大userdata分区。

1) 更改分区文件。

修改partition.xml文件里面做如下修改。

WRITE_PROTECT_BOUNDARY_IN_KB = 0;

system分区的大小为400M;

userdata的分区为3G;

2) device/qcom/msmxx/Boardconfig.mk修改分区镜像文件格式化的大小。

把system分区镜像文件格式化的大小400M

userdata分区镜像文件格式化的大小3G

BOARD_USERDATAIMAGE_PARTITION_SIZE := 3145728000

Userdata增大后,系统会显示用户分区总空间为2.88GB

3.4 减少分区空间浪费的措施

1)计算每个镜像的分区大小,留有足够预留空间合理分配每个分区大小。

2)在进行分区布局的时候,尽量让读写属性一致的放在一起,这样就可以减少由于对齐造成的空间浪费。

3)通过设置WRITE_PROTECT_BOUNDARY_IN_KB来改变写保护区域的基准大小。

4)GROW_LAST_PARTITION_TO_FILL_DISK:最好设置为真,这样最后一个分区就会扩展到最大这样保证不浪费EMMC存储

空间。

3.5 注意事项

1)EMMC软件下载所依赖的分区信息和系统启动时加载的GPT分区信息必须一致。

2)在改变分区大小时,要防止自己的分区大小总和不能超过EMMC的总大小,否则越界的分区时将会出错,系统稳定性将得不到保证。

参考文献

[1]百度百科.mbr[EB/OL].[2014-9-1].http://baike.baidu.com/subview/9485/9079238.htm#viewPageContent.

[2]百度百科.gpt[EB/OL].[2014-9-1].http://baike.baidu.com/subview/10817/15336681.htm.

[3]kieven2008.Android分区[EB/OL].[2014-9-1].http://blog.csdn.net/kieven2008/article/details/19327907.

作者简介

蔡洁,硕士,讲师,研究方向:计算机技术。

分区镜像配置文件Boardconfig.mk的作用一般包括两个方面:指定对应分区镜像文件格式化的大小和分区镜像文件的文件系统类型。例如,在Boardconfig.mk文件中关于分区格式和分区大小的部分配置信息:

TARGET_USERIMAGES_USE_EXT4 := true

BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE := true

……

BOARD_BOOTIMAGE_PARTITION_SIZE := 0x00A00000

BOARD_SYSTEMIMAGE_PARTITION_SIZE := 838860800

……

当编译的时候makefile就会从Boardconfig.mk获取system分区的大小和文件系统类型并用调用make_ext4fs把out/target/product/msm8610/system的文件制作成大小为800M ext4格式的system.img分区压缩文件。需要说明的是:编译生成的system.img里面包含了对应分区的文件系统类型,以及挂载分区的大小,所以改变分区时一定要更新对应分区镜像文件。

3 高通平台项目分区整改案例

高通MSM8X10平台原生Android方案,使用4G内置EMMC,划分了25个分区,系统镜像大约使用约2G空间,针对不同的产品,分区个数和大小各有差异,下面就以开发实例说明如何调整分区大小,以及如何新增分区。

3.1 调整system分区大小

各分区均可根据需要进行调整,原生系统的system分区规划了800M空间,但实际镜像只有300多M,为有效利用存储器,可以将此分区缩小为400M:

1)修改文件partition.xml中的字段,size_in_kb=”409600”。

2)修改文件Boardconfig.mk中的字段,BOARD_SYSTEMIMAGE_PARTITION_SIZE = 419430400。

3)重新编译生成system.img镜像。

3.2 增加vendor分区

原生平台仅提供基本和有限的功能,不适合产品化的要求,为扩展原生平台的功能,需要增加一个300M空间的vendor分区,可用于支持存放不同厂商的Logo、预装应用、定制程序和配置文件,如前所述partition.xml用于定义和描述分区信息,供烧录软件QPST使用,增加分区需要做如下修改:

1)文件里面需要新增一个分区信息,并配置对应的分区大小、类型和要烧写镜像的名字等等信息,内容如下。

2)device/qcom/msmxx/Boardconfig.mk里面的分区宏,使这个分区恰好小于等于modem侧的partition.xml分区大小:

BOARD_SYSTEMIMAGE_PARTITION_SIZE := 419430400

3.3 增大userdata分区

Android系统中,内部存储器的最后一个分区一般命名为userdata分区,是用户可以使用的分区,其他分区是系统使用的,用户不能操作。前两个实例说明了如何实际镜像大小调整分区、如何根据需求增加分区。最后说明如何去除由于对齐而造成的空间浪费,并尽可能的为用户增大userdata分区。

1) 更改分区文件。

修改partition.xml文件里面做如下修改。

WRITE_PROTECT_BOUNDARY_IN_KB = 0;

system分区的大小为400M;

userdata的分区为3G;

2) device/qcom/msmxx/Boardconfig.mk修改分区镜像文件格式化的大小。

把system分区镜像文件格式化的大小400M

userdata分区镜像文件格式化的大小3G

BOARD_USERDATAIMAGE_PARTITION_SIZE := 3145728000

Userdata增大后,系统会显示用户分区总空间为2.88GB

3.4 减少分区空间浪费的措施

1)计算每个镜像的分区大小,留有足够预留空间合理分配每个分区大小。

2)在进行分区布局的时候,尽量让读写属性一致的放在一起,这样就可以减少由于对齐造成的空间浪费。

3)通过设置WRITE_PROTECT_BOUNDARY_IN_KB来改变写保护区域的基准大小。

4)GROW_LAST_PARTITION_TO_FILL_DISK:最好设置为真,这样最后一个分区就会扩展到最大这样保证不浪费EMMC存储

空间。

3.5 注意事项

1)EMMC软件下载所依赖的分区信息和系统启动时加载的GPT分区信息必须一致。

2)在改变分区大小时,要防止自己的分区大小总和不能超过EMMC的总大小,否则越界的分区时将会出错,系统稳定性将得不到保证。

参考文献

[1]百度百科.mbr[EB/OL].[2014-9-1].http://baike.baidu.com/subview/9485/9079238.htm#viewPageContent.

[2]百度百科.gpt[EB/OL].[2014-9-1].http://baike.baidu.com/subview/10817/15336681.htm.

[3]kieven2008.Android分区[EB/OL].[2014-9-1].http://blog.csdn.net/kieven2008/article/details/19327907.

作者简介

蔡洁,硕士,讲师,研究方向:计算机技术。

分区镜像配置文件Boardconfig.mk的作用一般包括两个方面:指定对应分区镜像文件格式化的大小和分区镜像文件的文件系统类型。例如,在Boardconfig.mk文件中关于分区格式和分区大小的部分配置信息:

TARGET_USERIMAGES_USE_EXT4 := true

BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE := true

……

BOARD_BOOTIMAGE_PARTITION_SIZE := 0x00A00000

BOARD_SYSTEMIMAGE_PARTITION_SIZE := 838860800

……

当编译的时候makefile就会从Boardconfig.mk获取system分区的大小和文件系统类型并用调用make_ext4fs把out/target/product/msm8610/system的文件制作成大小为800M ext4格式的system.img分区压缩文件。需要说明的是:编译生成的system.img里面包含了对应分区的文件系统类型,以及挂载分区的大小,所以改变分区时一定要更新对应分区镜像文件。

3 高通平台项目分区整改案例

高通MSM8X10平台原生Android方案,使用4G内置EMMC,划分了25个分区,系统镜像大约使用约2G空间,针对不同的产品,分区个数和大小各有差异,下面就以开发实例说明如何调整分区大小,以及如何新增分区。

3.1 调整system分区大小

各分区均可根据需要进行调整,原生系统的system分区规划了800M空间,但实际镜像只有300多M,为有效利用存储器,可以将此分区缩小为400M:

1)修改文件partition.xml中的字段,size_in_kb=”409600”。

2)修改文件Boardconfig.mk中的字段,BOARD_SYSTEMIMAGE_PARTITION_SIZE = 419430400。

3)重新编译生成system.img镜像。

3.2 增加vendor分区

原生平台仅提供基本和有限的功能,不适合产品化的要求,为扩展原生平台的功能,需要增加一个300M空间的vendor分区,可用于支持存放不同厂商的Logo、预装应用、定制程序和配置文件,如前所述partition.xml用于定义和描述分区信息,供烧录软件QPST使用,增加分区需要做如下修改:

1)文件里面需要新增一个分区信息,并配置对应的分区大小、类型和要烧写镜像的名字等等信息,内容如下。

2)device/qcom/msmxx/Boardconfig.mk里面的分区宏,使这个分区恰好小于等于modem侧的partition.xml分区大小:

BOARD_SYSTEMIMAGE_PARTITION_SIZE := 419430400

3.3 增大userdata分区

Android系统中,内部存储器的最后一个分区一般命名为userdata分区,是用户可以使用的分区,其他分区是系统使用的,用户不能操作。前两个实例说明了如何实际镜像大小调整分区、如何根据需求增加分区。最后说明如何去除由于对齐而造成的空间浪费,并尽可能的为用户增大userdata分区。

1) 更改分区文件。

修改partition.xml文件里面做如下修改。

WRITE_PROTECT_BOUNDARY_IN_KB = 0;

system分区的大小为400M;

userdata的分区为3G;

2) device/qcom/msmxx/Boardconfig.mk修改分区镜像文件格式化的大小。

把system分区镜像文件格式化的大小400M

userdata分区镜像文件格式化的大小3G

BOARD_USERDATAIMAGE_PARTITION_SIZE := 3145728000

Userdata增大后,系统会显示用户分区总空间为2.88GB

3.4 减少分区空间浪费的措施

1)计算每个镜像的分区大小,留有足够预留空间合理分配每个分区大小。

2)在进行分区布局的时候,尽量让读写属性一致的放在一起,这样就可以减少由于对齐造成的空间浪费。

3)通过设置WRITE_PROTECT_BOUNDARY_IN_KB来改变写保护区域的基准大小。

4)GROW_LAST_PARTITION_TO_FILL_DISK:最好设置为真,这样最后一个分区就会扩展到最大这样保证不浪费EMMC存储

空间。

3.5 注意事项

1)EMMC软件下载所依赖的分区信息和系统启动时加载的GPT分区信息必须一致。

2)在改变分区大小时,要防止自己的分区大小总和不能超过EMMC的总大小,否则越界的分区时将会出错,系统稳定性将得不到保证。

参考文献

[1]百度百科.mbr[EB/OL].[2014-9-1].http://baike.baidu.com/subview/9485/9079238.htm#viewPageContent.

[2]百度百科.gpt[EB/OL].[2014-9-1].http://baike.baidu.com/subview/10817/15336681.htm.

[3]kieven2008.Android分区[EB/OL].[2014-9-1].http://blog.csdn.net/kieven2008/article/details/19327907.

作者简介

蔡洁,硕士,讲师,研究方向:计算机技术。

猜你喜欢
分区高通
上海实施“分区封控”
另辟蹊径使用Linux备份和还原Windows系统
高通、苹果专利案新进展:苹果拒绝与高通和解
历史转折后的高通前执行董事长
美政府要求高通推迟股东大会 博通并购案再生变数
《福布斯》欧盟罚高通
大型数据库分区表研究
神探出手,巧破分区离奇失踪案