52#define LITEIPC_DRIVER "/dev/lite_ipc"
53#define LITEIPC_DRIVER_MODE 0644
54#define MAX_SERVICE_NUM LOSCFG_BASE_CORE_TSK_LIMIT
55#define USE_TIMESTAMP 1
100 BOOL accessMap[LOSCFG_BASE_CORE_TSK_LIMIT];
147#define IPC_IOC_MAGIC 'i'
148#define IPC_SET_CMS _IO(IPC_IOC_MAGIC, 1)
149#define IPC_CMS_CMD _IOWR(IPC_IOC_MAGIC, 2, CmsCmdContent)
150#define IPC_SET_IPC_THREAD _IO(IPC_IOC_MAGIC, 3)
151#define IPC_SEND_RECV_MSG _IOWR(IPC_IOC_MAGIC, 4, IpcContent)
152#define IPC_GET_VERSION _IOR(IPC_IOC_MAGIC, 5, IpcVersion)
176#if (USE_TIMESTAMP == 1)
185#ifdef LOSCFG_SECURITY_CAPABILITY
198#define BUFF_FREE (1 << 2)
ProcIpcInfo * LiteIpcPoolReInit(const ProcIpcInfo *parentIpcInfo)
LiteIpcPoolReInit 重新初始化进程的IPC消息内存池
UINT32 LiteIpcPoolDestroy(UINT32 processID)
销毁指定进程的IPC池
UINT32 OsLiteIpcInit(VOID)
OsLiteIpcInit 初始化LiteIPC模块
VOID LiteIpcRemoveServiceHandle(UINT32 taskID)
删除指定的Service
VOID * buff
内容 内核需要将内容从用户空间拷贝到内核空间的动作
CmsCmd cmd
命令 例如注册命令:给taskID注册一个serviceHandle返回用户空间
UINT32 taskID
任务ID,以任务标识句柄
LOS_DL_LIST listNode
通过它挂到LosTaskCB.msgListHead链表上
UINT32 spObjNum
对象数量, 例如 spObjNum = 3时,offsets = [0,35,79],代表从data中读取 0 - 35给第一个对象,依次类推
VOID * data
消息的内容,真正要传递的消息,这个数据内容是指spObjNum个数据的内容,定位就靠offsets
VOID * offsets
偏移量,注意这里有多少个spObjNum就会有多少个偏移量,详见 CopyDataFromUser 来理解
LiteIPC的核心思想就是在内核态为每个Service任务维护一个IPC消息队列,该消息队列通过LiteIPC设备文件向上层 用户态程序分别提供代表收取IPC消息的读操作和代表发送IPC消息的写操作。
VOID * uvaddr
用户空间地址,由kvaddr映射而来的地址,这两个地址的关系一定要搞清楚,否则无法理解IPC的核心思想
VOID * kvaddr
内核空间地址,IPC申请的是内核空间,但是会通过 DoIpcMmap 将这个地址映射到用户空间
LOS_DL_LIST msgListHead
上面挂的是一个个的 ipc节点 上面挂 IpcListNode,申请IpcListNode的内存来自进程IPC内存池
进程IPC信息,见于进程结构体: LosProcessCB.ipcInfo
IpcPool pool
ipc内存池,IPC操作所有涉及内核空间分配的内存均有此池提供
UINT32 ipcTaskID
指定能ServiceManager的任务ID
LOS_DL_LIST ipcUsedNodelist
已使用节点链表,上面挂 IpcUsedNode 节点, 申请IpcUsedNode的内存来自内核堆空间
BuffPtr ptr
缓存的开始地址,即:指针,消息从用户空间来时,要将内容拷贝到内核空间
SvcIdentity svc
服务,用于设置访问权限
int access(const char *path, int amode)