结构体 | |
struct | IpcUsedNode |
注意 ipc节点和消息是两个概念, 一个消息会包含多个节点 更多... | |
函数 | |
SPIN_LOCK_INIT (g_ipcSpin) | |
STATIC int | LiteIpcOpen (struct file *filep) |
LiteIpcOpen 以VFS方式为当前进程创建IPC消息池 更多... | |
STATIC int | LiteIpcClose (struct file *filep) |
STATIC int | LiteIpcIoctl (struct file *filep, int cmd, unsigned long arg) |
真正的 IPC 控制操作 更多... | |
STATIC int | LiteIpcMmap (struct file *filep, LosVmMapRegion *region) |
将参数线性区设为IPC专用区 更多... | |
STATIC UINT32 | LiteIpcWrite (IpcContent *content) |
写IPC消息队列,从用户空间到内核空间 更多... | |
STATIC UINT32 | GetTid (UINT32 serviceHandle, UINT32 *taskID) |
获取任务ID 更多... | |
STATIC UINT32 | HandleSpecialObjects (UINT32 dstTid, IpcListNode *node, BOOL isRollback) |
STATIC ProcIpcInfo * | LiteIpcPoolCreate (VOID) |
创建IPC消息内存池 更多... | |
LITE_OS_SEC_TEXT_INIT UINT32 | OsLiteIpcInit (VOID) |
OsLiteIpcInit 初始化LiteIPC模块 更多... | |
LOS_MODULE_INIT (OsLiteIpcInit, LOS_INIT_LEVEL_KMOD_EXTENDED) | |
LITE_OS_SEC_TEXT STATIC BOOL | IsPoolMapped (ProcIpcInfo *ipcInfo) |
池是否已经映射 更多... | |
LITE_OS_SEC_TEXT STATIC INT32 | DoIpcMmap (LosProcessCB *pcb, LosVmMapRegion *region) |
DoIpcMmap 做IPC层映射,将内核空间虚拟地址映射到用户空间,这样的好处是用户态下操作读写的背后是在读写内核态空间 如此用户地址和内核地址指向同一个物理地址 更多... | |
LITE_OS_SEC_TEXT_INIT STATIC UINT32 | LiteIpcPoolInit (ProcIpcInfo *ipcInfo) |
初始化进程的IPC内存池 更多... | |
LITE_OS_SEC_TEXT ProcIpcInfo * | LiteIpcPoolReInit (const ProcIpcInfo *parent) |
LiteIpcPoolReInit 重新初始化进程的IPC消息内存池 更多... | |
STATIC VOID | LiteIpcPoolDelete (ProcIpcInfo *ipcInfo, UINT32 processID) |
释放进程的IPC消息内存池 更多... | |
LITE_OS_SEC_TEXT UINT32 | LiteIpcPoolDestroy (UINT32 processID) |
销毁指定进程的IPC池 更多... | |
LITE_OS_SEC_TEXT_INIT STATIC IpcTaskInfo * | LiteIpcTaskInit (VOID) |
申请并初始化一个任务IPC 更多... | |
LITE_OS_SEC_TEXT STATIC VOID | EnableIpcNodeFreeByUser (UINT32 processID, VOID *buf) |
LITE_OS_SEC_TEXT STATIC VOID * | LiteIpcNodeAlloc (UINT32 processID, UINT32 size) |
注意这可是从内核空间的IPC池中申请内存 更多... | |
LITE_OS_SEC_TEXT STATIC UINT32 | LiteIpcNodeFree (UINT32 processID, VOID *buf) |
从IPC内存池中释放一个IPC节点 更多... | |
LITE_OS_SEC_TEXT STATIC BOOL | IsIpcNode (UINT32 processID, const VOID *buf) |
指定buf 是否是IPC节点,这个函数不应该命名为 Is...容易误导 ,应改为 Free... @note_thinking 更多... | |
LITE_OS_SEC_TEXT STATIC INTPTR | GetIpcUserAddr (UINT32 processID, INTPTR kernelAddr) |
获得IPC用户空间地址 更多... | |
LITE_OS_SEC_TEXT STATIC INTPTR | GetIpcKernelAddr (UINT32 processID, INTPTR userAddr) |
获得IPC内核空间地址 更多... | |
LITE_OS_SEC_TEXT STATIC UINT32 | CheckUsedBuffer (const VOID *node, IpcListNode **outPtr) |
检查指定地址在当前进程已使用的BUF 更多... | |
LITE_OS_SEC_TEXT STATIC UINT32 | GenerateServiceHandle (UINT32 taskID, HandleStatus status, UINT32 *serviceHandle) |
任务 注册服务,LiteIPC 的核心思想就是在内核态为每个Service 任务维护一个IPC 消息队列, 一个任务可以创建多个服务 更多... | |
LITE_OS_SEC_TEXT STATIC VOID | RefreshServiceHandle (UINT32 serviceHandle, UINT32 result) |
刷新指定服务, 多刷几次状态就变了, result != 0 时,服务停止 更多... | |
LITE_OS_SEC_TEXT STATIC UINT32 | AddServiceAccess (UINT32 taskID, UINT32 serviceHandle) |
AddServiceAccess 配置访问权限,具有两层含义 更多... | |
LITE_OS_SEC_TEXT STATIC BOOL | HasServiceAccess (UINT32 serviceHandle) |
参数服务是否有访问当前进程的权限,实际中会有A进程的任务去给B进程发送IPC信息,所以需要鉴权 更多... | |
LITE_OS_SEC_TEXT STATIC UINT32 | SetIpcTask (VOID) |
将当前任务设置成进程ipc的任务ID 更多... | |
LITE_OS_SEC_TEXT BOOL | IsIpcTaskSet (VOID) |
是否设置ipc任务ID 更多... | |
LITE_OS_SEC_TEXT STATIC UINT32 | GetIpcTaskID (UINT32 processID, UINT32 *ipcTaskID) |
获取IPC任务ID 更多... | |
LITE_OS_SEC_TEXT STATIC UINT32 | SendDeathMsg (UINT32 processID, UINT32 serviceHandle) |
serviceHandle 给 processID 发送死亡/结束消息, serviceHandle 为 taskID 更多... | |
LITE_OS_SEC_TEXT VOID | LiteIpcRemoveServiceHandle (UINT32 taskID) |
删除指定的Service 更多... | |
LITE_OS_SEC_TEXT STATIC UINT32 | SetCms (UINTPTR maxMsgSize) |
设置CMS 更多... | |
LITE_OS_SEC_TEXT STATIC BOOL | IsCmsSet (VOID) |
LITE_OS_SEC_TEXT STATIC BOOL | IsCmsTask (UINT32 taskID) |
指定任务是否为 ServiceManager 更多... | |
LITE_OS_SEC_TEXT STATIC BOOL | IsTaskAlive (UINT32 taskID) |
任务是否活跃 更多... | |
LITE_OS_SEC_TEXT STATIC UINT32 | HandleFd (UINT32 processID, SpecialObj *obj, BOOL isRollback) |
按句柄方式处理, 参数 processID 往往不是当前进程 更多... | |
LITE_OS_SEC_TEXT STATIC UINT32 | HandlePtr (UINT32 processID, SpecialObj *obj, BOOL isRollback) |
按指针方式处理 更多... | |
LITE_OS_SEC_TEXT STATIC UINT32 | HandleSvc (UINT32 dstTid, SpecialObj *obj, BOOL isRollback) |
按服务的方式处理,此处推断 Svc 应该是 service 的简写 @note_thinking 更多... | |
LITE_OS_SEC_TEXT STATIC UINT32 | HandleObj (UINT32 dstTid, SpecialObj *obj, BOOL isRollback) |
创建处理对象,好复杂, 消息套消息 更多... | |
LITE_OS_SEC_TEXT STATIC UINT32 | CheckMsgSize (IpcMsg *msg) |
检查消息内容大小 更多... | |
LITE_OS_SEC_TEXT STATIC UINT32 | CopyDataFromUser (IpcListNode *node, UINT32 bufSz, const IpcMsg *msg) |
LITE_OS_SEC_TEXT STATIC BOOL | IsValidReply (const IpcContent *content) |
是否有效回复 更多... | |
LITE_OS_SEC_TEXT STATIC UINT32 | CheckPara (IpcContent *content, UINT32 *dstTid) |
检查参数,并获取目标 任务ID 更多... | |
LITE_OS_SEC_TEXT STATIC UINT32 | CheckRecievedMsg (IpcListNode *node, IpcContent *content, LosTaskCB *tcb) |
检查收到的消息 更多... | |
LITE_OS_SEC_TEXT STATIC UINT32 | LiteIpcRead (IpcContent *content) |
读取IPC消息 更多... | |
LITE_OS_SEC_TEXT STATIC UINT32 | LiteIpcMsgHandle (IpcContent *con) |
处理 IPC 消息 更多... | |
LITE_OS_SEC_TEXT STATIC UINT32 | HandleCmsCmd (CmsCmdContent *content) |
处理命令 更多... | |
LITE_OS_SEC_TEXT STATIC UINT32 | HandleGetVersion (IpcVersion *version) |
变量 | |
STATIC LosMux | g_serviceHandleMapMux |
STATIC HandleInfo | g_cmsTask |
整个系统只能有一个ServiceManager 更多... | |
STATIC HandleInfo | g_serviceHandleMap [MAX_SERVICE_NUM] |
g_serviceHandleMap[0]为ServiceManager,这块鸿蒙的设计挺怪的,让人很懵逼 更多... | |
STATIC LOS_DL_LIST | g_ipcPendlist |
挂起/待办链表,上面挂等待读/写消息的任务LosTaskCB 更多... | |
STATIC const struct file_operations_vfs | g_liteIpcFops |
轻量级进程间通信 http://weharmonyos.com/openharmony/zh-cn/device-dev/kernel/kernel-small-bundles-ipc.html
基本概念 LiteIPC是OpenHarmony LiteOS-A内核提供的一种新型IPC(Inter-Process Communication,即进程间通信)机制, 不同于传统的System V IPC机制,LiteIPC主要是为RPC(Remote Procedure Call,即远程过程调用)而设计的, 而且是通过设备文件的方式对上层提供接口的,而非传统的API函数方式。 LiteIPC中有两个主要概念,一个是ServiceManager,另一个是Service。整个系统只能有一个ServiceManager, 而Service可以有多个。ServiceManager有两个主要功能:一是负责Service的注册和注销,二是负责管理Service的 访问权限(只有有权限的任务(Task)可以向对应的Service发送IPC消息)。 运行机制 首先将需要接收IPC消息的任务通过ServiceManager注册成为一个Service,然后通过ServiceManager为该Service 任务配置访问权限,即指定哪些任务可以向该Service任务发送IPC消息。LiteIPC的核心思想就是在内核态为 每个Service任务维护一个IPC消息队列,该消息队列通过LiteIPC设备文件向上层用户态程序分别提供代表收取 IPC消息的读操作和代表发送IPC消息的写操作。
在文件 hm_liteipc.c 中定义.
AddServiceAccess 配置访问权限,具有两层含义
serviceHandle | 服务ID |
taskID |
在文件 hm_liteipc.c 第 559 行定义.
LITE_OS_SEC_TEXT STATIC UINT32 CheckPara | ( | IpcContent * | content, |
UINT32 * | dstTid | ||
) |
检查参数,并获取目标 任务ID
在文件 hm_liteipc.c 第 1049 行定义.
LITE_OS_SEC_TEXT STATIC UINT32 CheckRecievedMsg | ( | IpcListNode * | node, |
IpcContent * | content, | ||
LosTaskCB * | tcb | ||
) |
检查收到的消息
在文件 hm_liteipc.c 第 1180 行定义.
LITE_OS_SEC_TEXT STATIC UINT32 CheckUsedBuffer | ( | const VOID * | node, |
IpcListNode ** | outPtr | ||
) |
检查指定地址在当前进程已使用的BUF
在文件 hm_liteipc.c 第 474 行定义.
LITE_OS_SEC_TEXT STATIC UINT32 CopyDataFromUser | ( | IpcListNode * | node, |
UINT32 | bufSz, | ||
const IpcMsg * | msg | ||
) |
在文件 hm_liteipc.c 第 986 行定义.
LITE_OS_SEC_TEXT STATIC INT32 DoIpcMmap | ( | LosProcessCB * | pcb, |
LosVmMapRegion * | region | ||
) |
DoIpcMmap
做IPC层映射,将内核空间虚拟地址映射到用户空间,这样的好处是用户态下操作读写的背后是在读写内核态空间 如此用户地址和内核地址指向同一个物理地址
pcb | |
region |
在文件 hm_liteipc.c 第 214 行定义.
LITE_OS_SEC_TEXT STATIC VOID EnableIpcNodeFreeByUser | ( | UINT32 | processID, |
VOID * | buf | ||
) |
在文件 hm_liteipc.c 第 414 行定义.
LITE_OS_SEC_TEXT STATIC UINT32 GenerateServiceHandle | ( | UINT32 | taskID, |
HandleStatus | status, | ||
UINT32 * | serviceHandle | ||
) |
任务 注册服务,LiteIPC
的核心思想就是在内核态为每个Service
任务维护一个IPC
消息队列, 一个任务可以创建多个服务
在文件 hm_liteipc.c 第 512 行定义.
LITE_OS_SEC_TEXT STATIC UINT32 HandleCmsCmd | ( | CmsCmdContent * | content | ) |
处理命令
在文件 hm_liteipc.c 第 1357 行定义.
LITE_OS_SEC_TEXT STATIC UINT32 HandleFd | ( | UINT32 | processID, |
SpecialObj * | obj, | ||
BOOL | isRollback | ||
) |
按句柄方式处理, 参数 processID 往往不是当前进程
在文件 hm_liteipc.c 第 798 行定义.
LITE_OS_SEC_TEXT STATIC UINT32 HandleGetVersion | ( | IpcVersion * | version | ) |
LITE_OS_SEC_TEXT STATIC UINT32 HandleObj | ( | UINT32 | dstTid, |
SpecialObj * | obj, | ||
BOOL | isRollback | ||
) |
创建处理对象,好复杂, 消息套消息
在文件 hm_liteipc.c 第 891 行定义.
LITE_OS_SEC_TEXT STATIC UINT32 HandlePtr | ( | UINT32 | processID, |
SpecialObj * | obj, | ||
BOOL | isRollback | ||
) |
按指针方式处理
在文件 hm_liteipc.c 第 817 行定义.
LITE_OS_SEC_TEXT STATIC UINT32 HandleSpecialObjects | ( | UINT32 | dstTid, |
IpcListNode * | node, | ||
BOOL | isRollback | ||
) |
在文件 hm_liteipc.c 第 912 行定义.
LITE_OS_SEC_TEXT STATIC UINT32 HandleSvc | ( | UINT32 | dstTid, |
SpecialObj * | obj, | ||
BOOL | isRollback | ||
) |
按服务的方式处理,此处推断 Svc 应该是 service 的简写 @note_thinking
在文件 hm_liteipc.c 第 847 行定义.
LITE_OS_SEC_TEXT STATIC BOOL IsCmsSet | ( | VOID | ) |
是否设置了 ServiceManager 整个系统只能有一个ServiceManager,而Service可以有多个。 ServiceManager有两个主要功能:一是负责Service的注册和注销,二是负责管理Service的访问权限(只有有权限的任务(Task)可以向对应的Service发送IPC消息)。
在文件 hm_liteipc.c 第 752 行定义.
指定任务是否为 ServiceManager
在文件 hm_liteipc.c 第 765 行定义.
指定buf 是否是IPC节点,这个函数不应该命名为 Is...容易误导 ,应改为 Free... @note_thinking
在文件 hm_liteipc.c 第 442 行定义.
LITE_OS_SEC_TEXT BOOL IsIpcTaskSet | ( | VOID | ) |
LITE_OS_SEC_TEXT STATIC BOOL IsPoolMapped | ( | ProcIpcInfo * | ipcInfo | ) |
任务是否活跃
在文件 hm_liteipc.c 第 779 行定义.
LITE_OS_SEC_TEXT STATIC BOOL IsValidReply | ( | const IpcContent * | content | ) |
是否有效回复
在文件 hm_liteipc.c 第 1030 行定义.
在文件 hm_liteipc.c 第 193 行定义.
真正的 IPC 控制操作
在文件 hm_liteipc.c 第 1418 行定义.
LITE_OS_SEC_TEXT STATIC int LiteIpcMmap | ( | struct file * | filep, |
LosVmMapRegion * | region | ||
) |
将参数线性区设为IPC专用区
在文件 hm_liteipc.c 第 260 行定义.
LITE_OS_SEC_TEXT STATIC UINT32 LiteIpcMsgHandle | ( | IpcContent * | con | ) |
处理 IPC 消息
在文件 hm_liteipc.c 第 1287 行定义.
注意这可是从内核空间的IPC池中申请内存
在文件 hm_liteipc.c 第 427 行定义.
LITE_OS_SEC_TEXT_INIT STATIC ProcIpcInfo * LiteIpcPoolCreate | ( | VOID | ) |
创建IPC消息内存池
在文件 hm_liteipc.c 第 325 行定义.
STATIC VOID LiteIpcPoolDelete | ( | ProcIpcInfo * | ipcInfo, |
UINT32 | processID | ||
) |
释放进程的IPC消息内存池
在文件 hm_liteipc.c 第 360 行定义.
销毁指定进程的IPC池
在文件 hm_liteipc.c 第 386 行定义.
LITE_OS_SEC_TEXT_INIT STATIC UINT32 LiteIpcPoolInit | ( | ProcIpcInfo * | ipcInfo | ) |
初始化进程的IPC内存池
在文件 hm_liteipc.c 第 315 行定义.
LITE_OS_SEC_TEXT ProcIpcInfo * LiteIpcPoolReInit | ( | const ProcIpcInfo * | parent | ) |
LITE_OS_SEC_TEXT STATIC UINT32 LiteIpcRead | ( | IpcContent * | content | ) |
读取IPC消息
在文件 hm_liteipc.c 第 1230 行定义.
LITE_OS_SEC_TEXT VOID LiteIpcRemoveServiceHandle | ( | UINT32 | taskID | ) |
删除指定的Service
在文件 hm_liteipc.c 第 661 行定义.
LITE_OS_SEC_TEXT_INIT STATIC IpcTaskInfo * LiteIpcTaskInit | ( | VOID | ) |
LITE_OS_SEC_TEXT STATIC UINT32 LiteIpcWrite | ( | IpcContent * | content | ) |
写IPC消息队列,从用户空间到内核空间
在文件 hm_liteipc.c 第 1120 行定义.
LOS_MODULE_INIT | ( | OsLiteIpcInit | , |
LOS_INIT_LEVEL_KMOD_EXTENDED | |||
) |
LITE_OS_SEC_TEXT_INIT UINT32 OsLiteIpcInit | ( | VOID | ) |
OsLiteIpcInit 初始化LiteIPC模块
在文件 hm_liteipc.c 第 147 行定义.
刷新指定服务, 多刷几次状态就变了, result != 0 时,服务停止
在文件 hm_liteipc.c 第 536 行定义.
serviceHandle 给 processID 发送死亡/结束消息, serviceHandle 为 taskID
在文件 hm_liteipc.c 第 633 行定义.
LITE_OS_SEC_TEXT STATIC UINT32 SetIpcTask | ( | VOID | ) |
SPIN_LOCK_INIT | ( | g_ipcSpin | ) |
STATIC HandleInfo g_cmsTask |
整个系统只能有一个ServiceManager
在文件 hm_liteipc.c 第 113 行定义.
STATIC LOS_DL_LIST g_ipcPendlist |
挂起/待办链表,上面挂等待读/写消息的任务LosTaskCB
在文件 hm_liteipc.c 第 117 行定义.
STATIC const struct file_operations_vfs g_liteIpcFops |
在文件 hm_liteipc.c 第 133 行定义.
STATIC HandleInfo g_serviceHandleMap[MAX_SERVICE_NUM] |
g_serviceHandleMap[0]为ServiceManager,这块鸿蒙的设计挺怪的,让人很懵逼
在文件 hm_liteipc.c 第 115 行定义.
STATIC LosMux g_serviceHandleMapMux |
在文件 hm_liteipc.c 第 111 行定义.