更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
hm_liteipc.h
浏览该文件的文档.
1/*
2 * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
3 * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without modification,
6 * are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice, this list of
9 * conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright notice, this list
12 * of conditions and the following disclaimer in the documentation and/or other materials
13 * provided with the distribution.
14 *
15 * 3. Neither the name of the copyright holder nor the names of its contributors may be used
16 * to endorse or promote products derived from this software without specific prior written
17 * permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
26 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
27 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
28 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
29 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32#ifndef HM_LITEIPC_H
33#define HM_LITEIPC_H
34
35#include "sys/ioctl.h"
36#include "los_config.h"
37#include "los_typedef.h"
38#include "los_vm_map.h"
39
40#ifdef __cplusplus
41#if __cplusplus
42extern "C" {
43#endif /* __cplusplus */
44#endif /* __cplusplus */
45
46/**
47 * @brief 什么是句柄?
48
49从形象意义的理解,跟门的把柄一样,握住门柄就控制了整个大门.句柄是给用户程序使用的一个数字凭证,
50能以小博大,通过句柄能牵动内核模块工作.
51 */
52#define LITEIPC_DRIVER "/dev/lite_ipc" ///< 虚拟设备,文件访问读取
53#define LITEIPC_DRIVER_MODE 0644 ///< 对虚拟设备的访问权限 110100100 表示只有所属用户才有读写权限,其余都只能读
54#define MAX_SERVICE_NUM LOSCFG_BASE_CORE_TSK_LIMIT ///< 最大服务数等于任务数 默认128
55#define USE_TIMESTAMP 1 ///< 使用时间戳
56
57/**
58 * @enum HandleStatus
59 * @brief 句柄状态
60 */
61typedef enum {
62 HANDLE_NOT_USED, ///< 未使用
63 HANDLE_REGISTING, ///< 注册中
64 HANDLE_REGISTED ///< 已注册
66
67/**
68 * @struct HandleStatus
69 * @brief 句柄信息
70 */
71typedef struct {
72 HandleStatus status; ///< 状态
73 UINT32 taskID; ///< 任务ID,以任务标识句柄
74 UINTPTR maxMsgSize; ///< 最大消息大小
76
77/**
78 * @struct IpcPool | ipc池
79 * @brief LiteIPC的核心思想就是在内核态为每个Service任务维护一个IPC消息队列,该消息队列通过LiteIPC设备文件向上层
80 * 用户态程序分别提供代表收取IPC消息的读操作和代表发送IPC消息的写操作。
81 */
82typedef struct {//用户空间和内核空间的消息传递通过偏移量计算
83 VOID *uvaddr; ///< 用户空间地址,由kvaddr映射而来的地址,这两个地址的关系一定要搞清楚,否则无法理解IPC的核心思想
84 VOID *kvaddr; ///< 内核空间地址,IPC申请的是内核空间,但是会通过 DoIpcMmap 将这个地址映射到用户空间
85 UINT32 poolSize; ///< ipc池大小
86} IpcPool;
87
88/**
89 * @struct ProcIpcInfo
90 * @brief 进程IPC信息,见于进程结构体: LosProcessCB.ipcInfo
91 */
92typedef struct {
93 IpcPool pool; ///< ipc内存池,IPC操作所有涉及内核空间分配的内存均有此池提供
94 UINT32 ipcTaskID; ///< 指定能ServiceManager的任务ID
95 LOS_DL_LIST ipcUsedNodelist;///< 已使用节点链表,上面挂 IpcUsedNode 节点, 申请IpcUsedNode的内存来自内核堆空间
96 UINT32 access[LOSCFG_BASE_CORE_TSK_LIMIT]; ///< 允许进程通过IPC访问哪些任务
98typedef struct {
99 LOS_DL_LIST msgListHead;///< 上面挂的是一个个的 ipc节点 上面挂 IpcListNode,申请IpcListNode的内存来自进程IPC内存池
100 BOOL accessMap[LOSCFG_BASE_CORE_TSK_LIMIT]; ///< 此处是不是应该用 LOSCFG_BASE_CORE_PROCESS_LIMIT ? @note_thinking
101 ///< 任务是否可以给其他进程发送IPC消息
103
104typedef enum {
105 OBJ_FD, ///< 文件句柄
106 OBJ_PTR, ///< 指针
107 OBJ_SVC ///< 服务
109
110typedef struct {
111 UINT32 buffSz; ///< 大小
112 VOID *buff; ///< 内容 内核需要将内容从用户空间拷贝到内核空间的动作
113} BuffPtr;
114/// SVC(service)服务身份证
115typedef struct {
116 UINT32 handle; //service 服务ID, 范围[0,最大任务ID]
118 UINT32 cookie; //由应用层带入
120/// 对象内容体,注意是个联合体
121typedef union {
122 UINT32 fd; ///< 文件描述符
123 BuffPtr ptr; ///< 缓存的开始地址,即:指针,消息从用户空间来时,要将内容拷贝到内核空间
124 SvcIdentity svc; ///< 服务,用于设置访问权限
125} ObjContent;
126/// 指定对象
127typedef struct { // IpcMsg->data 包含三种子消息,也要将它们读到内核空间
128 ObjType type; ///< 类型
129 ObjContent content;///< 内容
130} SpecialObj;
131
132/**
133 * @brief 消息的类型
134 */
135typedef enum {
136 MT_REQUEST, ///< 请求
137 MT_REPLY, ///< 回复
138 MT_FAILED_REPLY,///< 回复失败
139 MT_DEATH_NOTIFY,///< 死亡通知
140 MT_NUM
142
143typedef struct {
145} IpcVersion;
146/* lite ipc ioctl | 控制命令*/
147#define IPC_IOC_MAGIC 'i'
148#define IPC_SET_CMS _IO(IPC_IOC_MAGIC, 1) ///< 设置ServiceManager的命令
149#define IPC_CMS_CMD _IOWR(IPC_IOC_MAGIC, 2, CmsCmdContent)///< 控制命令,创建/删除 服务 添加服务权限
150#define IPC_SET_IPC_THREAD _IO(IPC_IOC_MAGIC, 3) ///< 为进程设置IPC任务
151#define IPC_SEND_RECV_MSG _IOWR(IPC_IOC_MAGIC, 4, IpcContent) ///< 对IPC的读写处理
152#define IPC_GET_VERSION _IOR(IPC_IOC_MAGIC, 5, IpcVersion)
153
154typedef enum {//CMS 命令类型
155 CMS_GEN_HANDLE, ///< 创建/注册服务
156 CMS_REMOVE_HANDLE, ///< 删除服务
157 CMS_ADD_ACCESS ///< 为服务添加权限
159
160typedef struct {//命令结构体
161 CmsCmd cmd; ///< 命令 例如注册命令:给taskID注册一个serviceHandle返回用户空间
162 UINT32 taskID; ///< 任务ID
163 UINT32 serviceHandle;///< 服务ID
165
166typedef enum {
167 LITEIPC_FLAG_DEFAULT = 0, // send and reply | 发送并回复
168 LITEIPC_FLAG_ONEWAY, // send message only | 仅发送信息
169} IpcFlag;
170
171typedef struct {//IPC 消息结构体
172 MsgType type; /**< cmd type, decide the data structure below | 命令类型,决定下面的数据结构*/
173 SvcIdentity target; /**< serviceHandle or targetTaskId, depending on type | 因命令类型不同而异*/
174 UINT32 code; /**< service function code | 服务功能代码*/
175 UINT32 flag; ///< 标签
176#if (USE_TIMESTAMP == 1)
177 UINT64 timestamp; ///< 时间戳,用于验证
178#endif
179 UINT32 dataSz; /**< size of data | 消息内容大小*/
180 VOID *data; ///< 消息的内容,真正要传递的消息,这个数据内容是指spObjNum个数据的内容,定位就靠offsets
181 UINT32 spObjNum; ///< 对象数量, 例如 spObjNum = 3时,offsets = [0,35,79],代表从data中读取 0 - 35给第一个对象,依次类推
182 VOID *offsets; ///< 偏移量,注意这里有多少个spObjNum就会有多少个偏移量,详见 CopyDataFromUser 来理解
183 UINT32 processID; /**< filled by kernel, processId of sender/reciever | 由内核提供,发送/接收消息的进程ID*/
184 UINT32 taskID; /**< filled by kernel, taskId of sender/reciever | 由内核提供,发送/接收消息的任务ID*/
185#ifdef LOSCFG_SECURITY_CAPABILITY
186 UINT32 userID; ///< 用户ID
187 UINT32 gid; ///< 组ID
188#endif
189} IpcMsg;
190
191typedef struct { //IPC 内容节点
192 IpcMsg msg; ///< 内容体
193 LOS_DL_LIST listNode; ///< 通过它挂到LosTaskCB.msgListHead链表上
195
196#define SEND (1 << 0) ///< 发送
197#define RECV (1 << 1) ///< 接收
198#define BUFF_FREE (1 << 2) ///< 空闲状态
199
200/**
201 * @brief IPC消息内容结构体,记录消息周期
202 */
203typedef struct {
204 UINT32 flag; /**< size of writeData | IPC标签 (SEND,RECV,BUFF_FREE)*/
205 IpcMsg *outMsg; /**< data to send to target | 发给目标任务的消息内容*/
206 IpcMsg *inMsg; /**< data reply by target | 目标任务回复的消息内容*/
208} IpcContent;
209
210/* init liteipc driver */
211extern UINT32 OsLiteIpcInit(VOID);
212
213/* reinit process liteipc memory pool, using in fork situation */
214extern ProcIpcInfo *LiteIpcPoolReInit(const ProcIpcInfo *parentIpcInfo);
215
216/* remove service handle and send death notify */
217extern VOID LiteIpcRemoveServiceHandle(UINT32 taskID);
218
219extern UINT32 LiteIpcPoolDestroy(UINT32 processID);
220
221#ifdef __cplusplus
222#if __cplusplus
223}
224#endif /* __cplusplus */
225#endif /* __cplusplus */
226
227#endif
ProcIpcInfo * LiteIpcPoolReInit(const ProcIpcInfo *parentIpcInfo)
LiteIpcPoolReInit 重新初始化进程的IPC消息内存池
Definition: hm_liteipc.c:346
ObjType
Definition: hm_liteipc.h:104
@ OBJ_PTR
指针
Definition: hm_liteipc.h:106
@ OBJ_FD
文件句柄
Definition: hm_liteipc.h:105
@ OBJ_SVC
服务
Definition: hm_liteipc.h:107
MsgType
消息的类型
Definition: hm_liteipc.h:135
@ MT_NUM
Definition: hm_liteipc.h:140
@ MT_FAILED_REPLY
回复失败
Definition: hm_liteipc.h:138
@ MT_DEATH_NOTIFY
死亡通知
Definition: hm_liteipc.h:139
@ MT_REPLY
回复
Definition: hm_liteipc.h:137
@ MT_REQUEST
请求
Definition: hm_liteipc.h:136
UINT32 LiteIpcPoolDestroy(UINT32 processID)
销毁指定进程的IPC池
Definition: hm_liteipc.c:386
IpcFlag
Definition: hm_liteipc.h:166
@ LITEIPC_FLAG_ONEWAY
Definition: hm_liteipc.h:168
@ LITEIPC_FLAG_DEFAULT
Definition: hm_liteipc.h:167
UINT32 OsLiteIpcInit(VOID)
OsLiteIpcInit 初始化LiteIPC模块
Definition: hm_liteipc.c:147
CmsCmd
Definition: hm_liteipc.h:154
@ CMS_REMOVE_HANDLE
删除服务
Definition: hm_liteipc.h:156
@ CMS_GEN_HANDLE
创建/注册服务
Definition: hm_liteipc.h:155
@ CMS_ADD_ACCESS
为服务添加权限
Definition: hm_liteipc.h:157
VOID LiteIpcRemoveServiceHandle(UINT32 taskID)
删除指定的Service
Definition: hm_liteipc.c:661
HandleStatus
句柄状态
Definition: hm_liteipc.h:61
@ HANDLE_REGISTED
已注册
Definition: hm_liteipc.h:64
@ HANDLE_REGISTING
注册中
Definition: hm_liteipc.h:63
@ HANDLE_NOT_USED
未使用
Definition: hm_liteipc.h:62
long unsigned int UINT64
Definition: los_typedef.h:66
unsigned long UINTPTR
Definition: los_typedef.h:68
unsigned int UINT32
Definition: los_typedef.h:57
size_t BOOL
Definition: los_typedef.h:88
VOID * buff
内容 内核需要将内容从用户空间拷贝到内核空间的动作
Definition: hm_liteipc.h:112
UINT32 buffSz
大小
Definition: hm_liteipc.h:111
UINT32 serviceHandle
服务ID
Definition: hm_liteipc.h:163
CmsCmd cmd
命令 例如注册命令:给taskID注册一个serviceHandle返回用户空间
Definition: hm_liteipc.h:161
UINT32 taskID
任务ID
Definition: hm_liteipc.h:162
UINTPTR maxMsgSize
最大消息大小
Definition: hm_liteipc.h:74
HandleStatus status
状态
Definition: hm_liteipc.h:72
UINT32 taskID
任务ID,以任务标识句柄
Definition: hm_liteipc.h:73
句柄信息
IPC消息内容结构体,记录消息周期
Definition: hm_liteipc.h:203
VOID * buffToFree
Definition: hm_liteipc.h:207
UINT32 flag
Definition: hm_liteipc.h:204
IpcMsg * outMsg
Definition: hm_liteipc.h:205
IpcMsg * inMsg
Definition: hm_liteipc.h:206
LOS_DL_LIST listNode
通过它挂到LosTaskCB.msgListHead链表上
Definition: hm_liteipc.h:193
IpcMsg msg
内容体
Definition: hm_liteipc.h:192
UINT32 spObjNum
对象数量, 例如 spObjNum = 3时,offsets = [0,35,79],代表从data中读取 0 - 35给第一个对象,依次类推
Definition: hm_liteipc.h:181
SvcIdentity target
Definition: hm_liteipc.h:173
UINT32 gid
组ID
Definition: hm_liteipc.h:187
MsgType type
Definition: hm_liteipc.h:172
UINT32 dataSz
Definition: hm_liteipc.h:179
UINT32 code
Definition: hm_liteipc.h:174
VOID * data
消息的内容,真正要传递的消息,这个数据内容是指spObjNum个数据的内容,定位就靠offsets
Definition: hm_liteipc.h:180
UINT32 flag
标签
Definition: hm_liteipc.h:175
UINT64 timestamp
时间戳,用于验证
Definition: hm_liteipc.h:177
VOID * offsets
偏移量,注意这里有多少个spObjNum就会有多少个偏移量,详见 CopyDataFromUser 来理解
Definition: hm_liteipc.h:182
UINT32 userID
用户ID
Definition: hm_liteipc.h:186
UINT32 processID
Definition: hm_liteipc.h:183
UINT32 taskID
Definition: hm_liteipc.h:184
LiteIPC的核心思想就是在内核态为每个Service任务维护一个IPC消息队列,该消息队列通过LiteIPC设备文件向上层 用户态程序分别提供代表收取IPC消息的读操作和代表发送IPC消息的写操作。
Definition: hm_liteipc.h:82
UINT32 poolSize
ipc池大小
Definition: hm_liteipc.h:85
VOID * uvaddr
用户空间地址,由kvaddr映射而来的地址,这两个地址的关系一定要搞清楚,否则无法理解IPC的核心思想
Definition: hm_liteipc.h:83
VOID * kvaddr
内核空间地址,IPC申请的是内核空间,但是会通过 DoIpcMmap 将这个地址映射到用户空间
Definition: hm_liteipc.h:84
LOS_DL_LIST msgListHead
上面挂的是一个个的 ipc节点 上面挂 IpcListNode,申请IpcListNode的内存来自进程IPC内存池
Definition: hm_liteipc.h:99
int32_t driverVersion
Definition: hm_liteipc.h:144
进程IPC信息,见于进程结构体: LosProcessCB.ipcInfo
Definition: hm_liteipc.h:92
IpcPool pool
ipc内存池,IPC操作所有涉及内核空间分配的内存均有此池提供
Definition: hm_liteipc.h:93
UINT32 ipcTaskID
指定能ServiceManager的任务ID
Definition: hm_liteipc.h:94
LOS_DL_LIST ipcUsedNodelist
已使用节点链表,上面挂 IpcUsedNode 节点, 申请IpcUsedNode的内存来自内核堆空间
Definition: hm_liteipc.h:95
指定对象
Definition: hm_liteipc.h:127
ObjType type
类型
Definition: hm_liteipc.h:128
ObjContent content
内容
Definition: hm_liteipc.h:129
SVC(service)服务身份证
Definition: hm_liteipc.h:115
UINT32 cookie
Definition: hm_liteipc.h:118
UINT32 token
Definition: hm_liteipc.h:117
UINT32 handle
Definition: hm_liteipc.h:116
对象内容体,注意是个联合体
Definition: hm_liteipc.h:121
BuffPtr ptr
缓存的开始地址,即:指针,消息从用户空间来时,要将内容拷贝到内核空间
Definition: hm_liteipc.h:123
UINT32 fd
文件描述符
Definition: hm_liteipc.h:122
SvcIdentity svc
服务,用于设置访问权限
Definition: hm_liteipc.h:124
int access(const char *path, int amode)
Definition: vfs_other.c:293