返回
鸿蒙轻内核VFS源码分析
闲谈
2023-12-29 07:03:27
鸿蒙轻内核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)
:获取文件的