概述
本文档主要介绍 Vela 操作系统中文件操作(open、read、write、close)的主要流程。
文件系统整体架构
Vela 系统采用 VFS(Virtual File System) 架构,主要包含:
-
VFS 层 - 提供统一的文件操作接口
-
具体文件系统实现(FAT、PROCFS、TMPFS等)
-
设备驱动层
文件系统相关的重要数据结构:
-
struct inode - 文件系统节点,代表文件/目录
-
struct file - 打开文件实例
-
struct file_operations - 文件操作方法集
-
struct mountpt_operations - 挂载点操作方法集
open() 调用流程
-
应用层调用 open()
-
进入系统调用 nx_open()
-
调用 inode_search() 查找路径对应的 inode
-
如果是普通文件:
-
调用对应文件系统的 open 操作(如 fat_open)
-
分配 file 结构体,关联 inode
-
-
如果是设备文件:
-
调用设备驱动的 open 操作
-
关联驱动的 file_operations
-
-
返回文件描述符
open() 详细调用流程
1. 系统调用入口
应用程序调用open()后,进入系统调用层:
int open(const char *path, int oflags, ...)
-> int nx_open(const char *path, int oflags, mode_t mode)
-> int file_open(const char *path, int oflags, mode_t mode)
-> int file_vopen(struct file *filep, const char *path, int oflags, mode_t mode)
2. 路径解析与inode查找
在file_vopen()中,首先需要解析路径找到对应的inode:
-
调用inode_search()开始查找:
SETUP_SEARCH(&desc, path, false); // 初始化查找描述符
ret = inode_find(&desc); // 开始查找inode
-
inode_find()内部调用_inode_search():
-
从根节点(g_root_inode)开始搜索
-
按路径组件逐级遍历inode树
-
支持软链接和挂载点的处理
-
-
查找过程中的关键步骤:
-
比较当前节点名与路径组件
-
处理特殊情况(软链接、挂载点)
-
返回找到的inode及相关信息
-
-
inode_search返回结果包含:
-
node: 找到的目标inode
-
peer: 同级前一个节点
-
parent: 父节点
-
relpath: 挂载点内的相对路径
-
3. 文件打开处理
根据找到的inode类型执行不同的打开操作:
-
设备驱动文件:
if (INODE_IS_DRIVER(inode)) {
// 调用驱动的open方法
ret = inode->u.i_ops->open(filep);
}
-
块设备文件:
if (INODE_IS_BLOCK(inode)) {