注解LiteIpc消息映射

    百图画鸿蒙 + 百文说内核 + 百万注源码  => 挖透鸿蒙内核源码
    鸿蒙研究站 | http://weharmonyos.com (国内)
              | https://weharmony.github.io (国外)
    oschina | https://my.oschina.net/weharmony
    博客园 | https://www.cnblogs.com/weharmony/
    知乎 | https://www.zhihu.com/people/weharmonyos
    csdn | https://blog.csdn.net/kuangyufei
    51cto | https://harmonyos.51cto.com/column/34
    掘金 | https://juejin.cn/user/756888642000808
    公众号 | 鸿蒙研究站 (weharmonyos)
上级 b33d5498
......@@ -115,6 +115,7 @@
* [v74.01 鸿蒙内核源码分析(控制台) | 一个让很多人模糊的概念](https://my.oschina.net/weharmony/blog/5356308)
* [v75.01 鸿蒙内核源码分析(远程登录) | 内核如何接待远方的客人](https://my.oschina.net/weharmony/blog/5375838)
* [v76.01 鸿蒙内核源码分析(共享内存) | 进程间最快通讯方式](https://my.oschina.net/weharmony/blog/5412148)
* [v77.01 鸿蒙内核源码分析(消息封装) | 剖析LiteIpc进程通讯内容](https://my.oschina.net/weharmony/blog/5421867)
#### 三: 百万注内核 | 处处扣细节 | 细胞血管
* 百万汉字注解内核目的是要看清楚其毛细血管,细胞结构,等于在拿放大镜看内核。内核并不神秘,带着问题去源码中找答案是很容易上瘾的,你会发现很多文章对一些问题的解读是错误的,或者说不深刻难以自圆其说,你会慢慢形成自己新的解读,而新的解读又会碰到新的问题,如此层层递进,滚滚向前,拿着放大镜根本不愿意放手。
......
......@@ -853,7 +853,7 @@ ERROUT_UNLOCK:
ERROUT:
return -1;
}
/// 例如: 软总线适配层 WriteMsgQue - mq_send
/* not support the prio */
int mq_send(mqd_t personal, const char *msg_ptr, size_t msg_len, unsigned int msg_prio)
{
......
......@@ -208,7 +208,7 @@ STATIC INLINE UINT32 OsCvtProtFlagsToRegionFlags(unsigned long prot, unsigned lo
return regionFlags;
}
/// 是否为内核空间的地址
/// 虚拟地址是否在内核空间
STATIC INLINE BOOL LOS_IsKernelAddress(VADDR_T vaddr)
{
return ((vaddr >= (VADDR_T)KERNEL_ASPACE_BASE) &&
......@@ -270,7 +270,7 @@ STATIC INLINE VOID LOS_SetRegionTypeAnon(LosVmMapRegion* region)
{
region->regionType = VM_MAP_REGION_TYPE_ANON;
}
/// 虚拟地址是否在用户空间, 真为在用户空间
/// 虚拟地址是否在用户空间
STATIC INLINE BOOL LOS_IsUserAddress(VADDR_T vaddr)
{
return ((vaddr >= USER_ASPACE_BASE) &&
......
......@@ -913,7 +913,7 @@ LITE_OS_SEC_TEXT STATIC UINT32 HandleSpecialObjects(UINT32 dstTid, IpcListNode *
}
}
return LOS_OK;
EXIT:
EXIT://异常回滚处理
for (i--; i >= 0; i--) {
obj = (SpecialObj *)((UINTPTR)msg->data + offset[i]);
(VOID)HandleObj(dstTid, obj, TRUE);
......@@ -931,7 +931,7 @@ LITE_OS_SEC_TEXT STATIC UINT32 CheckMsgSize(IpcMsg *msg)
return LOS_OK;
}
/* msg send to cms, check the msg size */
totalSize = (UINT64)sizeof(IpcMsg) + msg->dataSz + msg->spObjNum * sizeof(UINT32);
totalSize = (UINT64)sizeof(IpcMsg) + msg->dataSz + msg->spObjNum * sizeof(UINT32);//缓冲总大小
for (i = 0; i < msg->spObjNum; i++) {
if (offset[i] > msg->dataSz - sizeof(SpecialObj)) {
return -EINVAL;
......@@ -944,7 +944,7 @@ LITE_OS_SEC_TEXT STATIC UINT32 CheckMsgSize(IpcMsg *msg)
return -EINVAL;
}
if (obj->type == OBJ_PTR) {
totalSize += obj->content.ptr.buffSz;
totalSize += obj->content.ptr.buffSz;//指针指向的buf存储在用户空间其他地方
}
}
(VOID)LOS_MuxUnlock(&g_serviceHandleMapMux);
......@@ -999,16 +999,16 @@ LITE_OS_SEC_TEXT STATIC UINT32 CopyDataFromUser(IpcListNode *node, UINT32 bufSz,
#endif
return LOS_OK;
}
/// 是否有效回复
LITE_OS_SEC_TEXT STATIC BOOL IsValidReply(const IpcContent *content)
{
UINT32 curProcessID = LOS_GetCurrProcessID();
IpcListNode *node = (IpcListNode *)GetIpcKernelAddr(curProcessID, (INTPTR)(content->buffToFree));
IpcListNode *node = (IpcListNode *)GetIpcKernelAddr(curProcessID, (INTPTR)(content->buffToFree));//通过用户空间地址获取内核地址
IpcMsg *requestMsg = &node->msg;
IpcMsg *replyMsg = content->outMsg;
UINT32 reqDstTid = 0;
/* Check whether the reply matches the request */
if ((requestMsg->type != MT_REQUEST) ||
if ((requestMsg->type != MT_REQUEST) || //判断条件
(requestMsg->flag == LITEIPC_FLAG_ONEWAY) ||
(replyMsg->timestamp != requestMsg->timestamp) ||
(replyMsg->target.handle != requestMsg->taskID) ||
......@@ -1089,7 +1089,7 @@ LITE_OS_SEC_TEXT STATIC UINT32 CheckPara(IpcContent *content, UINT32 *dstTid)
}
return LOS_OK;
}
///写IPC消息队列,从用户空间到内核空间
/// 写IPC消息队列,从用户空间到内核空间
LITE_OS_SEC_TEXT STATIC UINT32 LiteIpcWrite(IpcContent *content)
{
UINT32 ret, intSave;
......@@ -1199,7 +1199,7 @@ LITE_OS_SEC_TEXT STATIC UINT32 CheckRecievedMsg(IpcListNode *node, IpcContent *c
}
return ret;
}
//读取IPC消息
/// 读取IPC消息
LITE_OS_SEC_TEXT STATIC UINT32 LiteIpcRead(IpcContent *content)
{
UINT32 intSave, ret;
......
......@@ -49,7 +49,7 @@ extern "C" {
从形象意义的理解,跟门的把柄一样,握住门柄就控制了整个大门.句柄是给用户程序使用的一个数字凭证,
能以小博大,通过句柄能牵动内核模块工作.
*/
#define LITEIPC_DRIVER "/dev/lite_ipc" ///< 虚拟设备
#define LITEIPC_DRIVER "/dev/lite_ipc" ///< 虚拟设备,文件访问读取
#define LITEIPC_DRIVER_MODE 0644 ///< 对虚拟设备的访问权限 110100100 表示只有所属用户才有读写权限,其余都只能读
#define MAX_SERVICE_NUM LOSCFG_BASE_CORE_TSK_LIMIT ///< 最大服务数等于任务数 默认128
#define USE_TIMESTAMP 1 ///< 使用时间戳
......@@ -136,14 +136,14 @@ typedef enum {
MT_REQUEST, ///< 请求
MT_REPLY, ///< 回复
MT_FAILED_REPLY,///< 回复失败
MT_DEATH_NOTIFY,///< 通知死亡
MT_DEATH_NOTIFY,///< 死亡通知
MT_NUM
} MsgType;
/* lite ipc ioctl | 控制命令*/
#define IPC_IOC_MAGIC 'i'
#define IPC_SET_CMS _IO(IPC_IOC_MAGIC, 1)
#define IPC_CMS_CMD _IOWR(IPC_IOC_MAGIC, 2, CmsCmdContent)
#define IPC_SET_CMS _IO(IPC_IOC_MAGIC, 1) ///< 设置ServiceManager的命令
#define IPC_CMS_CMD _IOWR(IPC_IOC_MAGIC, 2, CmsCmdContent)///< 控制命令,创建/删除 服务 添加服务权限
#define IPC_SET_IPC_THREAD _IO(IPC_IOC_MAGIC, 3) ///< 为进程设置IPC任务
#define IPC_SEND_RECV_MSG _IOWR(IPC_IOC_MAGIC, 4, IpcContent) ///< 对IPC的读写处理
......
git add -A
git commit -m ' 注解LiteIpc消息封装机制
git commit -m ' 注解LiteIpc消息映射
百图画鸿蒙 + 百文说内核 + 百万注源码 => 挖透鸿蒙内核源码
鸿蒙研究站 | http://weharmonyos.com (国内)
| https://weharmony.github.io (国外)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册