根据之前的结果,虽然能够挂载上,但是有很多问题,参考(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:
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:
调用初始化函数