【u-boot】u-boot的分区支持

一、源码结构解读

在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()的时候,函数调用链如下:

相关推荐
magic334165632 天前
ESP32S3开发环境介绍和创建工程
vscode·c·头文件
charlie1145141912 天前
嵌入式现代C++工程实践——第10篇:HAL_GPIO_Init —— 把引脚配置告诉芯片的仪式
开发语言·c++·stm32·单片机·c
charlie1145141913 天前
嵌入式Linux模块学习——insmod 底层全流程解剖:从用户命令到内核内存
linux·c·嵌入式linux
charlie1145141913 天前
嵌入式C++教程实战之Linux下的单片机编程(9):HAL时钟使能 —— 不开时钟,外设就是一坨睡死的硅
linux·开发语言·c++·单片机·嵌入式硬件·c
charlie1145141913 天前
嵌入式Linux模块开发——struct module 深度解析:内核模块的核心数据结构
linux·开发语言·数据结构·c
charlie1145141914 天前
通用GUI编程技术——图形渲染实战(二十七)——坐标变换与矩阵:三级坐标系
c++·学习·c·图形渲染·win32
Trouvaille ~5 天前
【MySQL篇】从零开始:安装与基础概念
linux·数据库·mysql·ubuntu·c·教程·基础入门
洛水水5 天前
io_uring 深度解析
c·异步io·iouring
REDcker5 天前
Android Bionic Libc 原理与实现综述
android·c++·c·ndk·native·bionic
charlie1145141915 天前
通用GUI编程技术——图形渲染实战(二十四)——GDI Region与裁切:不规则窗口与可视化控制
c++·windows·学习·c·图形渲染·win32