更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
hm_liteipc.h 文件参考

浏览源代码.

结构体

struct  HandleInfo
 
struct  IpcPool
 LiteIPC的核心思想就是在内核态为每个Service任务维护一个IPC消息队列,该消息队列通过LiteIPC设备文件向上层 用户态程序分别提供代表收取IPC消息的读操作和代表发送IPC消息的写操作。 更多...
 
struct  ProcIpcInfo
 进程IPC信息,见于进程结构体: LosProcessCB.ipcInfo 更多...
 
struct  IpcTaskInfo
 
struct  BuffPtr
 
struct  SvcIdentity
 SVC(service)服务身份证 更多...
 
union  ObjContent
 对象内容体,注意是个联合体 更多...
 
struct  SpecialObj
 指定对象 更多...
 
struct  IpcVersion
 
struct  CmsCmdContent
 
struct  IpcMsg
 
struct  IpcListNode
 
struct  IpcContent
 IPC消息内容结构体,记录消息周期 更多...
 

枚举

enum  HandleStatus { HANDLE_NOT_USED , HANDLE_REGISTING , HANDLE_REGISTED }
 句柄状态 更多...
 
enum  ObjType { OBJ_FD , OBJ_PTR , OBJ_SVC }
 
enum  MsgType {
  MT_REQUEST , MT_REPLY , MT_FAILED_REPLY , MT_DEATH_NOTIFY ,
  MT_NUM
}
 消息的类型 更多...
 
enum  CmsCmd { CMS_GEN_HANDLE , CMS_REMOVE_HANDLE , CMS_ADD_ACCESS }
 
enum  IpcFlag { LITEIPC_FLAG_DEFAULT = 0 , LITEIPC_FLAG_ONEWAY }
 

函数

UINT32 OsLiteIpcInit (VOID)
 OsLiteIpcInit 初始化LiteIPC模块 更多...
 
ProcIpcInfoLiteIpcPoolReInit (const ProcIpcInfo *parentIpcInfo)
 LiteIpcPoolReInit 重新初始化进程的IPC消息内存池 更多...
 
VOID LiteIpcRemoveServiceHandle (UINT32 taskID)
 删除指定的Service 更多...
 
UINT32 LiteIpcPoolDestroy (UINT32 processID)
 销毁指定进程的IPC池 更多...
 

枚举类型说明

◆ CmsCmd

enum CmsCmd
枚举值
CMS_GEN_HANDLE 

创建/注册服务

CMS_REMOVE_HANDLE 

删除服务

CMS_ADD_ACCESS 

为服务添加权限

在文件 hm_liteipc.h154 行定义.

154 {//CMS 命令类型
155 CMS_GEN_HANDLE, ///< 创建/注册服务
156 CMS_REMOVE_HANDLE, ///< 删除服务
157 CMS_ADD_ACCESS ///< 为服务添加权限
158} CmsCmd;
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

◆ HandleStatus

句柄状态

枚举值
HANDLE_NOT_USED 

未使用

HANDLE_REGISTING 

注册中

HANDLE_REGISTED 

已注册

在文件 hm_liteipc.h61 行定义.

61 {
62 HANDLE_NOT_USED, ///< 未使用
63 HANDLE_REGISTING, ///< 注册中
64 HANDLE_REGISTED ///< 已注册
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

◆ IpcFlag

enum IpcFlag
枚举值
LITEIPC_FLAG_DEFAULT 
LITEIPC_FLAG_ONEWAY 

在文件 hm_liteipc.h166 行定义.

166 {
167 LITEIPC_FLAG_DEFAULT = 0, // send and reply | 发送并回复
168 LITEIPC_FLAG_ONEWAY, // send message only | 仅发送信息
169} IpcFlag;
IpcFlag
Definition: hm_liteipc.h:166
@ LITEIPC_FLAG_ONEWAY
Definition: hm_liteipc.h:168
@ LITEIPC_FLAG_DEFAULT
Definition: hm_liteipc.h:167

◆ MsgType

enum MsgType

消息的类型

枚举值
MT_REQUEST 

请求

MT_REPLY 

回复

MT_FAILED_REPLY 

回复失败

MT_DEATH_NOTIFY 

死亡通知

MT_NUM 

在文件 hm_liteipc.h135 行定义.

135 {
136 MT_REQUEST, ///< 请求
137 MT_REPLY, ///< 回复
138 MT_FAILED_REPLY,///< 回复失败
139 MT_DEATH_NOTIFY,///< 死亡通知
140 MT_NUM
141} MsgType;
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

◆ ObjType

enum ObjType
枚举值
OBJ_FD 

文件句柄

OBJ_PTR 

指针

OBJ_SVC 

服务

在文件 hm_liteipc.h104 行定义.

104 {
105 OBJ_FD, ///< 文件句柄
106 OBJ_PTR, ///< 指针
107 OBJ_SVC ///< 服务
108} ObjType;
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

函数说明

◆ LiteIpcPoolDestroy()

UINT32 LiteIpcPoolDestroy ( UINT32  processID)

销毁指定进程的IPC池

在文件 hm_liteipc.c386 行定义.

387{
388 LosProcessCB *pcb = OS_PCB_FROM_PID(processID);
389
390 if (pcb->ipcInfo == NULL) {
391 return LOS_NOK;
392 }
393
396 pcb->ipcInfo = NULL;
397 return LOS_OK;
398}
UINT8 * m_aucSysMem1
系统动态内存池地址的起始地址 @note_thinking 能否不要用 0,1来命名核心变量 ???
Definition: los_memory.c:108
UINT32 LOS_MemFree(VOID *pool, VOID *ptr)
释放从指定动态内存中申请的内存
Definition: los_memory.c:1369
STATIC VOID LiteIpcPoolDelete(ProcIpcInfo *ipcInfo, UINT32 processID)
释放进程的IPC消息内存池
Definition: hm_liteipc.c:360
UINT32 processID
ProcIpcInfo * ipcInfo
函数调用图:
这是这个函数的调用关系图:

◆ LiteIpcPoolReInit()

ProcIpcInfo * LiteIpcPoolReInit ( const ProcIpcInfo parent)

LiteIpcPoolReInit 重新初始化进程的IPC消息内存池

参数
parent
返回
参见

在文件 hm_liteipc.c346 行定义.

347{
348 ProcIpcInfo *ipcInfo = LiteIpcPoolCreate();
349 if (ipcInfo == NULL) {
350 return NULL;
351 }
352
353 ipcInfo->pool.uvaddr = parent->pool.uvaddr;//用户空间地址继续沿用
354 ipcInfo->pool.kvaddr = NULL;
355 ipcInfo->pool.poolSize = 0;
356 ipcInfo->ipcTaskID = INVAILD_ID;
357 return ipcInfo;
358}
STATIC ProcIpcInfo * LiteIpcPoolCreate(VOID)
创建IPC消息内存池
Definition: hm_liteipc.c:325
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
进程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
函数调用图:
这是这个函数的调用关系图:

◆ LiteIpcRemoveServiceHandle()

VOID LiteIpcRemoveServiceHandle ( UINT32  taskID)

删除指定的Service

在文件 hm_liteipc.c661 行定义.

662{
663 UINT32 j;
664 LosTaskCB *taskCB = OS_TCB_FROM_TID(taskID);
665 IpcTaskInfo *ipcTaskInfo = taskCB->ipcTaskInfo;
666 if (ipcTaskInfo == NULL) {
667 return;
668 }
669
670#if (USE_TASKID_AS_HANDLE == 1) // 任务ID当做句柄使用
671
672 UINT32 intSave;
673 LOS_DL_LIST *listHead = NULL;
674 LOS_DL_LIST *listNode = NULL;
675 IpcListNode *node = NULL;
676 UINT32 processID = taskCB->processID;
677
678 listHead = &(ipcTaskInfo->msgListHead);// ipc 节点链表
679 do {// 循环删除 任务IPC上挂的各个节点
680 SCHEDULER_LOCK(intSave);
681 if (LOS_ListEmpty(listHead)) {//空判
682 SCHEDULER_UNLOCK(intSave);
683 break;
684 } else {
685 listNode = LOS_DL_LIST_FIRST(listHead); //拿到首个节点
686 LOS_ListDelete(listNode); //删除节点
687 node = LOS_DL_LIST_ENTRY(listNode, IpcListNode, listNode);//获取节点所在结构体 IpcListNode
688 SCHEDULER_UNLOCK(intSave);
689 (VOID)HandleSpecialObjects(taskCB->taskID, node, TRUE);//处理节点
690 (VOID)LiteIpcNodeFree(processID, (VOID *)node);//释放节点占用的进程空间
691 }
692 } while (1);
693
694 ipcTaskInfo->accessMap[processID] = FALSE;
695 for (j = 0; j < MAX_SERVICE_NUM; j++) {
696 if (ipcTaskInfo->accessMap[j] == TRUE) {
697 ipcTaskInfo->accessMap[j] = FALSE;
698 (VOID)SendDeathMsg(j, taskCB->taskID); //给进程发送taskCB死亡的消息
699 }
700 }
701#else
702 (VOID)LOS_MuxLock(&g_serviceHandleMapMux, LOS_WAIT_FOREVER);
703 for (UINT32 i = 1; i < MAX_SERVICE_NUM; i++) {
704 if ((g_serviceHandleMap[i].status != HANDLE_NOT_USED) && (g_serviceHandleMap[i].taskID == taskCB->taskID)) {
706 g_serviceHandleMap[i].taskID = INVAILD_ID;
707 break;
708 }
709 }
711 /* run deathHandler */
712 if (i < MAX_SERVICE_NUM) {
713 for (j = 0; j < MAX_SERVICE_NUM; j++) {
714 if (ipcTaskInfo->accessMap[j] == TRUE) {
715 (VOID)SendDeathMsg(j, i);
716 }
717 }
718 }
719#endif
720
721 (VOID)LOS_MemFree(m_aucSysMem1, ipcTaskInfo);
722 taskCB->ipcTaskInfo = NULL;
723}
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListDelete(LOS_DL_LIST *node)
Definition: los_list.h:292
LITE_OS_SEC_ALW_INLINE STATIC INLINE BOOL LOS_ListEmpty(LOS_DL_LIST *list)
Identify whether a specified doubly linked list is empty. | 判断链表是否为空
Definition: los_list.h:321
LITE_OS_SEC_TEXT UINT32 LOS_MuxUnlock(LosMux *mutex)
释放锁
Definition: los_mux.c:559
LITE_OS_SEC_TEXT UINT32 LOS_MuxLock(LosMux *mutex, UINT32 timeout)
拿互斥锁,
Definition: los_mux.c:437
STATIC HandleInfo g_serviceHandleMap[MAX_SERVICE_NUM]
g_serviceHandleMap[0]为ServiceManager,这块鸿蒙的设计挺怪的,让人很懵逼
Definition: hm_liteipc.c:115
LITE_OS_SEC_TEXT STATIC UINT32 LiteIpcNodeFree(UINT32 processID, VOID *buf)
从IPC内存池中释放一个IPC节点
Definition: hm_liteipc.c:435
LITE_OS_SEC_TEXT STATIC UINT32 SendDeathMsg(UINT32 processID, UINT32 serviceHandle)
serviceHandle 给 processID 发送死亡/结束消息, serviceHandle 为 taskID
Definition: hm_liteipc.c:633
STATIC UINT32 HandleSpecialObjects(UINT32 dstTid, IpcListNode *node, BOOL isRollback)
Definition: hm_liteipc.c:912
STATIC LosMux g_serviceHandleMapMux
Definition: hm_liteipc.c:111
unsigned int UINT32
Definition: los_typedef.h:57
HandleStatus status
状态
Definition: hm_liteipc.h:72
UINT32 taskID
任务ID,以任务标识句柄
Definition: hm_liteipc.h:73
BOOL accessMap[LOSCFG_BASE_CORE_TSK_LIMIT]
任务是否可以给其他进程发送IPC消息
Definition: hm_liteipc.h:100
LOS_DL_LIST msgListHead
上面挂的是一个个的 ipc节点 上面挂 IpcListNode,申请IpcListNode的内存来自进程IPC内存池
Definition: hm_liteipc.h:99
IpcTaskInfo * ipcTaskInfo
任务间通讯信息结构体
UINT32 taskID
UINT32 processID
函数调用图:
这是这个函数的调用关系图:

◆ OsLiteIpcInit()

UINT32 OsLiteIpcInit ( VOID  )

OsLiteIpcInit 初始化LiteIPC模块

返回
参见

在文件 hm_liteipc.c147 行定义.

148{
149 UINT32 ret;
150#if (USE_TASKID_AS_HANDLE == 1) //两种管理方式,一种是 任务ID == service ID
151 g_cmsTask.status = HANDLE_NOT_USED;//默认未使用
152#else
153 (void)memset_s(g_serviceHandleMap, sizeof(g_serviceHandleMap), 0, sizeof(g_serviceHandleMap));
154#endif
156 if (ret != LOS_OK) {
157 return ret;
158 }
159 ret = (UINT32)register_driver(LITEIPC_DRIVER, &g_liteIpcFops, LITEIPC_DRIVER_MODE, NULL);//注册字符驱动程序,从此支持文件访问LiteIpc
160 if (ret != LOS_OK) {
161 PRINT_ERR("register lite_ipc driver failed:%d\n", ret);
162 }
164
165 return ret;
166}
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListInit(LOS_DL_LIST *list)
Definition: los_list.h:104
LITE_OS_SEC_TEXT UINT32 LOS_MuxInit(LosMux *mutex, const LosMuxAttr *attr)
初始化互斥锁
Definition: los_mux.c:262
STATIC LOS_DL_LIST g_ipcPendlist
挂起/待办链表,上面挂等待读/写消息的任务LosTaskCB
Definition: hm_liteipc.c:117
STATIC HandleInfo g_cmsTask
整个系统只能有一个ServiceManager
Definition: hm_liteipc.c:113
STATIC const struct file_operations_vfs g_liteIpcFops
Definition: hm_liteipc.c:133
ARG_NUM_3 ARG_NUM_1 ARG_NUM_2 ARG_NUM_2 ARG_NUM_3 ARG_NUM_1 ARG_NUM_4 ARG_NUM_2 ARG_NUM_2 ARG_NUM_5 ARG_NUM_2 void
函数调用图: