http://weharmonyos.com/openharmony/zh-cn/device-dev/kernel/kernel-small-bundles-fs-support-jffs2.html 更多...
函数 | |
static void | Jffs2SetVtype (struct jffs2_inode *node, struct Vnode *pVnode) |
设置vnode节点的文件类型 更多... | |
time_t | Jffs2CurSec (void) |
void | Jffs2NodeLock (void) |
void | Jffs2NodeUnlock (void) |
int | VfsJffs2Bind (struct Mount *mnt, struct Vnode *blkDriver, const void *data) |
VfsJffs2Bind 挂载JFFS2分区 更多... | |
int | VfsJffs2Unbind (struct Mount *mnt, struct Vnode **blkDriver) |
VfsJffs2Unbind 卸载JFFS2分区 更多... | |
int | VfsJffs2Lookup (struct Vnode *parentVnode, const char *path, int len, struct Vnode **ppVnode) |
int | VfsJffs2Create (struct Vnode *parentVnode, const char *path, int mode, struct Vnode **ppVnode) |
创建一个jffs2 索引节点 更多... | |
int | VfsJffs2Close (struct file *filep) |
ssize_t | VfsJffs2ReadPage (struct Vnode *vnode, char *buffer, off_t off) |
ssize_t | VfsJffs2Read (struct file *filep, char *buffer, size_t bufLen) |
ssize_t | VfsJffs2WritePage (struct Vnode *vnode, char *buffer, off_t pos, size_t buflen) |
ssize_t | VfsJffs2Write (struct file *filep, const char *buffer, size_t bufLen) |
off_t | VfsJffs2Seek (struct file *filep, off_t offset, int whence) |
int | VfsJffs2Ioctl (struct file *filep, int cmd, unsigned long arg) |
int | VfsJffs2Fsync (struct file *filep) |
int | VfsJffs2Dup (const struct file *oldFile, struct file *newFile) |
int | VfsJffs2Opendir (struct Vnode *pVnode, struct fs_dirent_s *dir) |
int | VfsJffs2Readdir (struct Vnode *pVnode, struct fs_dirent_s *dir) |
int | VfsJffs2Seekdir (struct Vnode *pVnode, struct fs_dirent_s *dir, unsigned long offset) |
int | VfsJffs2Rewinddir (struct Vnode *pVnode, struct fs_dirent_s *dir) |
int | VfsJffs2Closedir (struct Vnode *node, struct fs_dirent_s *dir) |
int | VfsJffs2Mkdir (struct Vnode *parentNode, const char *dirName, mode_t mode, struct Vnode **ppVnode) |
static int | Jffs2Truncate (struct Vnode *pVnode, unsigned int len) |
int | VfsJffs2Truncate (struct Vnode *pVnode, off_t len) |
int | VfsJffs2Truncate64 (struct Vnode *pVnode, off64_t len) |
int | VfsJffs2Chattr (struct Vnode *pVnode, struct IATTR *attr) |
int | VfsJffs2Rmdir (struct Vnode *parentVnode, struct Vnode *targetVnode, const char *path) |
int | VfsJffs2Link (struct Vnode *oldVnode, struct Vnode *newParentVnode, struct Vnode **newVnode, const char *newName) |
int | VfsJffs2Symlink (struct Vnode *parentVnode, struct Vnode **newVnode, const char *path, const char *target) |
ssize_t | VfsJffs2Readlink (struct Vnode *vnode, char *buffer, size_t bufLen) |
int | VfsJffs2Unlink (struct Vnode *parentVnode, struct Vnode *targetVnode, const char *path) |
int | VfsJffs2Rename (struct Vnode *fromVnode, struct Vnode *toParentVnode, const char *fromName, const char *toName) |
int | VfsJffs2Stat (struct Vnode *pVnode, struct stat *buf) |
int | VfsJffs2Reclaim (struct Vnode *pVnode) |
int | VfsJffs2Statfs (struct Mount *mnt, struct statfs *buf) |
int | Jffs2MutexCreate (void) |
void | Jffs2MutexDelete (void) |
FSMAP_ENTRY (jffs_fsmap, "jffs2", jffs_operations, TRUE, TRUE) | |
变量 | |
struct VnodeOps | g_jffs2Vops |
jffs2 关于vnode操作接口实现 更多... | |
struct file_operations_vfs | g_jffs2Fops |
jffs2 关于vfs接口实现 更多... | |
static LosMux | g_jffs2FsLock |
static pthread_mutex_t | g_jffs2NodeLock = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP |
struct Vnode * | g_jffs2PartList [CONFIG_MTD_PATTITION_NUM] |
const struct MountOps | jffs_operations |
http://weharmonyos.com/openharmony/zh-cn/device-dev/kernel/kernel-small-bundles-fs-support-jffs2.html
基本概念 JFFS2是Journalling Flash File System Version 2(日志文件系统)的缩写,是针对MTD设备的日志型文件系统。 OpenHarmony内核的JFFS2主要应用于NOR FLASH闪存,其特点是:可读写、支持数据压缩、提供了崩溃/掉电安全保护、 提供“写平衡”支持等。闪存与磁盘介质有许多差异,直接将磁盘文件系统运行在闪存设备上,会导致性能和安全问题。 为解决这一问题,需要实现一个特别针对闪存的文件系统,JFFS2就是这样一种文件系统。 运行机制 关于JFFS2文件系统的在存储设备上的实际物理布局,及文件系统本身的规格说明,请参考JFFS2的官方规格说明文档。 https://sourceware.org/jffs2/ 这里仅列举几个对开发者和使用者会有一定影响的JFFS2的重要机制/特征: 1. Mount机制及速度问题:按照JFFS2的设计,所有的文件会按照一定的规则,切分成大小不等的节点, 依次存储到flash设备上。在mount流程中,需要获取到所有的这些节点信息并缓存到内存里。 因此,mount速度和flash设备的大小和文件数量的多少成线性比例关系。这是JFFS2的原生设计问题, 对于mount速度非常介意的用户,可以在内核编译时开启“Enable JFFS2 SUMMARY”选项,可以极大提升mount的速度。 这个选项的原理是将mount需要的信息提前存储到flash上,在mount时读取并解析这块内容,使得mount的速度变得相对恒定。 这个实际是空间换时间的做法,会消耗8%左右的额外空间。 2. 写平衡的支持:由于flash设备的物理属性,读写都只能基于某个特定大小的“块”进行,为了防止某些特定的块磨损过于严重, 在JFFS2中需要对写入的块进行“平衡”的管理,保证所有的块的写入次数都是相对平均的,进而保证flash设备的整体寿命。 3. GC(garbage collection)机制:在JFFS2里发生删除动作,实际的物理空间并不会立即释放,而是由独立的GC线程来做 空间整理和搬移等GC动作,和所有的GC机制一样,在JFFS2里的GC会对瞬时的读写性能有一定影响。另外,为了有空间能 被用来做空间整理,JFFS2会对每个分区预留3块左右的空间,这个空间是用户不可见的。 4. 压缩机制:当前使用的JFFS2,底层会自动的在每次读/写时进行解压/压缩动作,实际IO的大小和用户请求读写的大小 并不会一样。特别在写入时,不能通过写入大小来和flash剩余空间的大小来预估写入一定会成功或者失败。 5. 硬链接机制:JFFS2支持硬链接,底层实际占用的物理空间是一份,对于同一个文件的多个硬连接,并不会增加空间的占用; 反之,只有当删除了所有的硬链接时,实际物理空间才会被释放。 开发指导 对于基于JFFS2和nor flash的开发,总体而言,与其他文件系统非常相似,因为都有VFS层来屏蔽了具体文件系统的差异, 对外接口体现也都是标准的POSIX接口。 对于整个裸nor flash设备而言,没有集中的地方来管理和记录分区的信息。因此,需要通过其他的配置方式来传递这部分信息 (当前使用的方式是在烧写镜像的时候,使用bootargs参数配置的),然后在代码中调用相应的接口来添加分区,再进行挂载动作。
在文件 vfs_jffs2.c 中定义.
FSMAP_ENTRY | ( | jffs_fsmap | , |
"jffs2" | , | ||
jffs_operations | , | ||
TRUE | , | ||
TRUE | |||
) |
time_t Jffs2CurSec | ( | void | ) |
在文件 vfs_jffs2.c 第 130 行定义.
在文件 vfs_jffs2.c 第 1009 行定义.
在文件 vfs_jffs2.c 第 1019 行定义.
在文件 vfs_jffs2.c 第 138 行定义.
在文件 vfs_jffs2.c 第 143 行定义.
在文件 vfs_jffs2.c 第 698 行定义.
VfsJffs2Bind 挂载JFFS2分区
运行命令: OHOS # mount /dev/spinorblk1 /jffs1 jffs2 将从串口得到如下回应信息,表明挂载成功。 OHOS # mount /dev/spinorblk1 /jffs1 jffs2 mount OK 挂载成功后,用户就能对norflash进行读写操作。
blkDriver | |
data | |
mnt |
在文件 vfs_jffs2.c 第 165 行定义.
在文件 vfs_jffs2.c 第 350 行定义.
在文件 vfs_jffs2.c 第 655 行定义.
int VfsJffs2Create | ( | struct Vnode * | parentVnode, |
const char * | path, | ||
int | mode, | ||
struct Vnode ** | ppVnode | ||
) |
创建一个jffs2 索引节点
在文件 vfs_jffs2.c 第 314 行定义.
在文件 vfs_jffs2.c 第 608 行定义.
在文件 vfs_jffs2.c 第 601 行定义.
在文件 vfs_jffs2.c 第 595 行定义.
int VfsJffs2Link | ( | struct Vnode * | oldVnode, |
struct Vnode * | newParentVnode, | ||
struct Vnode ** | newVnode, | ||
const char * | newName | ||
) |
int VfsJffs2Lookup | ( | struct Vnode * | parentVnode, |
const char * | path, | ||
int | len, | ||
struct Vnode ** | ppVnode | ||
) |
在文件 vfs_jffs2.c 第 263 行定义.
int VfsJffs2Mkdir | ( | struct Vnode * | parentNode, |
const char * | dirName, | ||
mode_t | mode, | ||
struct Vnode ** | ppVnode | ||
) |
在文件 vfs_jffs2.c 第 660 行定义.
在文件 vfs_jffs2.c 第 614 行定义.
在文件 vfs_jffs2.c 第 842 行定义.
在文件 vfs_jffs2.c 第 975 行定义.
int VfsJffs2Rename | ( | struct Vnode * | fromVnode, |
struct Vnode * | toParentVnode, | ||
const char * | fromName, | ||
const char * | toName | ||
) |
在文件 vfs_jffs2.c 第 898 行定义.
在文件 vfs_jffs2.c 第 648 行定义.
在文件 vfs_jffs2.c 第 643 行定义.
在文件 vfs_jffs2.c 第 934 行定义.
int VfsJffs2Symlink | ( | struct Vnode * | parentVnode, |
struct Vnode ** | newVnode, | ||
const char * | path, | ||
const char * | target | ||
) |
在文件 vfs_jffs2.c 第 807 行定义.
在文件 vfs_jffs2.c 第 712 行定义.
VfsJffs2Unbind 卸载JFFS2分区
调用int umount(const char *target)函数卸载分区,只需要正确给出挂载点即可。 运行命令: OHOS # umount /jffs1 将从串口得到如下回应信息,表明卸载成功。 OHOS # umount /jffs1 umount ok
blkDriver | |
mnt |
在文件 vfs_jffs2.c 第 234 行定义.
在文件 vfs_jffs2.c 第 872 行定义.
在文件 vfs_jffs2.c 第 463 行定义.
struct file_operations_vfs g_jffs2Fops |
jffs2 关于vfs接口实现
在文件 vfs_jffs2.c 第 105 行定义.
|
static |
在文件 vfs_jffs2.c 第 107 行定义.
|
static |
在文件 vfs_jffs2.c 第 109 行定义.
struct Vnode* g_jffs2PartList[CONFIG_MTD_PATTITION_NUM] |
jffs2 分区列表
在文件 vfs_jffs2.c 第 110 行定义.
struct VnodeOps g_jffs2Vops |
jffs2 关于vnode操作接口实现
在文件 vfs_jffs2.c 第 104 行定义.
const struct MountOps jffs_operations |
在文件 vfs_jffs2.c 第 1024 行定义.