1 Star 0 Fork 0

laokz / ohos_memo

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
a_fs 7.68 KB
一键复制 编辑 原始数据 按行查看 历史
## liteos_a的jffs2和fat文件系统主要操作大体过程(驱动视角)
### 读
kernel/liteos_a/syscall/fs_syscall.c:SysRead
读系统调用(如果缓冲区不是用户空间地址,报错返回)
third_party/NuttX/fs/vfs/fs_read.c:read
调用文件系统注册的file_operations_vfs.read方法(如果是socket描述符,会调用recv函数)
----------------------------------------------------------------------- jffs2实现
kernel/liteos_a/fs/jffs2/src/vfs_jffs2.c:VfsJffs2Read
**获取g_jffs2FsLock互斥锁**
third_party/Linux_Kernel/fs/jffs2/read.c:jffs2_read_inode_range
third_party/Linux_Kernel/fs/jffs2/read.c:jffs2_read_dnode
**分配缓冲区去读**
third_party/Linux_Kernel/fs/jffs2/read.c:jffs2_flash_direct_read
调用驱动注册的block_operations.read方法
视情解压缩
**拷贝给参数缓冲区**
**释放g_jffs2FsLock**
----------------------------------------------------------------------- fat实现
kernel/liteos_a/fs/fat/os_adapt/fatfs.c:fatfs_read
**获取卷(分区)互斥锁**
third_party/FatFs/source/ff.c:f_read
third_party/FatFs/source/diskio.c:disk_read
kernel/liteos_a/drivers/block/disk/src/disk.c:los_part_read
**获取整个磁盘的互斥锁**
kernel/liteos_a/drivers/block/disk/src/disk.c:los_disk_read
**获取整个磁盘的互斥锁**(再次)
如果启用bcache则从中读,未命中则调用驱动注册的read方法
如果未启用
kernel/liteos_a/drivers/block/disk/src/disk.c:disk_read_directly
如果是用户空间地址,指定内核缓冲区,
调用驱动注册的read方法
**释放整个磁盘的互斥锁**
**释放整个磁盘的互斥锁**
**释放卷互斥锁**
### 写
kernel/liteos_a/syscall/fs_syscall.c:SysWrite
写系统调用(如果缓冲区不是用户空间地址,报错返回)
third_party/NuttX/fs/vfs/fs_write.c:write
调用文件系统注册的file_operations_vfs.write方法(如果是socket描述符,会调用send函数)
----------------------------------------------------------------------- jffs2实现
kernel/liteos_a/fs/jffs2/src/vfs_jffs2.c:VfsJffs2Write
**获取g_jffs2FsLock互斥锁**
third_party/Linux_Kernel/fs/jffs2/write.c:jffs2_write_inode_range
**分配缓冲区,拷贝参数缓冲区**
压缩
third_party/Linux_Kernel/fs/jffs2/write.c:jffs2_write_dnode
third_party/Linux_Kernel/fs/jffs2/writev.c:jffs2_flash_direct_writev
third_party/Linux_Kernel/fs/jffs2/writev.c:jffs2_flash_direct_write
调用驱动注册的block_operations.write方法
**释放g_jffs2FsLock**
----------------------------------------------------------------------- fat实现
kernel/liteos_a/fs/fat/os_adapt/fatfs.c:fatfs_write
**获取卷(分区)互斥锁**
third_party/FatFs/source/ff.c:f_write
third_party/FatFs/source/diskio.c:disk_write
kernel/liteos_a/drivers/block/disk/src/disk.c:los_part_write
**获取整个磁盘的互斥锁**
kernel/liteos_a/drivers/block/disk/src/disk.c:los_disk_write
**获取整个磁盘的互斥锁**(再次)
如果启用bcache则写入缓存
如果未启用
kernel/liteos_a/drivers/block/disk/src/disk.c:disk_write_directly
如果是用户空间地址,先拷贝到指定内核缓冲区,
调用驱动注册的write方法
**释放整个磁盘的互斥锁**
**释放整个磁盘的互斥锁**
third_party/FatFs/source/ff.c:f_sync
third_party/FatFs/source/ff.c:sync_fs
写回文件系统缓存的脏数据(写到bcache或盘中)
(bcache中的缓存数据由bcache_sync_task线程按脏数据达限后落盘)
**释放卷互斥锁**
### MMC对fat驱动的实现
系统提供了标准驱动block_operations方法:
drivers/adapter/khdf/liteos/model/storage/src/mmc/mmc_block_lite.c:g_blockOps,
方法调用了HDF中的函数:
drivers/framework/model/storage/src/mmc/mmc_core.c:MmcDeviceRead/Write,
填充MMC需要的读写信息
drivers/framework/model/storage/src/mmc/mmc_protocol.c:MmcSetupReadWriteBlocksCmd
填充MMC命令信息
drivers/framework/model/storage/src/mmc/mmc_core.c:MmcCntlrAddRequestMsgToQueue
将请求写入消息队列
drivers/framework/model/storage/src/mmc/mmc_core.c:MmcMsgHandleDefault
专门的消息处理线程函数
drivers/framework/model/storage/src/mmc/mmc_core.c:MmcCntlrExecRequest
获取cntlr的互斥锁
drivers/framework/model/storage/src/mmc/mmc_core.c:MmcCntlrDoRequest
调用实际驱动注册的MmcCntlrOps.request方法
释放cntlr的互斥锁
(MMC插拔也由此专门线程持有cntlr互斥锁处理)
**总结**:驱动不需要处理并发访问、用户空间地址问题
### bcache落盘时机
kernel/liteos_a/fs/vfs/bcache/src/bcache.c:DrvBwrite,是调用驱动落盘的函数,注册为bcache.bwriteFun方法
其上的调用链条:
BcacheSyncBlock
BcacheSync
OsSdSync
fatfs_sync
fatfs_create_obj
fatfs_create
fatfs_mkdir
fatfs_symlink
fatfs_close
fatfs_truncate
fatfs_truncate64
fatfs_chattr
fatfs_rename
fatfs_rmdir
fatfs_unlink
fatfs_umount
fatfs_sync_adapt(sync系统调用)
fatfs_mkfs
fatfs_fscheck
FatFsBindVirPart
LOS_BcacheSyncByName(无人调用)
BcacheSyncThread(bcache同步线程bcache_sync_task入口)*****************************
los_disk_cache_clear
BlockCacheSync
los_disk_sync(无人调用)
los_disk_set_bcache
---------------------------------------
GetSlowBlock
BcacheGetBlock(见下)
AllocNewBlock(见下)
AllocNewBlock(见下)
WriteMergedBlocks
MergeSyncBlocks
AllocNewBlock
BcacheGetBlock
BlockCacheRead
los_disk_read
BlockCacheWrite
los_disk_write
BcacheAsyncPrereadThread
从以上叶子节点推断写盘时机,
一是一次性(上半除星号部分),
二是缓存不足(下半部分。实测MMC对拷17M文件,WriteMergedBlocks分支被调用次数为0;
GetSlowBlock和AllocNewBlock则取决于缓存替换算法),
三是例行同步(星号部分)。这应是大头
HTML
1
https://gitee.com/laokz/ohos_memo.git
git@gitee.com:laokz/ohos_memo.git
laokz
ohos_memo
ohos_memo
master

搜索帮助