uboot对iNand的分区情况

x210 # fdisk -p 0partion #    size(MB)     block start #    block count    partition_Id 1           258            22374          529518          0x83 2           258           551892          529518          0x83 3           101          1081410          208824          0x83 4          3084          1290234         6316926          0x83
  • 可以看到有4个分区
  • block start表示该分区从iNand的哪个块开始
  • block count表示该分区占用的块的个数,经过计算其大小刚好等于size的大小

查看fdisk命令的源码,有如下代码

///block_start   = calc_unit(_10MB, sdInfo);block_offset    = calc_unit(CONFIG_PART_SIZE, sdInfo);partInfo[0].bootable = 0x00;partInfo[0].partitionId = 0x83;make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[0]);///block_start  += block_offset;block_offset  = calc_unit(SYSTEM_PART_SIZE, sdInfo);partInfo[1].bootable = 0x00;partInfo[1].partitionId = 0x83;make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[1]);/// block_start += block_offset;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 = 0x83;make_partitionInfo(block_start, block_offset, sdInfo, &partInfo[3]);/// 
int calc_unit(int length, SDInfo sdInfo)
{if (sdInfo.addr_mode == CHS_MODE)return ( (length / BLOCK_SIZE / sdInfo.unit + 1 ) * sdInfo.unit);elsereturn ( (length / BLOCK_SIZE) );
}

代码中对块设备进行了4次分区

此处是与块设备的扇区定位方式有关,涉及到LBA_MODE和CHS_MODE感兴趣可以去研究,我们这里iNand小于8.4G,属于CHS_MODE,所以calc_unit函数会把传入的参数进行计算后得到实际大小,故实际扇区分配到的大小与参数给定的大小有一定偏差。我这里sdInfo.unit大小为7458

第一次的partInfo[0]对应于第一个分区起始地址为_10MB(10*1024*1024)作为calc_unit函数参数得到的值。10*1024*1024/512/7458=2(忽略小数)。(2+1)*7458=22374。

第二次的partInfo[1]对应于第二个分区,它接着上一个分区开始存放。

。。。

再看fastboot命令打印出的信息

x210 # fastboot
[Partition table on MoviNAND]
ptn 0 name='bootloader' start=0x0 len=N/A (use hard-coded info. (cmd: movi))
ptn 1 name='kernel' start=N/A len=N/A (use hard-coded info. (cmd: movi))
ptn 2 name='ramdisk' start=N/A len=0x300000(~3072KB) (use hard-coded info. (cmd: movi))
ptn 3 name='config' start=0xAECC00 len=0x1028DC00(~264759KB)                               分区1
ptn 4 name='system' start=0x10D7A800 len=0x1028DC00(~264759KB)                                 分区2
ptn 5 name='cache' start=0x21008400 len=0x65F7000(~104412KB)                               分区3
ptn 6 name='userdata' start=0x275FF400 len=0xC0C6FC00(~3158463KB)                          分区4

这里的ptn不要与分区搞混

ptn3的起始地址为0xAECC00,也就是block22374刚还对于分区1,它的name=‘config’与源码中的CONFIG_PART_SIZE中的CONFIG相对应

。。。

值得注意的是分区2是system分区,也就是根文件系统的所在,所以在uboot给kernel传参时的bootargs里有一个'root=mmcblk0p2 rw'

查看fastboot的源码,有如下代码

#if defined(CONFIG_FUSED)/* FW BL1 for fused chip */strcpy(ptable[pcount].name, "fwbl1");ptable[pcount].start = 0;ptable[pcount].length = 0;ptable[pcount].flags = FASTBOOT_PTENTRY_FLAGS_USE_MOVI_CMD;pcount++;
#endif/* Bootloader */strcpy(ptable[pcount].name, "bootloader");ptable[pcount].start = 0;ptable[pcount].length = 0;ptable[pcount].flags = FASTBOOT_PTENTRY_FLAGS_USE_MOVI_CMD;pcount++;/* Kernel */strcpy(ptable[pcount].name, "kernel");ptable[pcount].start = 0;ptable[pcount].length = 0;ptable[pcount].flags = FASTBOOT_PTENTRY_FLAGS_USE_MOVI_CMD;pcount++;/* Ramdisk */strcpy(ptable[pcount].name, "ramdisk");ptable[pcount].start = 0;ptable[pcount].length = 0x300000;ptable[pcount].flags = FASTBOOT_PTENTRY_FLAGS_USE_MOVI_CMD;pcount++;/* Config */get_mmc_part_info("0", 1, &start, &count, &pid);if (pid != 0x83)goto part_type_error;strcpy(ptable[pcount].name, "config");ptable[pcount].start = start * CFG_FASTBOOT_SDMMC_BLOCKSIZE;ptable[pcount].length = count * CFG_FASTBOOT_SDMMC_BLOCKSIZE;ptable[pcount].flags = FASTBOOT_PTENTRY_FLAGS_USE_MMC_CMD;pcount++;/* System */get_mmc_part_info("0", 2, &start, &count, &pid);if (pid != 0x83)goto part_type_error;strcpy(ptable[pcount].name, "system");ptable[pcount].start = start * CFG_FASTBOOT_SDMMC_BLOCKSIZE;ptable[pcount].length = count * CFG_FASTBOOT_SDMMC_BLOCKSIZE;ptable[pcount].flags = FASTBOOT_PTENTRY_FLAGS_USE_MMC_CMD;pcount++;/* Cache */get_mmc_part_info("0", 3, &start, &count, &pid);if (pid != 0x83)goto part_type_error;strcpy(ptable[pcount].name, "cache");ptable[pcount].start = start * CFG_FASTBOOT_SDMMC_BLOCKSIZE;ptable[pcount].length = count * CFG_FASTBOOT_SDMMC_BLOCKSIZE;ptable[pcount].flags = FASTBOOT_PTENTRY_FLAGS_USE_MMC_CMD;pcount++;/* Data */get_mmc_part_info("0", 4, &start, &count, &pid);if (pid != 0x83)goto part_type_error;strcpy(ptable[pcount].name, "userdata");ptable[pcount].start = start * CFG_FASTBOOT_SDMMC_BLOCKSIZE;ptable[pcount].length = count * CFG_FASTBOOT_SDMMC_BLOCKSIZE;ptable[pcount].flags = FASTBOOT_PTENTRY_FLAGS_USE_MMC_CMD;pcount++;

可以看出config、system、cache、data这4个都调用get_mmc_part_info来获取分区信息,得到对应分区的起始块和块大小等数据

  • SD/iNand本身都是由一个一个的扇区组成的,回忆裸机中讲到的210的启动时,BL1在SD卡的1扇区开始往后存放,SD卡的0扇区是不用的。SD卡的0扇区是用来放置MBR的。
  • MBR就是用来描述块设备的分区信息的,事先定义了一个通用的数据结构来描述块设备的分区,我们只要按照这个标准将分区信息写入MBR中即可对该设备完成分区。MBR默认就是在块设备的第0个扇区上存放的。
  • 在uboot和内核之间iNand设备的分区信息是靠iNand自己传递的,所以uboot不用给内核传参时传递分区表信息。
  • 如果开发板用的是nandFlash的话,分区表一般是在内核中自己用代码构建的。所以nand版本的内核移植的时候一般都需要去移植更改nand分区表。

另外需要注意的是在uboot下使用movi等命令时,参数uboot和kernel等仅仅只是用字符串匹配对应的地址,不要与分区搞混

另外在uboot的common/cmd_movi.c中init_raw_area_table函数里构建了raw原始区域表

#if defined(CONFIG_EVT1)#if defined(CONFIG_FUSED)/* image 0 should be fwbl1 */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);#endif
#endif/* image 1 should be bl2 */
#if defined(CONFIG_EVT1)#if defined(CONFIG_FUSED)image[1].start_blk = image[0].start_blk + MOVI_FWBL1_BLKCNT;#elseimage[1].start_blk = (eFUSE_SIZE/MOVI_BLKSIZE);#endif
#elseimage[1].start_blk = capacity - (eFUSE_SIZE/MOVI_BLKSIZE) -MOVI_BL1_BLKCNT;
#endifimage[1].used_blk = MOVI_BL1_BLKCNT;image[1].size = SS_SIZE;image[1].attribute = 0x1;strcpy(image[1].description, "u-boot parted");dbg("bl1: %d\n", image[1].start_blk);/* image 2 should be environment */
#if defined(CONFIG_EVT1)image[2].start_blk = image[1].start_blk + MOVI_BL1_BLKCNT;
#elseimage[2].start_blk = image[1].start_blk - MOVI_ENV_BLKCNT;
#endifimage[2].used_blk = MOVI_ENV_BLKCNT;image[2].size = CFG_ENV_SIZE;image[2].attribute = 0x10;strcpy(image[2].description, "environment");dbg("env: %d\n", image[2].start_blk);/* image 3 should be bl2 */
#if defined(CONFIG_EVT1)image[3].start_blk = image[2].start_blk + MOVI_ENV_BLKCNT;
#elseimage[3].start_blk = image[2].start_blk - MOVI_BL2_BLKCNT;
#endifimage[3].used_blk = MOVI_BL2_BLKCNT;image[3].size = PART_SIZE_BL;image[3].attribute = 0x2;strcpy(image[3].description, "u-boot");dbg("bl2: %d\n", image[3].start_blk);/* image 4 should be kernel */
#if defined(CONFIG_EVT1)image[4].start_blk = image[3].start_blk + MOVI_BL2_BLKCNT;
#elseimage[4].start_blk = image[3].start_blk - MOVI_ZIMAGE_BLKCNT;
#endifimage[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 */
#if defined(CONFIG_EVT1)image[5].start_blk = image[4].start_blk + MOVI_ZIMAGE_BLKCNT;
#elseimage[5].start_blk = image[4].start_blk - MOVI_ROOTFS_BLKCNT;
#endifimage[5].used_blk = MOVI_ROOTFS_BLKCNT;image[5].size = PART_SIZE_ROOTFS;image[5].attribute = 0x8;strcpy(image[5].description, "rfs");dbg("rfs: %d\n", image[5].start_blk);for (i=6; i<15; i++) {raw_area_control.image[i].start_blk = 0;raw_area_control.image[i].used_blk = 0;}

这个表应该是仅用于uboot内部的一个区域表

x210:iNand分区情况相关推荐

  1. 如何查看磁盘分区情况

    快捷键Win+X,选择磁盘分区管理,就可以看到自己的分区情况. 我这是装Ubuntu双系统的分区. 这里涉及到计算机组成原理和操作系统的知识点,顺便带大家复习一下. 首先磁盘0表示下标为0的磁盘,因为 ...

  2. linux 磁盘分区情况6,Linux磁盘分区介绍

    查看磁盘使用情况 [root@VM_176_224_centos ~]# fdisk  -l    #查看磁盘使用情况 Disk /dev/vda: 21.5 GB, 21474836480 byte ...

  3. OSError: [Errno 28] No space left on device以及查看系统分区情况

    在Linux服务器运行程序的时候,运行完一个epoch后就会出现这个报错OSError: [Errno 28] No space left on device. 大致意思就是说系统的空间不足. 查看系 ...

  4. 查找mysql的分区情况_MySQL 5.5 查看分区表的执行计划

    --创建测试表 mysql> CREATE TABLE trb1 (id INT, name VARCHAR(50), purchased DATE) ->     PARTITION B ...

  5. android如何查看分区信息,【Android】Android如何查看分区情况

    不同的手机分区不相,在adb shell下可以使用linux命令进行很多分区操作 查看块设备列表ls -l /dev/block 查看各分区名称ls -l /dev/block/platform/[s ...

  6. SPI FLASH 分区情况

  7. linux dev sda 不存在,我查看linux分区情况为什么不是dev/hda而是dev/sda阿

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 [root@localhost ~]# fdisk -l Disk /dev/sda: 40.0 GB, 40020664320 bytes 255 he ...

  8. S5PV210 Uboot开发与移植01:Uboot概述

    目录 1. uboot概述 1.1 uboot的版本 1.1.1 官方版本 1.1.2 SoC厂商版本 1.1.3 开发板厂商版本 1.2 uboot功能框架 1.3 uboot生命周期 2. ubo ...

  9. 文件系统管理 之 Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍...

    作者:北南南北 来自:LinuxSir.Org 提要:Linux 磁盘分区表.文件系统的查看.统计的工具很多,有些工具是多功能的,不仅仅是查看磁盘的分区表,而且也能进行磁盘分区的操作:但在本文,我们只 ...

最新文章

  1. 读书笔记2013第13本:《怎样解题》
  2. 李理:为什么说人工智能可以实现?
  3. IC/FPGA 技术交流
  4. Lua和C++交互总结(很详细)
  5. 【Let‘s Go】Go语言入门篇
  6. 集中式服务器模型无线网络,认知无线电中次用户在重试排队和共享服务器模型下的均衡止步策略...
  7. Apache james 2.3.2.1启动失败换成2.3.2版本就好
  8. Windows域策略 设置客户端服务启动状态 【全域策略生效】
  9. Android 开机自启动应用
  10. clover删除多余引导_[转载]EFI引导如何去掉多余的这个clover启动项
  11. pulse 去马赛克软件_一款号称能去马赛克的软件,却在面对游戏角色时“翻了车”...
  12. 网络安全协议—SSL
  13. 宏文件下载_新星邮件速递专家2021免费版-新星邮件速递专家2021正式版下载
  14. [转载]使用 Apache Geronimo 和 POJO 构建 SOA 框架
  15. 时制转换时的电话账单
  16. UILabel根据字数计算高度,宽度,行数
  17. Ubuntu16.04设置并查看DNS
  18. fft理解-cooley turkey
  19. mysql商品查询_MYSQL——怎么一个sql语句查询出用户和用户商品的列表啊
  20. Flink Connectors

热门文章

  1. Java菜鸟浅谈OCR
  2. 北大青鸟集团java_欢迎北大青鸟集团高级副总裁范一民先生莅临我校视察指导...
  3. 数据库sql去重操作 + 人大金仓案例
  4. linux桌面融合,教育桌面云-融合版
  5. 关于中华人民共和国网络安全法及本人免责声明
  6. Linux samba服务搭建
  7. ZZULIOJ 1089:阶乘的最高位(C语言)
  8. python 图片拼接_使用Python拼接多张图片
  9. 获奖名单公布|香港BlockBooster x Moonbeam黑客松圆满收官
  10. 优秀网页翻译:编写自己的终端模拟器