1 L1813系统上双U盘设计方案——系统设计
1.1 方案背景
Android原生的磁盘管理方案,设计的思想是将EMMC上的空间通过sdcard的server模拟成一个StorageVolume,供用户作为外部存储空间使用,而该部分空间是不能通过切换大容量存储在PC侧供用户使用,只能通过MTP协议,将手机和PC侧互联,从而在PC侧读取手机侧的外部存储空间的内容。Android原生也是留出了给外置SD卡的设计接口,允许外置SD卡通过大容量存储的方式同PC侧相连接。
图2.1.1 Android原生设计存储方案
这里需要分清一个概念,Android原生设计的外部存储空间,和我们常规意义上理解是不同的,Android原生将所有用户可见的存储空间都定义为外部存储空间,而本文以下所指的外部存储空间,特指外置SD卡所表示的存储空间。而本文以下所指的内部存储空间(内置U盘),特指从EMMC上独立划分出来的一个分区所表示的手机EMMC上的一块存储空间。本文所指的双U盘方案,即指的是在Android系统上,同时存在外部存储空间和内部存储空间,并且在切换大容量存储的时候,可以在PC侧同时出现两个可移动磁盘。
图2.1.2 Android双U盘生设计存储方案
双U盘方案涉及到Android系统磁盘存储的整体框架,从APP,Framework,Vold,Kernel几个层次进行整体修改和设计。从EMMC上缩小userdata分区大小,将新增加空间做为一块固定大小的分区,作为内置U盘分区,而外置的SD卡作为外置U盘分区,从而形成双U盘的方案。系统运行时,需要保证能在不重启的前提下,动态的切换默认存储的分区,并保证上层应用的稳定性和安装第三方应用的正确性。本文将从底向上的层次顺序描述该方案。
1.2 Bootloader层对EMMC的分区调整
2.2.1背景知识
在嵌入式操作系统中,分区只是内核的概念,就是说A~B[p1] 地址放内核,C~D地址放文件系统,(也就是规定哪个地址区间放内核或者文件系统)等等,而对于bootloader中只要能将内核下载到A~B区的A地址开始处就可以,C~D区的C起始地址下载文件系统。。。这些起始地址在kernel的分区信息中能找到。所以bootloader对分区的概念不重要,只要它能把内核烧到A位置,把文件系统烧到C位置。
所以,在bootloader对Flash进行操作时,哪块区域放什么是以内核为主,而为了方便操作,bootloader类似也引入分区的概念。所以,如果你是通过uboot的内核命令行给kernel层传递分区信息,这种情况下,内核读取到的分区信息始终和u-boot中的保持一致(推荐的做法);而如果你是把分区信息写在内核源代码里定义好的方法,那最好保证它和u-boot中的保持一致,即同步修改uboot及内核的相关部分。
目前L1813的kernel版本已经不支持通过uboot的内核命令行给kernel传递分区信息的方式,目前采用的是一种在uboot里就配置好所有分区信息,从而直接使用。
2.2.2 L1813针对双U盘的分区调整方法
目前,L1813方案的分区设置是在bootable/bootloader/uboot/include/configs/下针对不同项目有不同的.h的配置文件,以ust802手机的P0版手机为例,需要查看并修改comip_ust802_v1_0.h的相关分区信息。
2.2.2.1分区结构体
struct partition {
ulong sector_size;
ulong start;
ulong length;
const char *name;
};
成员名 |
描述 |
sector_size |
每个扇区大小 |
start |
分区起始地址 |
length |
分区长度 |
char *name |
分区名称 |
2.2.2.2 分区详细信息
每个扇区大小(单位:字节) |
分区起始位置 |
分区所占扇区数目(分区长度) |
分区名称 |
512(0x200) |
0x00000000 |
0x00000100 |
Uboot |
512(0x200) |
0x00000400 |
0x00000400 |
lcboot |
512(0x200) |
0x00000800 |
0x00002000 |
logo |
512(0x200) |
0x00002800 |
0x00000800 |
fota |
512(0x200) |
0x00003000 |
0x00000800 |
panic |
512(0x200) |
0x00003800 |
0x00001000 |
amt |
512(0x200) |
0x00004800 |
0x00008000 |
modemarm |
512(0x200) |
0x0000C800 |
0x00001620 |
modemdsp0 |
512(0x200) |
0x0000DE20 |
0x000009E0 |
modemdsp1 |
512(0x200) |
0x0000E800 |
0x00002000 |
kernel |
512(0x200) |
0x00010800 |
0x00000800 |
ramdisk |
512(0x200) |
0x00011000 |
0x00000800 |
ramdisk_amt1 |
512(0x200) |
0x00011800 |
0x00000800 |
ramdisk_amt3 |
512(0x200) |
0x00012000 |
0x00000800 |
ramdisk_recovery |
512(0x200) |
0x00012800 |
0x00002000 |
kernel_recovery |
512(0x200) |
0x00018000 |
0x00001000 |
misc |
512(0x200) |
0x00020000 |
0x00040000 |
cache |
512(0x200) |
0x00060000 |
0x000c0000 |
system |
512(0x200) |
0x00120000 |
userdata |
图1原ust802_v1_0手机分区详表
2.2.2.3分区修改方法
双U盘方案需要将EMMC上缩小userdata[p2] 分区的1G空间,将该空间作为一个1G大小的新分区,称为udisk分区,作为内置存储空间。
调整后的分区信息如下标红部分(udisk分区从userdata分区头部划分,是为了方便后期调整EMMC大小时,可以直接从userdata分区尾部调整):
每个扇区大小(单位:字节) |
分区起始位置 |
分区所占扇区数目(分区长度) |
分区名称 |
512(0x200) |
0x00000000 |
0x00000100 |
uboot |
512(0x200) |
0x00000400 |
0x00000400 |
lcboot |
512(0x200) |
0x00000800 |
0x00002000 |
logo |
512(0x200) |