提交 0c25865b 编写于 作者: 鸿蒙内核源码分析's avatar 鸿蒙内核源码分析

Posix IPC 部分代码的注释

搜索 @note_pic 可以查看全部字符图
搜索 @note_why 是注者尚未看明白的地方,如果您看明白了,请告诉注者完善
搜索 @note_thinking 是注者的思考和吐槽的地方
上级 42c3eaa0
......@@ -73,7 +73,7 @@ extern "C" {
/* TYPE DEFINITIONS */
struct mqarray {
UINT32 mq_id : 31;
UINT32 mq_id : 31;
UINT32 unlinkflag : 1;
char *mq_name;
LosQueueCB *mqcb;
......@@ -89,18 +89,18 @@ struct mqpersonal {
/**
* @ingroup mqueue
* Message queue attribute structure
* Message queue attribute structure //消息队列属性结构
*/
struct mq_attr {
long mq_flags; /**< Message queue flags */
long mq_maxmsg; /**< Maximum number of messages */
long mq_msgsize; /**< Maximum size of a message */
long mq_curmsgs; /**< Number of messages in the current message queue */
long mq_flags; /**< Message queue flags */ //消息队列标志
long mq_maxmsg; /**< Maximum number of messages */ //最大消息数
long mq_msgsize; /**< Maximum size of a message */ //消息的最大大小
long mq_curmsgs; /**< Number of messages in the current message queue */ //当前消息队列中的消息数
};
/**
* @ingroup mqueue
* Handle type of a message queue
* Handle type of a message queue //消息队列的句柄类型
*/
typedef UINTPTR mqd_t;
......
......@@ -47,7 +47,7 @@ extern "C" {
#define FNONBLOCK O_NONBLOCK
/* GLOBALS */
STATIC struct mqarray g_queueTable[LOSCFG_BASE_IPC_QUEUE_LIMIT];
STATIC struct mqarray g_queueTable[LOSCFG_BASE_IPC_QUEUE_LIMIT];//posix ipc 队列全局表
STATIC pthread_mutex_t g_mqueueMutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
/* LOCAL FUNCTIONS */
......@@ -69,7 +69,7 @@ STATIC INLINE INT32 MqNameCheck(const CHAR *mqName)
}
return 0;
}
//通过ID获取 队列控制块
STATIC INLINE UINT32 GetMqueueCBByID(UINT32 queueID, LosQueueCB **queueCB)
{
LosQueueCB *tmpQueueCB = NULL;
......@@ -77,7 +77,7 @@ STATIC INLINE UINT32 GetMqueueCBByID(UINT32 queueID, LosQueueCB **queueCB)
errno = EINVAL;
return LOS_ERRNO_QUEUE_READ_PTR_NULL;
}
tmpQueueCB = GET_QUEUE_HANDLE(queueID);
tmpQueueCB = GET_QUEUE_HANDLE(queueID);//获取队列ID对应的队列控制块
if ((GET_QUEUE_INDEX(queueID) >= LOSCFG_BASE_IPC_QUEUE_LIMIT) || (tmpQueueCB->queueID != queueID)) {
return LOS_ERRNO_QUEUE_INVALID;
}
......@@ -85,7 +85,7 @@ STATIC INLINE UINT32 GetMqueueCBByID(UINT32 queueID, LosQueueCB **queueCB)
return LOS_OK;
}
//通过名称获取队列控制块
STATIC INLINE struct mqarray *GetMqueueCBByName(const CHAR *name)
{
UINT32 index;
......@@ -103,19 +103,19 @@ STATIC INLINE struct mqarray *GetMqueueCBByName(const CHAR *name)
return NULL;
}
//执行删除队列控制块操作
STATIC INT32 DoMqueueDelete(struct mqarray *mqueueCB)
{
UINT32 ret;
if (mqueueCB->mq_name != NULL) {
LOS_MemFree(OS_SYS_MEM_ADDR, mqueueCB->mq_name);
if (mqueueCB->mq_name != NULL) {//队列名称占用内核内存
LOS_MemFree(OS_SYS_MEM_ADDR, mqueueCB->mq_name);//释放内存
mqueueCB->mq_name = NULL;
}
mqueueCB->mqcb = NULL;
mqueueCB->mqcb = NULL;//这里只是先置空,但实际内存并没有删除
ret = LOS_QueueDelete(mqueueCB->mq_id);
ret = LOS_QueueDelete(mqueueCB->mq_id);//通过ID删除任务控制块
switch (ret) {
case LOS_OK:
return 0;
......@@ -130,7 +130,7 @@ STATIC INT32 DoMqueueDelete(struct mqarray *mqueueCB)
return -1;
}
}
//保存队列名称,申请内核内存
STATIC int SaveMqueueName(const CHAR *mqName, struct mqarray *mqueueCB)
{
size_t nameLen;
......@@ -142,27 +142,27 @@ STATIC int SaveMqueueName(const CHAR *mqName, struct mqarray *mqueueCB)
return LOS_NOK;
}
if (strncpy_s(mqueueCB->mq_name, (nameLen + 1), mqName, nameLen) != EOK) {
if (strncpy_s(mqueueCB->mq_name, (nameLen + 1), mqName, nameLen) != EOK) { //从用户空间拷贝到内核空间
LOS_MemFree(OS_SYS_MEM_ADDR, mqueueCB->mq_name);
mqueueCB->mq_name = NULL;
errno = EINVAL;
return LOS_NOK;
}
mqueueCB->mq_name[nameLen] = '\0';
mqueueCB->mq_name[nameLen] = '\0';//结尾字符
return LOS_OK;
}
//创建一个posix队列,并和VFS进行捆绑
STATIC struct mqpersonal *DoMqueueCreate(const struct mq_attr *attr, const CHAR *mqName, INT32 openFlag)
{
struct mqarray *mqueueCB = NULL;
UINT32 mqueueID;
UINT32 err = LOS_QueueCreate(NULL, attr->mq_maxmsg, &mqueueID, 0, attr->mq_msgsize);
UINT32 err = LOS_QueueCreate(NULL, attr->mq_maxmsg, &mqueueID, 0, attr->mq_msgsize);//创建队列,带出队列ID
if (map_errno(err) != ENOERR) {
goto ERROUT;
}
if (g_queueTable[GET_QUEUE_INDEX(mqueueID)].mqcb == NULL) {
if (g_queueTable[GET_QUEUE_INDEX(mqueueID)].mqcb == NULL) {//新创建的队列和g_queueTable捆绑
mqueueCB = &(g_queueTable[GET_QUEUE_INDEX(mqueueID)]);
mqueueCB->mq_id = mqueueID;
}
......@@ -172,7 +172,7 @@ STATIC struct mqpersonal *DoMqueueCreate(const struct mq_attr *attr, const CHAR
goto ERROUT;
}
if (SaveMqueueName(mqName, mqueueCB) != LOS_OK) {
if (SaveMqueueName(mqName, mqueueCB) != LOS_OK) {//在内核堆区 保存队列名称
goto ERROUT;
}
......@@ -181,8 +181,8 @@ STATIC struct mqpersonal *DoMqueueCreate(const struct mq_attr *attr, const CHAR
goto ERROUT;
}
mqueueCB->mq_personal = (struct mqpersonal *)LOS_MemAlloc(OS_SYS_MEM_ADDR, sizeof(struct mqpersonal));
if (mqueueCB->mq_personal == NULL) {
mqueueCB->mq_personal = (struct mqpersonal *)LOS_MemAlloc(OS_SYS_MEM_ADDR, sizeof(struct mqpersonal));//分配一个私有的队列结构体
if (mqueueCB->mq_personal == NULL) { //mq_personal解构体主要用于 posix队列和VFS的捆绑
(VOID)LOS_QueueDelete(mqueueCB->mq_id);
mqueueCB->mqcb->queueHandle = NULL;
mqueueCB->mqcb = NULL;
......@@ -191,9 +191,9 @@ STATIC struct mqpersonal *DoMqueueCreate(const struct mq_attr *attr, const CHAR
}
mqueueCB->unlinkflag = FALSE;
mqueueCB->mq_personal->mq_status = MQ_USE_MAGIC;
mqueueCB->mq_personal->mq_next = NULL;
mqueueCB->mq_personal->mq_posixdes = mqueueCB;
mqueueCB->mq_personal->mq_status = MQ_USE_MAGIC;//魔法数字
mqueueCB->mq_personal->mq_next = NULL; //指向下一个mq_personal
mqueueCB->mq_personal->mq_posixdes = mqueueCB; //指向目标posix队列控制块
mqueueCB->mq_personal->mq_flags = (INT32)((UINT32)openFlag | ((UINT32)attr->mq_flags & (UINT32)FNONBLOCK));
return mqueueCB->mq_personal;
......@@ -205,7 +205,7 @@ ERROUT:
}
return (struct mqpersonal *)-1;
}
//通过参数mqueueCB和VFS进行捆绑
STATIC struct mqpersonal *DoMqueueOpen(struct mqarray *mqueueCB, INT32 openFlag)
{
struct mqpersonal *privateMqPersonal = NULL;
......@@ -234,7 +234,7 @@ STATIC struct mqpersonal *DoMqueueOpen(struct mqarray *mqueueCB, INT32 openFlag)
ERROUT:
return (struct mqpersonal *)-1;
}
//创建或打开 posix 消息队列
mqd_t mq_open(const char *mqName, int openFlag, ...)
{
struct mqarray *mqueueCB = NULL;
......@@ -289,7 +289,7 @@ OUT:
(VOID)pthread_mutex_unlock(&g_mqueueMutex);
return (mqd_t)privateMqPersonal;
}
//关闭posix队列
int mq_close(mqd_t personal)
{
INT32 ret = 0;
......@@ -297,20 +297,20 @@ int mq_close(mqd_t personal)
struct mqpersonal *privateMqPersonal = NULL;
struct mqpersonal *tmp = NULL;
if (!LOS_IsKernelAddressRange(personal, sizeof(struct mqpersonal))) {
if (!LOS_IsKernelAddressRange(personal, sizeof(struct mqpersonal))) {//不是在内核空间,返回错误
errno = EBADF;
return -1;
}
(VOID)pthread_mutex_lock(&g_mqueueMutex);
privateMqPersonal = (struct mqpersonal *)personal;
if (privateMqPersonal->mq_status != MQ_USE_MAGIC) {
if (privateMqPersonal->mq_status != MQ_USE_MAGIC) {//魔法数字是否一致
errno = EBADF;
goto OUT_UNLOCK;
}
mqueueCB = privateMqPersonal->mq_posixdes;
if (mqueueCB->mq_personal == NULL) {
if (mqueueCB->mq_personal == NULL) {//posix队列控制块是否存在
errno = EBADF;
goto OUT_UNLOCK;
}
......@@ -348,13 +348,13 @@ OUT_UNLOCK:
(VOID)pthread_mutex_unlock(&g_mqueueMutex);
return ret;
}
//获取队列属性。属性由参数mqAttr带走
int OsMqGetAttr(mqd_t personal, struct mq_attr *mqAttr)
{
struct mqarray *mqueueCB = NULL;
struct mqpersonal *privateMqPersonal = NULL;
if (!LOS_IsKernelAddressRange(personal, sizeof(struct mqpersonal))) {
if (!LOS_IsKernelAddressRange(personal, sizeof(struct mqpersonal))) {//必须在内核空间
errno = EBADF;
return -1;
}
......@@ -380,12 +380,12 @@ int OsMqGetAttr(mqd_t personal, struct mq_attr *mqAttr)
(VOID)pthread_mutex_unlock(&g_mqueueMutex);
return 0;
}
//设置队列属性
int OsMqSetAttr(mqd_t personal, const struct mq_attr *mqSetAttr, struct mq_attr *mqOldAttr)
{
struct mqpersonal *privateMqPersonal = NULL;
if (!LOS_IsKernelAddressRange(personal, sizeof(struct mqpersonal))) {
if (!LOS_IsKernelAddressRange(personal, sizeof(struct mqpersonal))) {//必须在内核空间
errno = EBADF;
return -1;
}
......@@ -397,14 +397,14 @@ int OsMqSetAttr(mqd_t personal, const struct mq_attr *mqSetAttr, struct mq_attr
(VOID)pthread_mutex_lock(&g_mqueueMutex);
privateMqPersonal = (struct mqpersonal *)personal;
if (privateMqPersonal->mq_status != MQ_USE_MAGIC) {
if (privateMqPersonal->mq_status != MQ_USE_MAGIC) {//魔法数字对不上
errno = EBADF;
(VOID)pthread_mutex_unlock(&g_mqueueMutex);
return -1;
}
if (mqOldAttr != NULL) {
(VOID)OsMqGetAttr((mqd_t)privateMqPersonal, mqOldAttr);
(VOID)OsMqGetAttr((mqd_t)privateMqPersonal, mqOldAttr);//先拿走老的设置
}
privateMqPersonal->mq_flags = (INT32)((UINT32)privateMqPersonal->mq_flags & (UINT32)(~FNONBLOCK)); /* clear */
......@@ -414,10 +414,10 @@ int OsMqSetAttr(mqd_t personal, const struct mq_attr *mqSetAttr, struct mq_attr
(VOID)pthread_mutex_unlock(&g_mqueueMutex);
return 0;
}
//一个函数做两个工作,因为这是posix的标准接口,
int mq_getsetattr(mqd_t mqd, const struct mq_attr *new, struct mq_attr *old)
{
if (new == NULL) {
if (new == NULL) {//用第二个参数来判断是否是获取还是设置功能
return OsMqGetAttr(mqd, old);
}
return OsMqSetAttr(mqd, new, old);
......@@ -433,14 +433,14 @@ int mq_unlink(const char *mqName)
}
(VOID)pthread_mutex_lock(&g_mqueueMutex);
mqueueCB = GetMqueueCBByName(mqName);
mqueueCB = GetMqueueCBByName(mqName);//通过名称获取posix队列控制块
if (mqueueCB == NULL) {
errno = ENOENT;
goto ERROUT_UNLOCK;
}
if (mqueueCB->mq_personal != NULL) {
mqueueCB->unlinkflag = TRUE;
mqueueCB->unlinkflag = TRUE;//是否为私有队列
} else {
ret = DoMqueueDelete(mqueueCB);
}
......
......@@ -52,7 +52,7 @@ STATIC INLINE UINT32 OsQueueDbgInitHook(VOID)
return LOS_OK;
#endif
}
/* Update the last time the queue was executed */
/* Update the last time the queue was executed */ //更新上次执行队列的时间
extern VOID OsQueueDbgTimeUpdate(UINT32 queueID);
STATIC INLINE VOID OsQueueDbgTimeUpdateHook(UINT32 queueID)
{
......
......@@ -75,7 +75,7 @@ typedef struct {
UINT16 queueTail; /**< Node tail */ //队列尾部节点
UINT16 readWriteableCnt[OS_QUEUE_N_RW]; /**< Count of readable or writable resources, 0:readable, 1:writable */
LOS_DL_LIST readWriteList[OS_QUEUE_N_RW]; /**< the linked list to be read or written, 0:readlist, 1:writelist */
LOS_DL_LIST memList; /**< Pointer to the memory linked list */ //@note_why 这里尚未搞明白是啥意思
LOS_DL_LIST memList; /**< Pointer to the memory linked list */ //@note_why 这里尚未搞明白是啥意思 ,是共享内存吗?
} LosQueueCB;//读写队列分离
/* queue state */
......
......@@ -131,7 +131,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_QueueCreate(CHAR *queueName, UINT16 len, UINT32
queueCB->queueState = OS_QUEUE_INUSED; //队列状态使用中
queueCB->readWriteableCnt[OS_QUEUE_READ] = 0;//可读资源计数,OS_QUEUE_READ(0):可读.
queueCB->readWriteableCnt[OS_QUEUE_WRITE] = len;//可些资源计数 OS_QUEUE_WRITE(1):可写, 默认len可写.
queueCB->queueHead = 0;//队列节点
queueCB->queueHead = 0;//队列节点
queueCB->queueTail = 0;//队列尾节点
LOS_ListInit(&queueCB->readWriteList[OS_QUEUE_READ]);//初始化可读队列链表
LOS_ListInit(&queueCB->readWriteList[OS_QUEUE_WRITE]);//初始化可写队列链表
......@@ -150,12 +150,12 @@ STATIC LITE_OS_SEC_TEXT UINT32 OsQueueReadParameterCheck(UINT32 queueID, const V
if (GET_QUEUE_INDEX(queueID) >= LOSCFG_BASE_IPC_QUEUE_LIMIT) {//队列ID不能超上限
return LOS_ERRNO_QUEUE_INVALID;
}
if ((bufferAddr == NULL) || (bufferSize == NULL)) {//目的地不能为NULL
if ((bufferAddr == NULL) || (bufferSize == NULL)) {//缓存地址不能为NULL
return LOS_ERRNO_QUEUE_READ_PTR_NULL;
}
if ((*bufferSize == 0) || (*bufferSize > (OS_NULL_SHORT - sizeof(UINT32)))) {//限制了读取数据的上限64K少一点点 OS_NULL_SHORT = 0XFFFF
return LOS_ERRNO_QUEUE_READSIZE_IS_INVALID;
if ((*bufferSize == 0) || (*bufferSize > (OS_NULL_SHORT - sizeof(UINT32)))) {//限制了读取数据的上限64K, sizeof(UINT32)代表的是队列的长度
return LOS_ERRNO_QUEUE_READSIZE_IS_INVALID; //所以要减去
}
OsQueueDbgTimeUpdateHook(queueID);
......@@ -424,7 +424,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_QueueDelete(UINT32 queueID)
}
if ((queueCB->readWriteableCnt[OS_QUEUE_WRITE] + queueCB->readWriteableCnt[OS_QUEUE_READ]) !=
queueCB->queueLen) {
queueCB->queueLen) {//读写队列的内容长度不等于总长度
ret = LOS_ERRNO_QUEUE_IN_TSKWRITE;
goto QUEUE_END;
}
......@@ -435,8 +435,8 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_QueueDelete(UINT32 queueID)
queueCB->queueID = SET_QUEUE_ID(GET_QUEUE_COUNT(queueCB->queueID) + 1, GET_QUEUE_INDEX(queueCB->queueID));
OsQueueDbgUpdateHook(queueCB->queueID, NULL);
LOS_ListTailInsert(&g_freeQueueList, &queueCB->readWriteList[OS_QUEUE_WRITE]);
SCHEDULER_UNLOCK(intSave);
LOS_ListTailInsert(&g_freeQueueList, &queueCB->readWriteList[OS_QUEUE_WRITE]);//回收,通过write节点挂入链表,这里用OS_QUEUE_READ也没问题,
SCHEDULER_UNLOCK(intSave); //但从链表中取出的时候也要用OS_QUEUE_READ,成对出现就行。
ret = LOS_MemFree(m_aucSysMem1, (VOID *)queue);
return ret;
......
......@@ -124,9 +124,9 @@ extern UINT32 __heap_end; // 堆区结束地址
/****************************** Hardware interrupt module configuration ******************************/
/**
* @ingroup los_config
* Configuration item for hardware interrupt tailoring
* Configuration item for hardware interrupt tailoring
*/
#ifndef LOSCFG_PLATFORM_HWI
#ifndef LOSCFG_PLATFORM_HWI //硬件中断裁剪配置项
#define LOSCFG_PLATFORM_HWI YES
#endif
......@@ -170,7 +170,7 @@ extern UINT32 __heap_end; // 堆区结束地址
* @ingroup los_config
* Default task priority
*/
#ifndef LOSCFG_BASE_CORE_TSK_DEFAULT_PRIO
#ifndef LOSCFG_BASE_CORE_TSK_DEFAULT_PRIO //内核任务默认优先级
#define LOSCFG_BASE_CORE_TSK_DEFAULT_PRIO 10
#endif
......@@ -178,7 +178,7 @@ extern UINT32 __heap_end; // 堆区结束地址
* @ingroup los_config
* Maximum supported number of tasks except the idle task rather than the number of usable tasks
*/
#ifndef LOSCFG_BASE_CORE_TSK_LIMIT
#ifndef LOSCFG_BASE_CORE_TSK_LIMIT //支持的最大任务数(空闲任务除外,而不是可用任务数)
#define LOSCFG_BASE_CORE_TSK_LIMIT 128
#endif
......@@ -186,7 +186,7 @@ extern UINT32 __heap_end; // 堆区结束地址
* @ingroup los_config
* Maximum supported number of process rather than the number of usable processes.
*/
#ifndef LOSCFG_BASE_CORE_PROCESS_LIMIT
#ifndef LOSCFG_BASE_CORE_PROCESS_LIMIT //支持的最大进程数,而不是可用进程数
#define LOSCFG_BASE_CORE_PROCESS_LIMIT 64
#endif
......@@ -198,7 +198,7 @@ extern UINT32 __heap_end; // 堆区结束地址
* @ingroup los_config
* Size of the idle task stack
*/
#ifndef LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE
#ifndef LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE //空闲任务栈大小
#define LOSCFG_BASE_CORE_TSK_IDLE_STACK_SIZE SIZE(0x800)// 2K
#endif
......@@ -206,7 +206,7 @@ extern UINT32 __heap_end; // 堆区结束地址
* @ingroup los_config
* Default task stack size
*/
#ifndef LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE
#ifndef LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE //内核默认任务栈大小
#define LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE SIZE(0x4000) //16K
#endif
......@@ -214,7 +214,7 @@ extern UINT32 __heap_end; // 堆区结束地址
* @ingroup los_config
* Longest execution time of tasks with the same priorities
*/
#ifndef LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT
#ifndef LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT //相同优先级任务的最长执行时间,时间片
#define LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT 2
#endif
......@@ -322,7 +322,7 @@ extern UINT32 __heap_end; // 堆区结束地址
* Starting address of the system memory
*/
#ifndef OS_SYS_MEM_ADDR
#define OS_SYS_MEM_ADDR (&m_aucSysMem1[0])// 系统(物理)内存起始地址
#define OS_SYS_MEM_ADDR (&m_aucSysMem1[0])// 系统内存的起始地址
#endif
/**
......
......@@ -37,7 +37,7 @@
#include "user_copy.h"
#include "los_signal.h"
#include "los_strncpy_from_user.h"
//打开消息队列
//创建和打开一个posix消息队列
mqd_t SysMqOpen(const char *mqName, int openFlag, mode_t mode, struct mq_attr *attr)
{
mqd_t ret;
......@@ -54,7 +54,7 @@ mqd_t SysMqOpen(const char *mqName, int openFlag, mode_t mode, struct mq_attr *a
}
return ret;
}
//关闭一个消息队列
int SysMqClose(mqd_t personal)
{
int ret;
......
git add -A
git commit -m '新增控制台,事件,循环buf的代码注释,您知道工作台是如何创建的吗?
git commit -m 'Posix IPC 部分代码的注释
搜索 @note_pic 可以查看全部字符图
搜索 @note_why 是注者尚未看明白的地方,如果您看明白了,请告诉注者完善
搜索 @note_thinking 是注者的思考和吐槽的地方
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册