一、源码结构解读
在u-boot源码中对分区表的支持代码实现在/disk
目录中,原生目录结构如下:

特定芯片厂家将会开发自己的分区类型,这时候这些文件也放置到/disk
目录中。
使用如下命令:
plain
part list mmc 0
可查看具体设备的所有分区信息(包括分区类型),上述示例是查看mmc 0
设备的分区类型。例如:

u-boot支持分区类型如下表所示:
分区类型 | 源码文件 | 详细描述 |
---|---|---|
DOS/MBR | part_dos.c | 解析 DOS/MBR (Master Boot Record) 分区表。 |
GPT | part_efi.c | 解析 GPT (GUID Partition Table),即 EFI/UEFI 分区格式。 |
ISO (CD-ROM) | part_iso.c | 解析 ISO 9660 分区(光盘镜像格式)。 |
Mac | part_mac.c/part_mac.h | 解析 Apple Partition Map (APM)。 |
Amiga | part_amiga.c/part_amiga.h | 解析 Amiga Rigid Disk Block (RDB) 分区表格式。 |
二、分区类型的实现
在u-boot中,当需要实现分区类型的时候,需要使用U_BOOT_PART_TYPE
声明一个新的U-Boot分区类型驱动。例如dos
分区类型的实现:
c
U_BOOT_PART_TYPE(dos) = {
.name = "DOS",
.part_type = PART_TYPE_DOS,
.max_entries = DOS_ENTRY_NUMBERS,
.get_info = part_get_info_ptr(part_get_info_dos),
.print = part_print_ptr(part_print_dos),
.test = part_test_dos,
};
U_BOOT_PART_TYPE
宏的实现本质是创建struct part_driver
类型的全局结构变量,并将其放置到特定段中。struct part_drvier
实现如下:
c
struct part_driver {
const char *name;
int part_type;
const int max_entries; /* maximum number of entries to search */
/**
* get_info() - 获取有关分区的信息
*
* @dev_desc: Block device descriptor
* @part: Partition number (1 = first)
* @info: Returns partition information
*/
int (*get_info)(struct blk_desc *dev_desc, int part,
disk_partition_t *info);
/**
* print() - 打印分区表信息
*
* @dev_desc: Block device descriptor
*/
void (*print)(struct blk_desc *dev_desc);
/**
* test() - Test if a device contains this partition type
*
* @dev_desc: Block device descriptor
* @return 0 if the block device appears to contain this partition
* type, -ve if not
*/
int (*test)(struct blk_desc *dev_desc);
};
在创建特定分区表驱动的时候需要填充上述结构中的组成元素。
->print
回调的调用发生在执行part_print()
的时候,函数调用链如下图所示:

->get_info
回调的调用发生在执行part_get_info_by_name_option()
的时候,函数调用链如下:
