linux ubi 分区,ubi卷重分区及卷创建流程解析

这篇博客详细解析了Linux UBI分区的创建过程,包括加载分区配置表、重分区以及卷创建流程。首先,分区配置表被加载并解析以确定分区数。接着,通过调用`repartition()`函数进行重分区,该过程涉及卷配置解析、卷表检测以及根据检查结果进行全部、局部或不进行重分区的操作。在卷创建阶段,针对每个卷进行初始化、分配和注册等步骤,确保卷正确地挂载到ubi设备。最后,对于需要自动调整大小的卷,还会执行resize操作。
摘要由CSDN通过智能技术生成

按照nand方案,ubi卷创建过程分析如下:

1、载入分区配置表

用下载工具下载编译镜像时,完成下载功能代码之后,首先会载入分区配置表,作为一个打包的packet发送到手机端。按照packet的封装方式:

unsigned short size = pakcet->packet_body.size;

unsigned short *data = (unsigned short *)

(pakcet->packet_body.content);

获取包内容:data

获取分区数:total_partition_num

=

size/(MAX_PARTITION_NAME_SIZE +

PARTITION_SIZE_LENGTH);

可以看出封装包内容由一个纯粹的列表构成:分区名+分区大小

所以总的分区数就可以确定下来。

2、重分区

接下来调用重分区函数:

repartition(void* vol_cfg,

unsigned short total_vol_num);

其中,

vol_cfg = data;

total_vol_num = total_partition_num;

根据data和分区数total_partition_num,检测原有的卷配置,首先分配了total_partition_num个卷:

fdl_ubi_vtbl_t *vtbl=NULL;

vtbl = malloc(total_vol_num *

sizeof(fdl_ubi_vtbl_t));

2.1、解析卷配置

调用_parse_volume_cfg(vol_cfg, total_vol_num,

vtbl);

此函数实际上是根据vol_cfg来填充vtbl,卷表主要包含三个元素:

typedef struct{

char

name[UBI_VOL_NAME_MAX+1];

long

long size;//size in byte

int

autoresize;

}fdl_ubi_vtbl_t;

因此,此函数就是根据分区表来填充相应的位域;

size = *(unsigned long *)(vol_cfg+38*(i+1)-2);

vtbl[i].name[j] = *(vol_cfg+38*i+j)

& 0xFF;//j=1~36,最大卷名长度

autoresize 由AUTO_RESIZE_FLAG确定。

2.2、卷表检测

_vtbl_check(vtbl, total_vol_num,

&remove, &create);

卷表检测需要决定出:

全部重分区:卷表记录与NAND存储卷表完全不一致

局部重分区:卷表记录与NAND存储卷表部分一致

不进行重分区:卷表记录与NAND存储卷表完全一致

structubi_device{

struct cdev cdev;

struct device dev;

int ubi_num;

char ubi_name[sizeof(UBI_NAME_STR)+5];

int vol_count;

structubi_volume*volumes[UBI_MAX_VOLUMES+UBI_INT_VOL_COUNT];

……

int rsvd_pebs;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值