返回

鸿蒙轻内核VFS源码分析

闲谈

鸿蒙轻内核M核源码分析系列二一 01 虚拟文件系统VFS

目录

  • 1 引言
  • 2 VFS 结构体和全局变量
    • 2.1 VFS 结构体
    • 2.2 VFS 全局变量
  • 3 VFS 文件操作接口
    • 3.1 文件符操作接口
    • 3.2 文件系统操作接口
    • 3.3 文件目录操作接口
    • 3.4 文件操作接口
    • 3.5 硬盘操作接口
    • 3.6 高级文件系统接口
  • 4 结语

1 引言

VFS(Virtual File System,虚拟文件系统)是鸿蒙轻内核M核中文件系统的抽象层,它为用户空间提供了统一的文件系统接口,屏蔽了不同文件系统之间的差异。VFS的主要功能包括:

  • 文件系统的统一管理:VFS将不同的文件系统统一管理起来,为用户空间提供统一的文件系统接口。
  • 文件系统的挂载和卸载:VFS负责文件系统的挂载和卸载操作。
  • 文件系统的查找和打开:VFS负责文件系统的查找和打开操作。
  • 文件的读写操作:VFS负责文件的读写操作。
  • 文件的控制操作:VFS负责文件的控制操作。

2 VFS 结构体和全局变量

2.1 VFS 结构体

VFS 结构体定义如下:

typedef struct vfs_info {
    //文件系统列表
    list_head_t filesystem_list;
    //目录句柄列表
    list_head_t fh_list;
    //文件系统挂载点链表
    list_head_t mountpoint_list;
    spinlock_t lock;
    spinlock_t fh_lock;
    spinlock_t fs_lock;
    fs_hook_t fs_hook;
    fs_cache_t fs_cache;
    struct file_descriptor *cur_file;
} vfs_info_t;

VFS 结构体包含以下成员:

  • filesystem_list:文件系统列表。
  • fh_list:目录句柄列表。
  • mountpoint_list:文件系统挂载点链表。
  • lock:VFS 锁。
  • fh_lock:目录句柄锁。
  • fs_lock:文件系统锁。
  • fs_hook:文件系统钩子函数。
  • fs_cache:文件系统缓存。
  • cur_file:当前文件。

2.2 VFS 全局变量

VFS 全局变量定义如下:

vfs_info_t g_vfs;

g_vfs 变量是 VFS 结构体的全局变量,它包含了 VFS 的所有信息。

3 VFS 文件操作接口

VFS 提供了丰富的文件操作接口,包括文件符操作接口、文件系统操作接口、文件目录操作接口、文件操作接口、硬盘操作接口和高级文件系统接口。

3.1 文件描述符操作接口

文件描述符操作接口包括:

  • int open(const char *pathname, int flags, ...) → int:打开一个文件。
  • int close(int fd):关闭一个文件。
  • ssize_t read(int fd, void *buf, size_t count):从文件中读取数据。
  • ssize_t write(int fd, const void *buf, size_t count):向文件中写入数据。
  • int fcntl(int fd, int cmd, ...):控制文件。
  • int ioctl(int fd, unsigned long request, ...):向文件发送控制命令。
  • int dup(int fd):复制一个文件描述符。
  • int dup2(int fd1, int fd2):复制一个文件描述符并关闭原文件描述符。

3.2 文件系统操作接口

文件系统操作接口包括:

  • int mount(const char *source, const char *target, const char *filesystemtype, unsigned long mountflags):挂载一个文件系统。
  • int umount(const char *target):卸载一个文件系统。
  • int mountpoint(const char *target):获取一个文件系统的挂载点。
  • int pivot_root(const char *new_root, const char *put_old):切换根文件系统。

3.3 文件目录操作接口

文件目录操作接口包括:

  • DIR *opendir(const char *name):打开一个目录。
  • struct dirent *readdir(DIR *dirp):从目录中读取一个目录项。
  • int closedir(DIR *dirp):关闭一个目录。
  • int mkdir(const char *pathname, mode_t mode):创建一个目录。
  • int rmdir(const char *pathname):删除一个目录。

3.4 文件操作接口

文件操作接口包括:

  • int access(const char *pathname, int mode):检查文件是否存在并具有指定模式。
  • int chmod(const char *pathname, mode_t mode):更改文件的模式。
  • int chown(const char *pathname, uid_t owner, gid_t group):更改文件的属主和组。
  • int link(const char *oldpath, const char *newpath):创建一个指向文件的硬链接。
  • int rename(const char *oldpath, const char *newpath):重命名一个文件。
  • int stat(const char *pathname, struct stat *buf):获取文件的状态信息。
  • int lstat(const char *pathname, struct stat *buf):获取文件的符号链接状态信息。
  • int fstat(int fd, struct stat *buf):获取文件的