ipc_fs
IPC文件系统(ipc_fs)模块提供跨核心文件系统访问的IPC通信框架,支持服务端注册操作回调并处理来自其他核心的文件操作请求,包括文件的创建、打开、读写、定位、状态查询以及目录操作等。
头文件清单
#include <middleware/utils/ipc_fs/ipc_fs_common.h>
#include <middleware/utils/ipc_fs/ipc_fs_server.h>
接口清单
| 接口名称 | 功能简述 |
|---|---|
| ipc_fs_server_register_ops | 注册IPC文件系统服务端操作回调函数集 |
| ipc_fs_server_handle | 处理来自指定核心的IPC文件系统消息请求 |
Functions
ipc_fs_server_register_ops
函数声明
头文件清单
功能说明
- 注册IPC文件系统服务端操作回调函数集,包括应答发送回调、内存映射回调、内存请求与释放回调
- 服务端通过此接口将平台相关的操作函数注册到IPC文件系统框架,供后续消息处理时调用
- 须在调用ipc_fs_server_handle处理消息之前完成注册,否则消息处理将无法正常应答或访问远端内存
前置条件
- ops指针不为NULL,且其成员函数指针均已完成初始化
- IPC通信通道已初始化完成,具备跨核消息收发能力
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| ops | const ipc_fs_server_ops * | 指向服务端操作回调函数集结构体的指针 | 非 NULL |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 0 | 注册成功 | ops参数合法且注册操作完成 |
| -1 | 注册失败 | ops为NULL或注册过程中发生异常 |
ipc_fs_server_handle
函数声明
int32_t ipc_fs_server_handle(uint32_t src_core, uint32_t msg_id, uint8_t *payload, uint32_t payload_len);
头文件清单
功能说明
- 处理来自指定核心的IPC文件系统消息请求,根据消息ID和操作类型分发到对应的文件操作处理流程
- 支持的文件操作类型包括stat、fcreate、fopen、fclose、fwrite、fread、fseek、ftell、feof、ferror、opendir、closedir、readdir
- 须在ipc_fs_server_register_ops完成注册后调用,否则无法正确处理消息及应答
前置条件
- 已通过ipc_fs_server_register_ops完成服务端操作回调函数集注册
- payload指针不为NULL,payload_len与实际消息长度一致
- IPC通信通道已初始化完成,具备跨核消息收发能力
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| src_core | uint32_t | 发送消息的源核心编号 | 0 ~ 255 |
| msg_id | uint32_t | 消息标识ID | 0 ~ 0xFFFFFFFF |
| payload | uint8_t * | 指向消息载荷数据的指针 | 非 NULL |
| payload_len | uint32_t | 消息载荷数据长度 | 0 ~ 0xFFFFFFFF |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 0 | 处理成功 | 消息处理及应答完成 |
| -1 | 处理失败 | 参数无效或消息处理过程中发生异常 |
Enumerations
ipc_fs_op
typedef enum {
IPC_FS_OP_STAT,
IPC_FS_OP_FCREATE,
IPC_FS_OP_FOPEN,
IPC_FS_OP_FCLOSE,
IPC_FS_OP_FWRITE,
IPC_FS_OP_FREAD,
IPC_FS_OP_FSEEK,
IPC_FS_OP_FTELL,
IPC_FS_OP_FEOF,
IPC_FS_OP_FERROR,
/* DIR */
IPC_FS_OP_OPENDIR,
IPC_FS_OP_CLOSEDIR,
IPC_FS_OP_READDIR,
IPC_FS_OP_MAX
} ipc_fs_op;
| 枚举成员 | 取值 | 描述 |
|---|---|---|
| IPC_FS_OP_STAT | 0 | 获取文件状态信息 |
| IPC_FS_OP_FCREATE | 1 | 创建文件 |
| IPC_FS_OP_FOPEN | 2 | 打开文件 |
| IPC_FS_OP_FCLOSE | 3 | 关闭文件 |
| IPC_FS_OP_FWRITE | 4 | 写文件 |
| IPC_FS_OP_FREAD | 5 | 读文件 |
| IPC_FS_OP_FSEEK | 6 | 设置文件位置指针 |
| IPC_FS_OP_FTELL | 7 | 获取文件位置指针当前位置 |
| IPC_FS_OP_FEOF | 8 | 判断文件是否到达末尾 |
| IPC_FS_OP_FERROR | 9 | 判断文件操作是否发生错误 |
| IPC_FS_OP_OPENDIR | 10 | 打开目录 |
| IPC_FS_OP_CLOSEDIR | 11 | 关闭目录 |
| IPC_FS_OP_READDIR | 12 | 读取目录项 |
| IPC_FS_OP_MAX | 13 | 操作类型上限值 |
Structures
ipc_core_memmap
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| start | uintptr_t | 核心内存映射起始地址 |
| end | uintptr_t | 核心内存映射结束地址 |
| offset | uintptr_t | 核心内存映射偏移量 |
ipc_fs_server_ops
typedef struct {
int32_t (* ipc_ack_func)(uint32_t src_core, ipc_fs_ack *ack);
uintptr_t (* memmap)(uintptr_t addr, uint32_t len);
void (* mem_request)(uintptr_t addr);
void (* mem_release)(uintptr_t addr);
} ipc_fs_server_ops;
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| ipc_ack_func | int32_t ()(uint32_t src_core, ipc_fs_ack ack) | IPC应答发送回调函数,向源核心发送应答消息。调用时机:在ipc_fs_server_handle处理完消息后调用 |
| memmap | uintptr_t (*)(uintptr_t addr, uint32_t len) | 内存映射回调函数,将远端地址映射为本地可访问地址。调用时机:在处理fread/fwrite等需要访问远端内存的请求时调用 |
| mem_request | void (*)(uintptr_t addr) | 内存请求回调函数,请求访问远端内存区域。调用时机:在处理fread请求需要读取远端内存数据前调用 |
| mem_release | void (*)(uintptr_t addr) | 内存释放回调函数,释放远端内存区域的访问权限。调用时机:在处理fwrite请求完成远端内存写入后调用 |
ipc_fs_dirent
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| d_type | uint8_t | 目录项类型 |
| d_name | char[256] | 目录项名称,最大长度为FILE_NAME_MAX(256) |
ipc_fs_stat_req
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| path_len | uint32_t | 文件路径长度 |
| path | char[] | 文件路径,柔性数组 |
ipc_fs_fcreate_req
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| path_len | uint32_t | 文件路径长度 |
| size | uint32_t | 文件大小 |
| path | char[] | 文件路径,柔性数组 |
ipc_fs_fopen_req
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| path_len | uint32_t | 文件路径长度 |
| mode_len | uint32_t | 打开模式字符串长度 |
| str | char[] | 路径与模式字符串,柔性数组 |
ipc_fs_fclose_req
typedef struct {
uint64_t filp;
} ipc_fs_fclose_req, ipc_fs_ftell_req, ipc_fs_feof_req, ipc_fs_ferror_req;
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| filp | uint64_t | 文件指针句柄 |
ipc_fs_fwrite_req
typedef struct {
uint32_t mode;
uint32_t size;
uint32_t nmemb;
uint64_t filp;
uint64_t addr;
uint8_t data[];
} ipc_fs_fwrite_req;
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| mode | uint32_t | 读写模式,参考Macros章节IPC_FS_RW_MODE_* |
| size | uint32_t | 每个数据项大小 |
| nmemb | uint32_t | 数据项数量 |
| filp | uint64_t | 文件指针句柄 |
| addr | uint64_t | 数据地址 |
| data | uint8_t[] | 写入数据,柔性数组 |
ipc_fs_fread_req
typedef struct {
uint32_t mode;
uint32_t size;
uint32_t nmemb;
uint64_t filp;
uint64_t addr;
} ipc_fs_fread_req;
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| mode | uint32_t | 读写模式,参考Macros章节IPC_FS_RW_MODE_* |
| size | uint32_t | 每个数据项大小 |
| nmemb | uint32_t | 数据项数量 |
| filp | uint64_t | 文件指针句柄 |
| addr | uint64_t | 数据地址 |
ipc_fs_fseek_req
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| filp | uint64_t | 文件指针句柄 |
| offset | long int | 偏移量 |
| whence | int | 偏移起始位置 |
ipc_fs_closedir_req
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| dirp | uint64_t | 目录指针句柄 |
ipc_fs_readdir_req
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| dirp | uint64_t | 目录指针句柄 |
| dirent_addr | uint64_t | 目录项存储地址 |
ipc_fs_stat_ack
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| ret | int32_t | 操作返回值 |
| buff | struct stat | 文件状态信息 |
ipc_fs_fopen_ack
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| filp | uint64_t | 打开文件返回的文件指针句柄 |
ipc_fs_opendir_ack
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| dirp | uint64_t | 打开目录返回的目录指针句柄 |
ipc_fs_fclose_ack
typedef struct {
int32_t ret;
} ipc_fs_fclose_ack, ipc_fs_fseek_ack, ipc_fs_feof_ack, ipc_fs_ferror_ack, ipc_fs_closedir_ack, ipc_fs_fcreate_ack;
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| ret | int32_t | 操作返回值 |
ipc_fs_ftell_ack
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| offset | long int | 当前文件位置指针偏移量 |
ipc_fs_fwrite_ack
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| size | uint32_t | 实际写入的数据项数量 |
ipc_fs_fread_ack
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| size | uint32_t | 实际读取的数据项数量 |
| data | uint8_t[] | 读取的数据内容,柔性数组 |
ipc_fs_readdir_ack
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| is_null | int32_t | 目录项是否为空,0表示非空,非0表示已无更多目录项 |
| dirent | ipc_fs_dirent | 目录项信息 |
ipc_fs_req
#pragma pack(1)
typedef struct {
uint8_t src_core;
uint8_t op_type;
uint16_t length;
union {
ipc_fs_stat_req stat_req;
ipc_fs_fcreate_req fcreate_req;
ipc_fs_fopen_req fopen_req;
ipc_fs_fclose_req fclose_req;
ipc_fs_fwrite_req fwrite_req;
ipc_fs_fread_req fread_req;
ipc_fs_fseek_req fseek_req;
ipc_fs_ftell_req ftell_req;
ipc_fs_feof_req feof_req;
ipc_fs_ferror_req ferror_req;
ipc_fs_opendir_req opendir_req;
ipc_fs_closedir_req closedir_req;
ipc_fs_readdir_req readdir_req;
} req;
} ipc_fs_req;
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| src_core | uint8_t | 源核心编号 |
| op_type | uint8_t | 操作类型,参考ipc_fs_op |
| length | uint16_t | 消息载荷长度 |
| req | union | 请求联合体,包含各操作类型的请求结构 |
ipc_fs_ack
typedef struct {
uint8_t src_core;
uint8_t op_type;
uint16_t length;
union {
ipc_fs_stat_ack stat_ack;
ipc_fs_fcreate_ack fcreate_ack;
ipc_fs_fopen_ack fopen_ack;
ipc_fs_fclose_ack fclose_ack;
ipc_fs_fwrite_ack fwrite_ack;
ipc_fs_fseek_ack fseek_ack;
ipc_fs_ftell_ack ftell_ack;
ipc_fs_feof_ack feof_ack;
ipc_fs_ferror_ack ferror_ack;
ipc_fs_opendir_ack opendir_ack;
ipc_fs_closedir_ack closedir_ack;
ipc_fs_readdir_ack readdir_ack;
ipc_fs_fread_ack fread_ack;
} ack;
} ipc_fs_ack;
#pragma pack()
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| src_core | uint8_t | 源核心编号 |
| op_type | uint8_t | 操作类型,参考ipc_fs_op |
| length | uint16_t | 消息载荷长度 |
| ack | union | 应答联合体,包含各操作类型的应答结构 |