rtems 文件系统(15)-jffs2 研究(1)

本文详细介绍了在RTEMS中研究JFFS2文件系统的过程,从挂载步骤到源码分析,特别是如何减少挂载时间。通过启用erase block summary(EBS)来提高JFFS2的挂载效率,使得挂载速度提升4-5倍,同时探讨了EBS的工作原理和潜在影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

根据之前的结果,虽然能够挂载上,但是有很多问题,参考(12)中描述。因为对jffs2完全没有什么概念可言,只知道这是一个flash的文件系统,并且挂载的时候只提供了下面的信息给到jffs2.对于内部怎么操作完全无知。并且flash每次擦除都是一个块一个块的。比如删除一个东西的时候是否会删除其他部分?怎么保留下来的。还是挺好奇的。大笑


为了解决问题,只能硬着头皮看jffs2的源码。看一下它挂载的时候是怎么分配64k sector的地址的。包括读写时的偏移等等。经过努力,将rtems源码中的jffs2部分代码加入到自己的工程中,主要问题是编译选项的问题,参考makefile.am 增加两个编译选项,'KBUILD_MODNAME="JFFS2"'和__ECOS,注意第一个要加单引号。折腾了挺久的,因为一开始没有加引号,宏定义

#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 总是编译错误。应该就是KBUILD_MODNAME 这个symbol定义不对导致的。最终编译通过。


那么我还是从挂载开始看起:为了能够看到debug信息,在jffs2中的debug.h中打开宏定义

#ifndef CONFIG_JFFS2_FS_DEBUG
#define CONFIG_JFFS2_FS_DEBUG 2  //关闭为0. 现在设置为2
#endif

step1:

当执行到mount的时候

  rv = mount(
    NULL,
    FLASH_MOUNT_POINT,  //if this is NULL,then the root file system will be mount
    RTEMS_FILESYSTEM_TYPE_JFFS2,
    RTEMS_FILESYSTEM_READ_WRITE,
    &mount_data
  );

我给的信息就是mount_data中的数据。其中包含flash实例和压缩方式的实例,压缩部分暂时完全不考虑。有机会再学习。

//the mount data of the filesystem jffs2
static const rtems_jffs2_mount_data mount_data = {
  .flash_control = &flash_instance.super,
  .compressor_control = &compressor_instance
}

flash_instance.super就是下面描述的,传入每个块的大小,总大小。读,写,擦除函数等等。

rtems和jffs2之间通过该结构体连接到一起。

static flash_control flash_instance = {
  .super = {
    .block_size = BLOCK_SIZE,
    .flash_size = FLASH_SIZE,
    .read = flash_read,
    .write = flash_write,
    .erase = flash_erase
  }
};

step2: 

进入mount函数。首先根据文件系统类型参数filesystemtype获取文件系统表中的安装函数(也就是文件系统的初始化函数)。
    rtems_filesystem_fsmount_me_t fsmount_me_h =
      rtems_filesystem_get_mount_handler( filesystemtype );

其中调用rtems_filesystem_iterate函数,在该函数中查找jffs2是否在rtems_filesystem_table中,然后找到对应的初始化函数

step3:

分配mount table entry的空间,调用函数alloc_mount_table_entry,这部分是rtems的文件系统框架使用的。最开始挂载的base file system也是通过这种方式。这里不考虑细节。后面会仔细研究rtems的文件系统框架

step4:

调用初始化函数

rv = (*fsmount_me_h)( mt_entry, data ); 

这个函数就是在step2中获取的初始化函数。在文件fs-rtems.c中定义。也就是在condefs.h中定义了打开jffs2文件系统后,在 rtems_filesystem_table中就会加入jffs2相关的东西,可以查到该初始化函数就是rtems_jffs2_initialize

1:首先会根据传进去的flash_size,计算hashsize大小,根据flash_size是多少兆,那么hashsize就是这个的两倍,如果两倍小于hashsize的最小值INOCACHE_HASHSIZ
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值