久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > FS4412中uboot對emmc的(de)分區解析

FS4412中uboot對emmc的分區(qu)解析 時間:2017-11-27   ;   來源:未知

Author:runner 2017.10.15

聲明

平臺: fs4412 (Samsung exynos4412)

u-boot版本: u-boot-2010.03-FS4412

簡述

在FS4412的(de)(de)開發(fa)中,uboot通(tong)過movi、fdisk、fastboot等命令對emmc做了相(xiang)應(ying)的(de)(de)分(fen)(fen)區(qu)操作,這里(li)主要(yao)分(fen)(fen)析,這些命令是(shi)如何對emmc進行分(fen)(fen)區(qu)的(de)(de),每條命令使用的(de)(de)分(fen)(fen)區(qu)之(zhi)間(jian)有什么聯系和區(qu)別。

 

uboot對emmc分區分析

整個u-boot源碼的(de)入(ru)口是在u-boot-2010.03-FS4412/cpu/arm_cortexa9/start.S,對于該(gai)文(wen)件(jian)中所做(zuo)的(de)具體工作,我們這里進行分析,主要看該(gai)文(wen)件(jian)中調用(yong)emmc初(chu)始化(hua)的(de)位置:

圖中(zhong)提示的start_armboot函(han)(han)數(shu)(shu)的實現是(shi)在(zai)u-boot-2010.03-FS4412/lib_arm/board.c中(zhong);當然我們的目的肯定不是(shi)只(zhi)簡單(dan)的找到(dao)這(zhe)個(ge)函(han)(han)數(shu)(shu)就(jiu)夠了,我們需要了解這(zhe)個(ge)函(han)(han)數(shu)(shu)中(zhong)還調用了一個(ge)關鍵(jian)的函(han)(han)數(shu)(shu)接口去初始化emmc,如(ru)下:

這(zhe)里(li)的(de)(de)mmc_initialize函(han)(han)數的(de)(de)具(ju)體(ti)實(shi)(shi)現是(shi)在(zai)u-boot-2010.03-FS4412/drivers/mmc/mmc.c中;那么該(gai)函(han)(han)數的(de)(de)主要目(mu)的(de)(de)實(shi)(shi)際上是(shi)調用(yong)(yong)mmc_init,mmc_init又是(shi)如(ru)何(he)實(shi)(shi)現的(de)(de)?我(wo)(wo)們接著往下(xia)追,mmc_init函(han)(han)數的(de)(de)實(shi)(shi)現還是(shi)在(zai)這(zhe)個文件中。我(wo)(wo)們的(de)(de)目(mu)的(de)(de)是(shi)找(zhao)到mmc被分區的(de)(de)部分為大家(jia)解讀,所以對于這(zhe)個函(han)(han)數其(qi)它部分就不做贅(zhui)述,這(zhe)里(li)只看該(gai)函(han)(han)數后(hou)調用(yong)(yong)的(de)(de)mmc_startup,如(ru)下(xia):

mmc_startup函數的實(shi)現也(ye)是在(zai)上(shang)述文件中,該(gai)函數調用init_raw_area_table接口實(shi)現對emmc的分區操作:

init_raw_area_table函數的實現是(shi)在u-boot-2010.03-FS4412/common/cmd_movi.c中。具體實現如(ru)下:

 C++ Code 

int init_raw_area_table (block_dev_desc_t *dev_desc)

{

     struct mmc *host = find_mmc_device(dev_desc->dev);

 

    /* when last block does not have raw_area definition. */

    if (raw_area_control.magic_number != MAGIC_NUMBER_MOVI)

    {

        int  i = 0;

        member_t *image;

        u32 capacity;

 

        dbg("The host name is %s\n", host->name);

 

        if(host->high_capacity)

        {

            capacity = host->capacity;

        }

        else

        {

            capacity = host->capacity * (host->read_bl_len / MOVI_BLKSIZE);

        }

 

        dbg("Warning: cannot find the raw area table(%p) %08x\n",

            &raw_area_control, raw_area_control.magic_number);

 

        /* add magic number */

        raw_area_control.magic_number = MAGIC_NUMBER_MOVI;

 

        /* init raw_area will be 16MB */

        raw_area_control.start_blk = 16 * 1024 * 1024 / MOVI_BLKSIZE;

        raw_area_control.total_blk = capacity;

        raw_area_control.next_raw_area = 0;

        strcpy(raw_area_control.description, "initial raw table");

 

        image = raw_area_control.image;

 

        /* image 0 should be fwbl1 */

        if(strcmp(host->name, "S5P_MSHC4") == 0)

     ;       image[0].start_blk = 0;

        else

            image[0].start_blk = (eFUSE_SIZE / MOVI_BLKSIZE);

 

        image[0].used_blk = MOVI_FWBL1_BLKCNT;

        image[0].size = FWBL1_SIZE;

         image[0].attribute = 0x0;

        strcpy(image[0].description, "fwbl1");

        dbg("fwbl1: %d\n", image[0].start_blk);

 

     ;   /* image 1 should be bl2 */

        image[1].start_blk = image[0].start_blk + image[0].used_blk;

         image[1].used_blk = MOVI_BL2_BLKCNT;

        image[1].size = BL2_SIZE;

        image[1].attribute = 0x3;

        strcpy(image[1].description, "bl2");

        dbg("bl2: %d\n", image[1].start_blk);

 

#if 0

        /* image 2 should be uboot */

        image[2].start_blk = image[1].start_blk + image[1].used_blk;

        image[2].used_blk = MOVI_UBOOT_BLKCNT;

        image[2].size = PART_SIZE_UBOOT;

         image[2].attribute = 0x2;

        strcpy(image[2].description, "bootloader");

        dbg("u-boot: %d\n", image[2].start_blk);

#else

        /*BL1,BL2,u-boot have been combined together when compiling for EMMC*/

        if(strcmp(host->name, "S5P_MSHC4") == 0)

            image[2].start_blk = 0;

        else

            image[2].start_blk = (eFUSE_SIZE / MOVI_BLKSIZE);

 

        image[2].used_blk = MOVI_FWBL1_BLKCNT + MOVI_UBOOT_BLKCNT + MOVI_BL2_BLKCNT;

         image[2].size = PART_SIZE_UBOOT + FWBL1_SIZE + BL2_SIZE;

        image[2].attribute = 0x2;

        strcpy(image[2].description, "bootloader");

        dbg("u-boot: %d\n";, image[2].start_blk);

#endif

        /* image 3 should be environment */

     ;   image[3].start_blk = (544 * 1024) / MOVI_BLKSIZE;

        image[3].used_blk = MOVI_ENV_BLKCNT;

        image[3].size = CONFIG_ENV_SIZE;

        image[3].attribute = 0x10;

        strcpy(image[3].description, "environment");

        dbg("env: %d\n", image[3].start_blk);

 

        /* image 4 should be kernel */

        image[4].start_blk = image[3].start_blk + image[3].used_blk;

        image[4].used_blk = MOVI_ZIMAGE_BLKCNT;

        image[4].size = PART_SIZE_KERNEL;

         image[4].attribute = 0x4;

        strcpy(image[4].description, "kernel");

        dbg("knl: %d\n", image[4].start_blk);

 

        /* image 5 should be RFS */

        image[5].start_blk = image[4].start_blk + image[4].used_blk;

     ;   image[5].used_blk = MOVI_ROOTFS_BLKCNT;

        image[5].size = PART_SIZE_ROOTFS;

        image[5].attribute = 0x8;

        strcpy(image[5].description, "ramdisk");

        dbg("rfs: %d\n", image[5].start_blk);

 

#ifdef CONFIG_RECOVERY

        /* image 6 should be Recovery */

        image[6].start_blk = image[5].start_blk + image[5].used_blk;

        image[6].used_blk = RAW_AREA_SIZE / MOVI_BLKSIZE - image[5].start_blk;

        image[6].size = image[6].used_blk * MOVI_BLKSIZE;

        image[6].attribute = 0x6;

        strcpy(image[6].description, "Recovery");

        dbg("recovery: %d\n", image[6].start_blk);

#endif

 

 

     ;   /* image 7 should be disk */

 ;       image[7].start_blk = RAW_AREA_SIZE / MOVI_BLKSIZE;

        image[7].size = capacity - RAW_AREA_SIZE;

        image[7].used_blk = image[7].size / MOVI_BLKSIZE;

        image[7].attribute = 0xff;

 ;       strcpy(image[7].description, "disk");

     ;   dbg("disk: %d\n", image[7].start_blk);

        for (i = 8; i < 15; i++)

        {

      &nbsp;     raw_area_control.image[i].start_blk = 0;

      &nbsp;   &nbsp; raw_area_control.image[i].used_blk = 0;

        }

 

 

    }

 

    return 0;

}

 

 

可以看到:

image[0] 存放的是(shi)BL1,start_blk = 0 / 1,used_blk = (8*1024)/512

image[1] 存放的是BL2,start_blk = image[0].start_blk + image[0].used_blk; used_blk = (16*1024)/512

image[2] 存放的是Bootloader,

image[3] 存放的是(shi)environment(環境變量)

image[4] 存放的是(shi)kernel

image[5] 存放(fang)的是(shi)ramdisk

image[6] 存放的是Recovery

image[7] 存放的是disk(即文件系(xi)統)

 

后面的(de)(de)幾個分區的(de)(de)起始地址和使用地址,都是通過上面一一偏(pian)移得到的(de)(de),有興趣(qu)的(de)(de)同學(xue)可以自己查閱源碼進(jin)行計(ji)算。這樣(yang)的(de)(de)話(hua),我們就知道了(le)平時(shi)燒寫(xie)的(de)(de)kernel鏡像或者ramdisk鏡像在emmc中存放(fang)的(de)(de)地址空間了(le)。

 

fdisk命令分區分析

我們知道使(shi)用fdisk命(ming)令(ling)對(dui)emmc 分區時,命(ming)令(ling)格式如(ru)下:

fdisk -c 0 300 1024 300

或者使用(yong)fdisk命(ming)令查詢(xun)分區(qu)大小(xiao):

fdisk -p 0

那么(me)這四個分(fen)區分(fen)別代表什么(me)意思呢?要搞清楚這個問題,我們(men)就要去看(kan)fdisk命令(ling)的(de)(de)實(shi)(shi)現(xian)過(guo)程(cheng)了(le),fdisk命令(ling)在uboot源碼中實(shi)(shi)現(xian)的(de)(de)位置(zhi)是在common/cmd_mmc_fdisk.c中。在該文件中對(dui)于這個命令(ling)其它實(shi)(shi)現(xian)的(de)(de)部(bu)分(fen)我不做贅述,直接看(kan)具體分(fen)區的(de)(de)操作,函數(shu)名稱為:make_mmc_partition , 實(shi)(shi)現(xian)如下:

 C++ Code 

 

int make_mmc_partition(int total_block_count, unsigned char *mbr, int flag, char *argv[])

{

    unsigned int       &nbsp;block_start = 0, block_offset;

 

  &nbsp; SDInfo      sdInfo;

  &nbsp; PartitionInfo   partInfo[4];

 

  &nbsp; ///////////////////////////////////////////////////////////

    memset((unsigned char *)&sdInfo, 0x00, sizeof(SDInfo));

 

&nbsp;   ///////////////////////////////////////////////////////////

    get_SDInfo(total_block_count, &sdInfo);

 

    ///////////////////////////////////////////////////////////

    // ??? Unit??§?????????

&nbsp;   block_start = calc_unit(DISK_START, sdInfo);

    block_offset    = calc_unit(SYSTEM_PART_SIZE, sdInfo);

    /* modify by cym 20131206 */

#if 0

    block_offset    = calc_unit(SYSTEM_PART_SIZE, sdInfo);

 

    printf("block_start = %d, block_offset = %d\n", block_start, block_offset);

#else

    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);

#endif

    /* end modify */

 

 

    partInfo[0].bootable    = 0x00;

    partInfo[0].partitionId = 0x83;

 

    make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[0]);

 

    ///////////////////////////////////////////////////////////

    block_start += block_offset;

    /* modify by cym 20131206 */

#if 0

     if (strcmp(argv[2], "1") == 0)// TF card

        block_offset = calc_unit(_300MB, sdInfo);

    else

        block_offset = calc_unit(USER_DATA_PART_SIZE, sdInfo);

#else

    if (flag)

         block_offset = calc_unit((unsigned long long)

        &nbsp;                        simple_strtoul(argv[4], NULL, 0) * 1024 * 1024, sdInfo);

    else

    {

&nbsp;       if (strcmp(argv[2], "1") == 0)// TF card

            block_offset = calc_unit(_300MB, sdInfo);

        else

          &nbsp; block_offset = calc_unit(USER_DATA_PART_SIZE, sdInfo);

    }

#endif

    /* end modify */

 

 

    partInfo[1].bootable    = 0x00;

    partInfo[1].partitionId = 0x83;

 

    make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[1]);

 

    ///////////////////////////////////////////////////////////

    block_start += block_offset;

    /* modify by cym 20131206 */

#if 0

   ; block_offset = calc_unit(CACHE_PART_SIZE, sdInfo);

#else

    if(flag)

        block_offset =

              calc_unit((unsigned long long)

          &nbsp;           simple_strtoul(argv[5], NULL, 0) * 1024 * 1024, sdInfo);

    else

        block_offset = calc_unit(CACHE_PART_SIZE, sdInfo);

#endif

    /* end modify */

 

 

  &nbsp; 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;

 

&nbsp;   partInfo[3].bootable    = 0x00;

    partInfo[3].partitionId = 0x0C;

 

    make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[3]);

 

    ///////////////////////////////////////////////////////////

     memset(mbr, 0x00, sizeof(*mbr) * 512); // liang, clean the mem again

    mbr[510] = 0x55;

    mbr[511] = 0xAA;

 

  &nbsp; encode_partitionInfo(partInfo[0], &mbr[0x1CE]);

  &nbsp; encode_partitionInfo(partInfo[1], &mbr[0x1DE]);

&nbsp;   encode_partitionInfo(partInfo[2], &mbr[0x1EE]);

    encode_partitionInfo(partInfo[3], &mbr[0x1BE]);

 

    return 0;

}

 

從上(shang)述代(dai)碼中(zhong)我們可以看到,在(zai)執(zhi)行(xing)fdisk命令時(shi)打印的(de)四個分(fen)(fen)區(qu)(qu)實際(ji)上(shang)就(jiu)是(shi)(shi)partInfo的(de)四個元素,partInfo[0]代(dai)表的(de)是(shi)(shi)system分(fen)(fen)區(qu)(qu),partInfo[1]代(dai)表的(de)是(shi)(shi)userdata分(fen)(fen)區(qu)(qu), partInfo[2]代(dai)表的(de)是(shi)(shi)cache分(fen)(fen)區(qu)(qu),剩下的(de)partInfo[3]是(shi)(shi)fat分(fen)(fen)區(qu)(qu)。所以在(zai)fdisk命令執(zhi)行(xing)完成后,出現的(de)四個分(fen)(fen)區(qu)(qu)1、2、3、4依(yi)次為fat、system、userdata、cache。

 

fastboot命令(ling)分析

我們在uboot狀態下執行fastboot命令(ling)的(de)(de)時候顯(xian)示的(de)(de)8個分(fen)區信息,跟前面咱們看(kan)到(dao)幾(ji)(ji)個分(fen)區又是什么樣的(de)(de)關系(xi)呢(ni)?實際上這里的(de)(de)bootloader、kernel、ramdisk、Recovery就是前面提到(dao)的(de)(de)那幾(ji)(ji)個分(fen)區,由uboot在啟動時調用mmc_init實現的(de)(de)。而后面的(de)(de)system、userdata、cache、fat四(si)個分(fen)區統稱為disk分(fen)區,同樣也是fdisk命令(ling)實現的(de)(de)分(fen)區信息。

上一篇:網絡編程中的并發控制

下一篇:Linux getopt函數詳解

熱點文章(zhang)推薦
華清學員就業榜單
高薪(xin)學員經驗分享(xiang)
熱(re)點新聞(wen)推薦(jian)
前臺(tai)專線:010-82525158 企業培(pei)訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,,京公海網安備11010802025203號

回到頂部