九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
uboot 下更改NAND的分區(qū) fdisk

關(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ū)大小的定義:

[cpp] view plaincopy
  1. #define     SYSTEM_PART_SIZE        (300*1024*1024)  
  2. #define     USER_DATA_PART_SIZE     (600*1024*1024)  
  3. #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為我們新分的空間。

[html] view plaincopy
  1. SMDKV310 # fdisk -c 0  
  2. Count: 10000  
  3. fdisk is completed  
  4. partion # size(MB) block start # block count partition_Id   
  5.   1 6233 2610960 12766380 0x0C       //fat分區(qū),作為sd卡用    
  6.   2 303 136620 622380 0x83           //系統(tǒng)分區(qū),相當(dāng)為電腦c 盤  
  7.   3 600 759000 1229580 0x83          //userdata分區(qū)  
  8.   4 303 1988580 622380 0x83          //cache分區(qū)  

4,把整個系統(tǒng)區(qū)重新格式化

系統(tǒng)重重分區(qū)后,原來燒錄程序位置發(fā)生改變,系統(tǒng)分區(qū)(相當(dāng)于電腦的c盤)也變化,所以要重新格式化。(下面的命令是三星平臺下的,因平臺而不同)

[html] view plaincopy
  1. fatformat mmc 0:1  
  2. ext4fromat mmc 0:2  
  3. ext4fromat mmc 0:3  
  4. ext4fromat mmc 0:4  

5、把整個系統(tǒng)重新燒錄

[html] view plaincopy
  1. sudo fastboot flash fwbl1 v310N.nbl1.bin   
  2. sudo fastboot flash bootloader u-boot.bin   
  3. sudo fastboot flash zImage  
  4. sudo fastboot flash ramdisk-uboot.img  
  5. sudo fastboot flash system.img  

6,打開機器,如下圖所示,查看更改結(jié)果 

三、fdisk 命令分析

1、命令定義

[cpp] view plaincopy
  1. U_BOOT_CMD(  
  2.     fdisk, 6, 0, do_fdisk,  
  3.     "fdisk\t- fdisk for sd/mmc.\n",  
  4.     "-c <device_num>\t- create partition.\n"  
  5.     "fdisk -p <device_num> [<sys. part size(MB)> <user data part size> <cache part size>]\t- print partition information\n"  
  6. );  

2、do_fdisk的實現(xiàn)函數(shù)

   我們平時用的fdisk -c 0 格式化inand ,fdisk -p 0 查看分區(qū)信息,在這里可以看到對這兩條命令的解析:

[cpp] view plaincopy
  1. int do_fdisk(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  
  2. {  
  3.     if ( argc == 3 || argc ==6 )  
  4.     {  
  5.         if ( strcmp(argv[1], "-c") == 0 )  
  6.             return create_mmc_fdisk(argc, argv);  //格式化分區(qū)  
  7.         else if ( strcmp(argv[1], "-p") == 0 )  
  8.             return print_mmc_part_info(argc, argv); //打印出分區(qū)的信息  
  9.     }  
  10.     else //如果不滿足argc條件,打印出幫助信息  
  11.     {  
  12.         printf("Usage:\nfdisk <-p> <device_num>\n");  
  13.         printf("fdisk <-c> <device_num> [<sys. part size(MB)> <user data part size> <cache part size>]\n");  
  14.     }  
  15.     return 0;  
  16. }  

3、如果為fdisk -c 0進,進入 create_mmc_fdisk,我們再分析這個函數(shù)

[cpp] view plaincopy
  1. int create_mmc_fdisk(int argc, char *argv[])  
  2. {  
  3.     int     rv;  
  4.     int     total_block_count;  
  5.     unsigned char   mbr[512];  
  6.     memset(mbr, 0x00, 512);   
  7. total_block_count = get_mmc_block_count(argv[2]); //獲得塊信息,以512 為單位  
  8.     if (total_block_count < 0)  
  9.         return -1;  
  10.     //格式化INAND  
  11.     make_mmc_partition(total_block_count, mbr, (argc==6?1:0), argv);  
  12.   
  13.     rv = put_mmc_mbr(mbr, argv[2]);  
  14.     if (rv != 0)  
  15.         return -1;  
  16.           
  17.     printf("fdisk is completed\n");  //分區(qū)成功,打印信息  
  18.   
  19.     argv[1][1] = 'p';  
  20.     print_mmc_part_info(argc, argv);  //和fdisk –p 0 作用一樣,打印出分區(qū)信息  
  21.     return 0;  
  22. }  

4、我們看下格式化函數(shù)make_mmc_partition是怎么實現(xiàn)的吧。

這里面有兩上參考比較重要:block_start 、block_offset;每個區(qū)塊的開始和大小(偏移量),我們畫個圖來更好的表示這個吧。

在這里我們可以看到

[cpp] view plaincopy
  1. #define     SYSTEM_PART_SIZE        (300*1024*1024)  
  2. #define     USER_DATA_PART_SIZE     (600*1024*1024)  
  3. #define     CACHE_PART_SIZE         (300*1024*1024)  

這幾宏的應(yīng)用,block_start= calc_unit(CFG_PARTITION_START, sdInfo),計算分區(qū)大小

[cpp] view plaincopy
  1. int make_mmc_partition(int total_block_count, unsigned char *mbr, int flag, char *argv[])  
  2. {  
  3.     int     block_start = 0, block_offset;  
  4.   
  5.     SDInfo      sdInfo;  
  6.     PartitionInfo   partInfo[4];  
  7.     memset((unsigned char *)&sdInfo, 0x00, sizeof(SDInfo));  
  8.     get_SDInfo(total_block_count, &sdInfo);  
  9.   
  10. ///////////////////////////////////////////////////////////  
  11.     block_start = calc_unit(CFG_PARTITION_START, sdInfo); //得到第一分區(qū)的開始地址  
  12.     if (flag)  
  13.         block_offset = calc_unit((unsigned long long)simple_strtoul(argv[3], NULL, 0)*1024*1024, sdInfo);  
  14.     else  
  15.         block_offset = calc_unit(SYSTEM_PART_SIZE, sdInfo);//計算分區(qū)大小,這里面的值是不是很熟悉,就是我們開始改那些地方,這個是系統(tǒng)分區(qū)的  
  16.   
  17.     partInfo[0].bootable    = 0x00;  
  18.     partInfo[0].partitionId = 0x83;  
  19.   
  20.     make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[0]);//開始分區(qū)  
  21.   
  22. ///////////////////////////////////////////////////////////   
  23.     block_start += block_offset;//更改下一個分析的開始地址,這樣可以保證分區(qū)連續(xù)  
  24.     if (flag)  
  25.         block_offset = calc_unit((unsigned long long)simple_strtoul(argv[4], NULL, 0)*1024*1024, sdInfo);  
  26.     else  
  27.         block_offset = calc_unit(USER_DATA_PART_SIZE, sdInfo);  
  28.       
  29.     partInfo[1].bootable    = 0x00;  
  30.     partInfo[1].partitionId = 0x83;  
  31.   
  32.     make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[1]);  
  33.   
  34. ///////////////////////////////////////////////////////////   
  35.     block_start += block_offset;  
  36.     if (flag)  
  37.         block_offset = calc_unit((unsigned long long)simple_strtoul(argv[5], NULL, 0)*1024*1024, sdInfo);  
  38.     else  
  39.         block_offset = calc_unit(CACHE_PART_SIZE, sdInfo);  
  40.   
  41.     partInfo[2].bootable    = 0x00;  
  42.     partInfo[2].partitionId = 0x83;  
  43.   
  44.     make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[2]);  
  45.   
  46. ///////////////////////////////////////////////////////////   
  47.     block_start += block_offset;  
  48.     block_offset = BLOCK_END;  
  49.   
  50.     partInfo[3].bootable    = 0x00;  
  51.     partInfo[3].partitionId = 0x0C;  
  52.   
  53.     make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[3]);  
  54.   
  55. ///////////////////////////////////////////////////////////   
  56.     memset(mbr, 0x00, sizeof(mbr));  
  57.     mbr[510] = 0x55; mbr[511] = 0xAA;  
  58.       
  59.     encode_partitionInfo(partInfo[0], &mbr[0x1CE]);  
  60.     encode_partitionInfo(partInfo[1], &mbr[0x1DE]);  
  61.     encode_partitionInfo(partInfo[2], &mbr[0x1EE]);  
  62.     encode_partitionInfo(partInfo[3], &mbr[0x1BE]);  
  63.       
  64.     return 0;  
  65. }  

5、fidsk – p 0的實現(xiàn)函數(shù)也很簡單

[cpp] view plaincopy
  1. int print_mmc_part_info(int argc, char *argv[])  
  2. {  
  3.     int     rv;  
  4.   
  5.     PartitionInfo   partInfo[4];  
  6.       
  7.     rv = get_mmc_part_info(argv[2], 1, &(partInfo[0].block_start), &(partInfo[0].block_count),  
  8.             &(partInfo[0].partitionId) );  
  9.       
  10.     rv = get_mmc_part_info(argv[2], 2, &(partInfo[1].block_start), &(partInfo[1].block_count),  
  11.             &(partInfo[1].partitionId) );  
  12.   
  13.     rv = get_mmc_part_info(argv[2], 3, &(partInfo[2].block_start), &(partInfo[2].block_count),  
  14.             &(partInfo[2].partitionId) );  
  15.   
  16.     rv = get_mmc_part_info(argv[2], 4, &(partInfo[3].block_start), &(partInfo[3].block_count),  
  17.             &(partInfo[3].partitionId) );  
  18.   
  19.     printf("\n");     
  20.     printf("partion #    size(MB)     block start #    block count    partition_Id \n");  
  21.   
  22.     if ( (partInfo[0].block_start !=0) && (partInfo[0].block_count != 0) )   
  23.         printf("   1        %6d         %8d        %8d          0x%.2X \n",  
  24.             (partInfo[0].block_count / 2048), partInfo[0].block_start,  
  25.             partInfo[0].block_count, partInfo[0].partitionId);  
  26.       
  27.     if ( (partInfo[1].block_start !=0) && (partInfo[1].block_count != 0) )   
  28.         printf("   2        %6d         %8d        %8d          0x%.2X \n",  
  29.             (partInfo[1].block_count / 2048), partInfo[1].block_start,  
  30.             partInfo[1].block_count, partInfo[1].partitionId);  
  31.       
  32.     if ( (partInfo[2].block_start !=0) && (partInfo[2].block_count != 0) )   
  33.         printf("   3        %6d         %8d        %8d          0x%.2X \n",  
  34.             (partInfo[2].block_count / 2048), partInfo[2].block_start,  
  35.             partInfo[2].block_count, partInfo[2].partitionId);  
  36.   
  37.     if ( (partInfo[3].block_start !=0) && (partInfo[3].block_count != 0) )   
  38.         printf("   4        %6d         %8d        %8d          0x%.2X \n",  
  39.             (partInfo[3].block_count / 2048), partInfo[3].block_start,  
  40.             partInfo[3].block_count, partInfo[3].partitionId);  
  41.   
  42.     return 1;  
  43. }  









本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
生活服務(wù)
熱點新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服