目录

一、需要实现多分区的原因

二、Fatfs多分区的实现

三、多分区的读写

Fatfs版本:R0.12c

Fatfs下载地址:http://elm-chan.org/fsw/ff/00index_e.html

一、需要实现多分区的原因

    因工作项目需要,需要读写U盘启动盘,而启动盘一般最少会被划分成2个分区,一个是装放镜像的磁盘,另一个是EFI分区用于引导程序用于引导安装镜像文件。并且启动盘的分区形式主要有GPT、与MBR的分区形式,目前主流启动盘分区形式为GPT形式,但是由于当前版本的Fatfs仅支持MBR分区格式(解决问题后才发现,目前最新的Fatfs的版本为0.14a,从0.14版本开始起已经支持了GPT形式的分区了......)。所以不得不将原来GPT形式的启动盘改成MBR格式的启动盘。

更改启动盘分区格式方法:

  • 使用DiskGenius 直接将GPT分区形式转换成MBR形式(暂时未测试过转化后EFI是否能够正常运行)
  • 使用Ventoy制作MBR形式的启动盘,然后将VTOYEFI盘中的文件替换成自定义的EFI(经测试,可以正常运行引导程序)

二、Fatfs多分区的实现

(1)这是官网文档中的卷管理的解释:

winhex磁盘镜像分割文件_winhex磁盘镜像分割文件

(2) Fatfs配置多分区步骤 (仅说明FatfsR0.12c版本,最新的Fatfs版本配置方面有较大的改动,但可以提供借鉴)

ffconf.h文件中:

  • _VOLUMES   分区数量默认是1,修改成你想要的逻辑分区的数量(卷数)
  • _MULTI_PARTITION  默认是0,设置成1。(开启多分区)
  • _FS_RPATH  默认是0,需要设置成  >= 1 (使能相对路径函数)

注:最好将 Fatfs的 _FS_EXFAT 也使能了,因为由Ventoy创建的第一个分区为Exfat格式,根据个人需求进行更改

 

在自定的C文件中添加:(根据需求更改,上图说明的十分清楚)

PARTITION VolToPart[_VOLUMES] = {
    {0, 1},     /* "0:" ==> 1st partition on physical drive 0 */
    {0, 2},     /* "1:" ==> 2nd partition on physical drive 0 */
};

三、多分区的读写

由上面的内容可以得知,我们将一个物理驱动盘分了两个逻辑分区,而多分区的读写,可以用以下两种方式:

  • 使用一个FATFS 对象,然后要对不同分区进行读写操作的时候,直接重新挂载就行了
FATFS SDFatFS;    /* File system object for SD logical drive */

/* 挂载分区0 */
 f_mount(&SDFatFS, "0: ", 1);
//......对分区0进行读写操作



/* 挂载分区1 */
 f_mount(&SDFatFS, "1: ", 1);
//......对分区1进行读写操作
  • 使用多个Fatfs对象,对不同分区操作时,直接对不同Fatfs对象进行读写
FATFS SDFatFS[2];    /* File system object for SD logical drive */


 f_mount(&SDFatFS[0], "0: ", 1);
 f_mount(&SDFatFS[1], "1: ", 1);