關(guān)鍵詞:android 4.0 nand 分區(qū) userdata 大小 fdisk
平臺信息:
內(nèi)核:linux3.0
系統(tǒng):android4.0.3
INAND:SDIN5C2-8G-L(SanDisk)
平臺:S5PV310(samsung exynos 4210)
一、NAND分區(qū)大?。?/strong>
我們的機器用的是8G的INAND,三星平臺一般把它分為四個區(qū):
(1)、fat分區(qū),作為sd卡用;
(2)、系統(tǒng)分區(qū),相當(dāng)為電腦c 盤,用來安裝android系統(tǒng);
(3)、userdata分區(qū);
(4)、cache分區(qū)。
二、分區(qū)更改操作過程
1, 更改uboot中代碼/common/cmd_mmc_fdisk.c
在這個文件中我們可以看到對四個分區(qū)大小的定義:
- #define SYSTEM_PART_SIZE (300*1024*1024)
- #define USER_DATA_PART_SIZE (600*1024*1024)
- #define CACHE_PART_SIZE (300*1024*1024)
2,編譯uboot 、燒錄
#sudo fastboot flash bootloader u-boot.bin(三星平臺的命令,不同平臺也許不同)
重啟,進入uboot命令行模式,一定要重啟。
3,重新分區(qū) fdisk -c 0
#fdisk –c 0 //重新把INAND分區(qū)
#fdisk –p 0 //查看INAND分區(qū)信息
如下所示,600MB為我們新分的空間。
- SMDKV310 # fdisk -c 0
- Count: 10000
- fdisk is completed
- partion # size(MB) block start # block count partition_Id
- 1 6233 2610960 12766380 0x0C //fat分區(qū),作為sd卡用
- 2 303 136620 622380 0x83 //系統(tǒng)分區(qū),相當(dāng)為電腦c 盤
- 3 600 759000 1229580 0x83 //userdata分區(qū)
- 4 303 1988580 622380 0x83 //cache分區(qū)
4,把整個系統(tǒng)區(qū)重新格式化
系統(tǒng)重重分區(qū)后,原來燒錄程序位置發(fā)生改變,系統(tǒng)分區(qū)(相當(dāng)于電腦的c盤)也變化,所以要重新格式化。(下面的命令是三星平臺下的,因平臺而不同)
- fatformat mmc 0:1
- ext4fromat mmc 0:2
- ext4fromat mmc 0:3
- ext4fromat mmc 0:4
5、把整個系統(tǒng)重新燒錄
- sudo fastboot flash fwbl1 v310N.nbl1.bin
- sudo fastboot flash bootloader u-boot.bin
- sudo fastboot flash zImage
- sudo fastboot flash ramdisk-uboot.img
- sudo fastboot flash system.img
6,打開機器,如下圖所示,查看更改結(jié)果
三、fdisk 命令分析
1、命令定義
- U_BOOT_CMD(
- fdisk, 6, 0, do_fdisk,
- "fdisk\t- fdisk for sd/mmc.\n",
- "-c <device_num>\t- create partition.\n"
- "fdisk -p <device_num> [<sys. part size(MB)> <user data part size> <cache part size>]\t- print partition information\n"
- );
2、do_fdisk的實現(xiàn)函數(shù)
我們平時用的fdisk -c 0 格式化inand ,fdisk -p 0 查看分區(qū)信息,在這里可以看到對這兩條命令的解析:
- int do_fdisk(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
- {
- if ( argc == 3 || argc ==6 )
- {
- if ( strcmp(argv[1], "-c") == 0 )
- return create_mmc_fdisk(argc, argv); //格式化分區(qū)
- else if ( strcmp(argv[1], "-p") == 0 )
- return print_mmc_part_info(argc, argv); //打印出分區(qū)的信息
- }
- else //如果不滿足argc條件,打印出幫助信息
- {
- printf("Usage:\nfdisk <-p> <device_num>\n");
- printf("fdisk <-c> <device_num> [<sys. part size(MB)> <user data part size> <cache part size>]\n");
- }
- return 0;
- }
3、如果為fdisk -c 0進,進入 create_mmc_fdisk,我們再分析這個函數(shù)
- int create_mmc_fdisk(int argc, char *argv[])
- {
- int rv;
- int total_block_count;
- unsigned char mbr[512];
- memset(mbr, 0x00, 512);
- total_block_count = get_mmc_block_count(argv[2]); //獲得塊信息,以512 為單位
- if (total_block_count < 0)
- return -1;
- //格式化INAND
- make_mmc_partition(total_block_count, mbr, (argc==6?1:0), argv);
-
- rv = put_mmc_mbr(mbr, argv[2]);
- if (rv != 0)
- return -1;
-
- printf("fdisk is completed\n"); //分區(qū)成功,打印信息
-
- argv[1][1] = 'p';
- print_mmc_part_info(argc, argv); //和fdisk –p 0 作用一樣,打印出分區(qū)信息
- return 0;
- }
4、我們看下格式化函數(shù)make_mmc_partition是怎么實現(xiàn)的吧。
這里面有兩上參考比較重要:block_start 、block_offset;每個區(qū)塊的開始和大小(偏移量),我們畫個圖來更好的表示這個吧。
在這里我們可以看到
- #define SYSTEM_PART_SIZE (300*1024*1024)
- #define USER_DATA_PART_SIZE (600*1024*1024)
- #define CACHE_PART_SIZE (300*1024*1024)
這幾宏的應(yīng)用,block_start= calc_unit(CFG_PARTITION_START, sdInfo),計算分區(qū)大小
- int make_mmc_partition(int total_block_count, unsigned char *mbr, int flag, char *argv[])
- {
- int block_start = 0, block_offset;
-
- SDInfo sdInfo;
- PartitionInfo partInfo[4];
- memset((unsigned char *)&sdInfo, 0x00, sizeof(SDInfo));
- get_SDInfo(total_block_count, &sdInfo);
-
- ///////////////////////////////////////////////////////////
- block_start = calc_unit(CFG_PARTITION_START, sdInfo); //得到第一分區(qū)的開始地址
- if (flag)
- block_offset = calc_unit((unsigned long long)simple_strtoul(argv[3], NULL, 0)*1024*1024, sdInfo);
- else
- block_offset = calc_unit(SYSTEM_PART_SIZE, sdInfo);//計算分區(qū)大小,這里面的值是不是很熟悉,就是我們開始改那些地方,這個是系統(tǒng)分區(qū)的
-
- partInfo[0].bootable = 0x00;
- partInfo[0].partitionId = 0x83;
-
- make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[0]);//開始分區(qū)
-
- ///////////////////////////////////////////////////////////
- block_start += block_offset;//更改下一個分析的開始地址,這樣可以保證分區(qū)連續(xù)
- if (flag)
- block_offset = calc_unit((unsigned long long)simple_strtoul(argv[4], NULL, 0)*1024*1024, sdInfo);
- else
- block_offset = calc_unit(USER_DATA_PART_SIZE, sdInfo);
-
- partInfo[1].bootable = 0x00;
- partInfo[1].partitionId = 0x83;
-
- make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[1]);
-
- ///////////////////////////////////////////////////////////
- block_start += block_offset;
- if (flag)
- block_offset = calc_unit((unsigned long long)simple_strtoul(argv[5], NULL, 0)*1024*1024, sdInfo);
- else
- block_offset = calc_unit(CACHE_PART_SIZE, sdInfo);
-
- partInfo[2].bootable = 0x00;
- partInfo[2].partitionId = 0x83;
-
- make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[2]);
-
- ///////////////////////////////////////////////////////////
- block_start += block_offset;
- block_offset = BLOCK_END;
-
- partInfo[3].bootable = 0x00;
- partInfo[3].partitionId = 0x0C;
-
- make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[3]);
-
- ///////////////////////////////////////////////////////////
- memset(mbr, 0x00, sizeof(mbr));
- mbr[510] = 0x55; mbr[511] = 0xAA;
-
- encode_partitionInfo(partInfo[0], &mbr[0x1CE]);
- encode_partitionInfo(partInfo[1], &mbr[0x1DE]);
- encode_partitionInfo(partInfo[2], &mbr[0x1EE]);
- encode_partitionInfo(partInfo[3], &mbr[0x1BE]);
-
- return 0;
- }
5、fidsk – p 0的實現(xiàn)函數(shù)也很簡單
- int print_mmc_part_info(int argc, char *argv[])
- {
- int rv;
-
- PartitionInfo partInfo[4];
-
- rv = get_mmc_part_info(argv[2], 1, &(partInfo[0].block_start), &(partInfo[0].block_count),
- &(partInfo[0].partitionId) );
-
- rv = get_mmc_part_info(argv[2], 2, &(partInfo[1].block_start), &(partInfo[1].block_count),
- &(partInfo[1].partitionId) );
-
- rv = get_mmc_part_info(argv[2], 3, &(partInfo[2].block_start), &(partInfo[2].block_count),
- &(partInfo[2].partitionId) );
-
- rv = get_mmc_part_info(argv[2], 4, &(partInfo[3].block_start), &(partInfo[3].block_count),
- &(partInfo[3].partitionId) );
-
- printf("\n");
- printf("partion # size(MB) block start # block count partition_Id \n");
-
- if ( (partInfo[0].block_start !=0) && (partInfo[0].block_count != 0) )
- printf(" 1 %6d %8d %8d 0x%.2X \n",
- (partInfo[0].block_count / 2048), partInfo[0].block_start,
- partInfo[0].block_count, partInfo[0].partitionId);
-
- if ( (partInfo[1].block_start !=0) && (partInfo[1].block_count != 0) )
- printf(" 2 %6d %8d %8d 0x%.2X \n",
- (partInfo[1].block_count / 2048), partInfo[1].block_start,
- partInfo[1].block_count, partInfo[1].partitionId);
-
- if ( (partInfo[2].block_start !=0) && (partInfo[2].block_count != 0) )
- printf(" 3 %6d %8d %8d 0x%.2X \n",
- (partInfo[2].block_count / 2048), partInfo[2].block_start,
- partInfo[2].block_count, partInfo[2].partitionId);
-
- if ( (partInfo[3].block_start !=0) && (partInfo[3].block_count != 0) )
- printf(" 4 %6d %8d %8d 0x%.2X \n",
- (partInfo[3].block_count / 2048), partInfo[3].block_start,
- partInfo[3].block_count, partInfo[3].partitionId);
-
- return 1;
- }
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。