oneos虚拟文件系统vfs源码分析

vfs_fs.c

和挂载点相关:

enum vfs_dev_ref_stat
{
    DEV_REF_NONE,    //设备挂载状态:none:设备没有挂载文件系统
    DEV_REF_MOUNT,   //mount:设备已经被挂载了
    DEV_REF_MKFS,    //mkfs:设备正在被格式化
    DEV_REF_NO_SPACE //没有设备可用了
};

#define MNT_PT_INITED       (0x5A5A)
#define VFS_MOUNTPOINT_MAX 8        //vfs支持最多挂载8个文件系统
#define VFS_FILESYSTEM_TYPES_MAX 6  //vfs支持最多6种文件系统类型
#define VFS_FD_MAX 16               //vfs最大支持16个fd
#define VFS_MKFS_MAX        VFS_MOUNTPOINT_MAX
static unsigned short gs_vfs_init_flag = 0; //确保vfs只能init一次
static const struct vfs_filesystem_ops *vfs_ops_table[VFS_FILESYSTEM_TYPES_MAX]; 
/* 文件系统对外的API操作表,用于存储不同类型的文件系统操作函数指针 */
static struct vfs_mountpoint mnt_point_table[VFS_MOUNTPOINT_MAX];
/* 挂载的文件系统表,用于记录文件系统在系统中的挂载点 */
static void *mkfs_dev_table[VFS_MKFS_MAX];
/* 格式化的设备表,用于存储格式化文件系统所使用的设备 */

static const struct vfs_filesystem_ops *_vfs_fs_ops_get(const char *fs_name)
/* 遍历vfs_ops_table,并比较fs_name,找到其对用的fs_ops指针 */

static enum vfs_dev_ref_stat _vfs_mkfs_dev_ref(void *dev)
/* 遍历mnt_point_table,并比较dev设备对象,如果与入参相等,则该设备已经被挂载,如果遍历完以后发现还有挂载点,则再次遍历mkfs_dev_table,发现还有成员为null,即还有设备可供mkfs */

static void _vfs_mkfs_dev_deref(void *dev)
/* 和上面api相反,遍历mkfs_dev_table,发现有成员和入参相同,则将该设备表上的对应指针设为null,代表该设备空出来了 */

static char *_vfs_mntpath_get(const char *path)
/* 入参path可能是相对路径or绝对路径,需要转化为绝对路径;如果转换后的path是 "/"or"/dev"or"目录",那么返回一个指向挂载点路径的字符指针。如果路径无效或不存在,则返回OS_NULL。 */

static struct vfs_mountpoint *_vfs_mount_point_add(void *dev, char *mnt_path, const struct vfs_filesystem_ops *fs_ops)
//遍历mnt_point_table,如果mnt_path挂载点路径或dev设备被使用,则返回空,若没被使用,则对mnt_point_table中的成员赋值

static void _vfs_mount_point_set_init(struct vfs_mountpoint *mnt_point)
//对mnt_point_table中的成员赋值mnt_point->is_inited = MNT_PT_INITED;走到这里,说明已经挂载成功。

static void _vfs_mount_point_del(struct vfs_mountpoint *mnt_point, char *mnt_path)
//如果挂载失败,得将mnt_point_table中的成员重置为0,并销毁挂载点的路径。

static struct vfs_mountpoint *_vfs_mount_point_get_from_mntpath(const char* mnt_path)
//通过挂载点路径成员,找到对应挂载点,并mnt_point->ref_cnt++后返回

struct vfs_mountpoint *vfs_mount_point_find_and_ref(const char* abspath)
//通过文件绝对路径,找到匹配的挂载点,并mnt_point->ref_cnt++后返回

void vfs_mount_point_deref(struct vfs_mountpoint *mnt_point)
//通过挂载点,并mnt_point->ref_cnt--后返回

int vfs_register(const struct vfs_filesystem_ops *fs_ops)
//底层文件系统注册,把fs_ops,注册到vfs_ops_table表中

int vfs_mount(const char *dev_name, const char *path, const char *fs_name, unsigned long mountflag, const void *data)
//底层文件系统挂载,通过dev = (void *)os_device_find(dev_name)找到设备
//通过mnt_path = _vfs_mntpath_get(path)找到挂载点路径
//通过fs_ops = _vfs_fs_ops_get(fs_name)找到底层文件系统操作指针表
//使用 mnt_point = _vfs_mount_point_add(dev, mnt_path, fs_ops)把它们保存在mnt_point_table中
//fs_ops->mount(mnt_point, mountflag, data),执行挂载操作
//如果挂载成功,则_vfs_mount_point_set_init(mnt_point)
//如果挂载失败,则_vfs_mount_point_del(mnt_point, mnt_path)

和路径相关的:

const char *vfs_create_absolute_path(const char *dirpath, const char *filepath)
/* 创建绝对路径,并malloc一个内存空间保存该绝对路径,因此不用的时候,要记得free噢 */

void vfs_destroy_absolute_path(char *path)
/* 销毁绝对路径,就直接free啦 */

const char *vfs_get_rel_mnt_path(const char *mntpath, const char *abspath)
/* 通过文件系统的挂载点路径,和绝对路径,返回相对挂载点的相对路径 */

const char *vfs_create_rel_mnt_path(const char *mntpath, const char *abspath)
/* 和上面api类似,唯一增加的功能则是malloc了空间来保存相对挂载点的相对路径 */

const char *vfs_get_path_lastname(const char *path)
/* 通过绝对路径,获取最后的文件夹或文件名 */

和当前工作目录相关:

static char working_dir[VFS_PATH_MAX] = {"/"};
// 这是一个全局变量,用于保存当前工作目录

void working_dir_init(void)
// 用来初始化该工作目录,也就是设为 ”/“

char *working_dir_get(char *buf, size_t size)
// 获取当前工作目录path,常见的shell命令pwd,就是调用的它

void working_dir_set(char *path)
// 切换当前工作目录时,需要把切换后的path保存入全局变量working_dir,常见的shell命令cd,就是调用的它

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值