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

内存,进程,task模块注释基本完成. 正在更新: 进程间IPC通讯消息队列模块代码注释...

鸿蒙内核源码分析系列 https://blog.csdn.net/kuangyufei https://my.oschina.net/u/3751245
上级 12aca2ab
......@@ -486,7 +486,7 @@ LITE_OS_SEC_TEXT_INIT VOID OsTaskEntry(UINT32 taskID)
OsTaskToExit(taskCB, 0);
}
//任务创建参数检查
LITE_OS_SEC_TEXT_INIT STATIC UINT32 OsTaskCreateParamCheck(const UINT32 *taskID,
TSK_INIT_PARAM_S *initParam, VOID **pool)
{
......
......@@ -41,14 +41,14 @@ extern "C" {
#endif /* __cplusplus */
typedef enum {
OS_QUEUE_READ = 0,
OS_QUEUE_WRITE = 1,
OS_QUEUE_READ = 0, //读队列
OS_QUEUE_WRITE = 1, //写队列
OS_QUEUE_N_RW = 2
} QueueReadWrite;
typedef enum {
OS_QUEUE_HEAD = 0,
OS_QUEUE_TAIL = 1
OS_QUEUE_HEAD = 0, //队列头部标识
OS_QUEUE_TAIL = 1 //队列尾部标识
} QueueHeadTail;
#define OS_QUEUE_OPERATE_TYPE(ReadOrWrite, HeadOrTail) (((UINT32)(HeadOrTail) << 1) | (ReadOrWrite))
......@@ -76,7 +76,7 @@ typedef struct {
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 */
} LosQueueCB;
} LosQueueCB;//读写队列分离
/* queue state */
/**
......
......@@ -44,7 +44,7 @@
extern "C" {
#endif
#endif /* __cplusplus */
//时间初始化
LITE_OS_SEC_TEXT_INIT UINT32 LOS_EventInit(PEVENT_CB_S eventCB)
{
UINT32 intSave;
......@@ -55,7 +55,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_EventInit(PEVENT_CB_S eventCB)
intSave = LOS_IntLock();
eventCB->uwEventID = 0;
LOS_ListInit(&eventCB->stEventList);
LOS_ListInit(&eventCB->stEventList);//事件链表初始化
LOS_IntRestore(intSave);
return LOS_OK;
}
......
......@@ -54,7 +54,7 @@ LITE_OS_SEC_BSS STATIC LOS_DL_LIST g_freeQueueList;//IPC空闲队列链表,管
* Description : queue initial
* Return : LOS_OK on success or error code on failure
*/
LITE_OS_SEC_TEXT_INIT UINT32 OsQueueInit(VOID)//IPC 队列初始化
LITE_OS_SEC_TEXT_INIT UINT32 OsQueueInit(VOID)//队列初始化
{
LosQueueCB *queueNode = NULL;
UINT32 index;
......@@ -232,7 +232,7 @@ STATIC VOID OsQueueBufferOperate(LosQueueCB *queueCB, UINT32 operateType, VOID *
}
*bufferSize = msgDataSize;//通过入参 带走消息的大小
} else {//只有读写两种操作,这里就是写队列了.写也分两步走
} else {//只有读写两种操作,这里就是写队列了.写也分两步走 , @@@@@ 这里建议鸿蒙加上 OS_QUEUE_IS_WRITE 判断
if (memcpy_s(queueNode, queueCB->queueSize, bufferAddr, *bufferSize) != EOK) {//1.写入消息内容长度 UINT32表示
PRINT_ERR("store message failed\n");
return;
......@@ -244,65 +244,65 @@ STATIC VOID OsQueueBufferOperate(LosQueueCB *queueCB, UINT32 operateType, VOID *
}
}
}
//队列操作参数检查
STATIC UINT32 OsQueueOperateParamCheck(const LosQueueCB *queueCB, UINT32 queueID,
UINT32 operateType, const UINT32 *bufferSize)
{
if ((queueCB->queueID != queueID) || (queueCB->queueState == OS_QUEUE_UNUSED)) {
if ((queueCB->queueID != queueID) || (queueCB->queueState == OS_QUEUE_UNUSED)) {//队列ID和状态判断
return LOS_ERRNO_QUEUE_NOT_CREATE;
}
if (OS_QUEUE_IS_READ(operateType) && (*bufferSize < (queueCB->queueSize - sizeof(UINT32)))) {
if (OS_QUEUE_IS_READ(operateType) && (*bufferSize < (queueCB->queueSize - sizeof(UINT32)))) {//读时判断
return LOS_ERRNO_QUEUE_READ_SIZE_TOO_SMALL;
} else if (OS_QUEUE_IS_WRITE(operateType) && (*bufferSize > (queueCB->queueSize - sizeof(UINT32)))) {
} else if (OS_QUEUE_IS_WRITE(operateType) && (*bufferSize > (queueCB->queueSize - sizeof(UINT32)))) {//写时判断
return LOS_ERRNO_QUEUE_WRITE_SIZE_TOO_BIG;
}
return LOS_OK;
}
//队列操作.是读是写由operateType定
UINT32 OsQueueOperate(UINT32 queueID, UINT32 operateType, VOID *bufferAddr, UINT32 *bufferSize, UINT32 timeout)
{
LosQueueCB *queueCB = NULL;
LosTaskCB *resumedTask = NULL;
UINT32 ret;
UINT32 readWrite = OS_QUEUE_READ_WRITE_GET(operateType);
UINT32 readWrite = OS_QUEUE_READ_WRITE_GET(operateType);//获取读写操作标识
UINT32 intSave;
SCHEDULER_LOCK(intSave);
queueCB = (LosQueueCB *)GET_QUEUE_HANDLE(queueID);
ret = OsQueueOperateParamCheck(queueCB, queueID, operateType, bufferSize);
queueCB = (LosQueueCB *)GET_QUEUE_HANDLE(queueID);//获取对应的队列控制块
ret = OsQueueOperateParamCheck(queueCB, queueID, operateType, bufferSize);//参数检查
if (ret != LOS_OK) {
goto QUEUE_END;
}
if (queueCB->readWriteableCnt[readWrite] == 0) {
if (timeout == LOS_NO_WAIT) {
if (queueCB->readWriteableCnt[readWrite] == 0) {//没有数据
if (timeout == LOS_NO_WAIT) {//不等待直接退出
ret = OS_QUEUE_IS_READ(operateType) ? LOS_ERRNO_QUEUE_ISEMPTY : LOS_ERRNO_QUEUE_ISFULL;
goto QUEUE_END;
}
if (!OsPreemptableInSched()) {
if (!OsPreemptableInSched()) {//不能抢占式调度
ret = LOS_ERRNO_QUEUE_PEND_IN_LOCK;
goto QUEUE_END;
}
ret = OsTaskWait(&queueCB->readWriteList[readWrite], timeout, TRUE);
ret = OsTaskWait(&queueCB->readWriteList[readWrite], timeout, TRUE);//任务等待
if (ret == LOS_ERRNO_TSK_TIMEOUT) {
ret = LOS_ERRNO_QUEUE_TIMEOUT;
goto QUEUE_END;
}
} else {
queueCB->readWriteableCnt[readWrite]--;
queueCB->readWriteableCnt[readWrite]--;//对应队列中计数器--
}
OsQueueBufferOperate(queueCB, operateType, bufferAddr, bufferSize);
OsQueueBufferOperate(queueCB, operateType, bufferAddr, bufferSize);//发起读或写队列操作
if (!LOS_ListEmpty(&queueCB->readWriteList[!readWrite])) {
resumedTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&queueCB->readWriteList[!readWrite]));
OsTaskWake(resumedTask);
if (!LOS_ListEmpty(&queueCB->readWriteList[!readWrite])) {//另外的operateType中还有其他消息时,如果 operateType=read,这时去查write队列,读写交互操作
resumedTask = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&queueCB->readWriteList[!readWrite]));//拿到拥有这个队列节点的任务
OsTaskWake(resumedTask);//唤醒任务去处理队列的值
SCHEDULER_UNLOCK(intSave);
LOS_MpSchedule(OS_MP_CPU_ALL);
LOS_Schedule();
LOS_MpSchedule(OS_MP_CPU_ALL);//让所有CPU参与调度
LOS_Schedule();//申请调度
return LOS_OK;
} else {
queueCB->readWriteableCnt[!readWrite]++;
......@@ -312,7 +312,7 @@ QUEUE_END:
SCHEDULER_UNLOCK(intSave);
return ret;
}
//接口函数 鸿蒙 LOS_ 开头的都是可供外面调用的接口函数
LITE_OS_SEC_TEXT UINT32 LOS_QueueReadCopy(UINT32 queueID,
VOID *bufferAddr,
UINT32 *bufferSize,
......@@ -363,7 +363,7 @@ LITE_OS_SEC_TEXT UINT32 LOS_QueueWriteCopy(UINT32 queueID,
operateType = OS_QUEUE_OPERATE_TYPE(OS_QUEUE_WRITE, OS_QUEUE_TAIL);
return OsQueueOperate(queueID, operateType, bufferAddr, &bufferSize, timeout);
}
//读一个队列数据
LITE_OS_SEC_TEXT UINT32 LOS_QueueRead(UINT32 queueID, VOID *bufferAddr, UINT32 bufferSize, UINT32 timeout)
{
return LOS_QueueReadCopy(queueID, bufferAddr, &bufferSize, timeout);
......
......@@ -131,7 +131,7 @@ STATIC VOID SortQueueIndexArray(UINT32 *indexArray, UINT32 count)
}
(VOID)LOS_MemFree((VOID *)OS_SYS_MEM_ADDR, indexArray);
}
//队列检查
VOID OsQueueCheck(VOID)
{
LosQueueCB queueNode = {0};
......
......@@ -43,33 +43,33 @@ extern "C" {
#if (LOSCFG_KERNEL_SMP == YES)
VOID LOS_MpSchedule(UINT32 target)
VOID LOS_MpSchedule(UINT32 target)//target每位对应CPU core
{
UINT32 cpuid = ArchCurrCpuid();
target &= ~(1U << cpuid);
HalIrqSendIpi(target, LOS_MP_IPI_SCHEDULE);
HalIrqSendIpi(target, LOS_MP_IPI_SCHEDULE);//处理器间中断(IPI)
}
//硬中断唤醒处理函数
VOID OsMpWakeHandler(VOID)
{
/* generic wakeup ipi, do nothing */
}
//硬中断调度处理函数
VOID OsMpScheduleHandler(VOID)
{
{//将调度标志设置为与唤醒功能不同,这样就可以在硬中断结束时触发调度程序。
/*
* set schedule flag to differ from wake function,
* so that the scheduler can be triggered at the end of irq.
*/
OsPercpuGet()->schedFlag = INT_PEND_RESCH;
OsPercpuGet()->schedFlag = INT_PEND_RESCH;//贴上调度标签
}
//硬中断调度处理函数
VOID OsMpHaltHandler(VOID)
{
(VOID)LOS_IntLock();
OsPercpuGet()->excFlag = CPU_HALT;
OsPercpuGet()->excFlag = CPU_HALT;//让当前Cpu停止工作
while (1) {}
while (1) {}//陷入空循环,也就是空闲状态
}
VOID OsMpCollectTasks(VOID)
......
......@@ -139,35 +139,35 @@ LITE_OS_SEC_TEXT_INIT VOID osRegister(VOID)
return;
}
//系统初始化已经完成,系统正式开始工作
LITE_OS_SEC_TEXT_INIT VOID OsStart(VOID)
{
LosProcessCB *runProcess = NULL;
LosTaskCB *taskCB = NULL;
UINT32 cpuid = ArchCurrCpuid();
OsTickStart();
OsTickStart();//启动tick
LOS_SpinLock(&g_taskSpin);
taskCB = OsGetTopTask();
taskCB = OsGetTopTask();//获取一个最高优先级任务
runProcess = OS_PCB_FROM_PID(taskCB->processID);
runProcess->processStatus |= OS_PROCESS_STATUS_RUNNING;
runProcess = OS_PCB_FROM_PID(taskCB->processID);//获取这个task所在进程
runProcess->processStatus |= OS_PROCESS_STATUS_RUNNING;//设这个进程为运行进程
#if (LOSCFG_KERNEL_SMP == YES)
/*
* attention: current cpu needs to be set, in case first task deletion
* may fail because this flag mismatch with the real current cpu.
*/
taskCB->currCpu = cpuid;
*///注意:当前cpu需要设置,以防第一个任务被删除可能会失败,因为此标志与实际当前cpu不匹配
taskCB->currCpu = cpuid;//设置当前cpuID为当前任务跑在这个CPUID上
runProcess->processStatus = OS_PROCESS_RUNTASK_COUNT_ADD(runProcess->processStatus);
#endif
OS_SCHEDULER_SET(cpuid);
OS_SCHEDULER_SET(cpuid);//设置调度要使用的cpu id
PRINTK("cpu %d entering scheduler\n", cpuid);
OsStartToRun(taskCB);
OsStartToRun(taskCB);//任务开始起跑
}
//进程通讯IPC初始化 由OsMain()调用
LITE_OS_SEC_TEXT_INIT STATIC UINT32 OsIpcInit(VOID)
{
UINT32 ret;
......@@ -178,8 +178,8 @@ LITE_OS_SEC_TEXT_INIT STATIC UINT32 OsIpcInit(VOID)
}
#endif
#if (LOSCFG_BASE_IPC_QUEUE == YES)
ret = OsQueueInit();
#if (LOSCFG_BASE_IPC_QUEUE == YES)//系统已配置支持队列IPC
ret = OsQueueInit();//队列初始化
if (ret != LOS_OK) {
return ret;
}
......@@ -302,7 +302,7 @@ LITE_OS_SEC_TEXT_INIT INT32 OsMain(VOID)
}
#if (LOSCFG_BASE_CORE_SWTMR == YES)
ret = OsSwtmrInit();
ret = OsSwtmrInit();//软时钟模块初始化
if (ret != LOS_OK) {
return ret;
}
......@@ -313,7 +313,7 @@ LITE_OS_SEC_TEXT_INIT INT32 OsMain(VOID)
#endif
#if (LOSCFG_KERNEL_SMP == YES)
(VOID)OsMpInit();
(VOID)OsMpInit();//多处理器模块的初始化
#endif
#if defined(LOSCFG_HW_RANDOM_ENABLE) || defined (LOSCFG_DRIVERS_RANDOM)
......@@ -322,7 +322,7 @@ LITE_OS_SEC_TEXT_INIT INT32 OsMain(VOID)
#endif
#ifdef LOSCFG_COMPAT_BSD
ret = OsBsdInit();
ret = OsBsdInit();//BSD模块初始化
if (ret != LOS_OK) {
PRINT_ERR("init bsd failed!\n");
return ret;
......@@ -333,7 +333,7 @@ LITE_OS_SEC_TEXT_INIT INT32 OsMain(VOID)
OsDriverPipeInit();
#endif
ret = OsSystemInit();
ret = OsSystemInit();//系统初始化
if (ret != LOS_OK) {
return ret;
}
......@@ -343,11 +343,11 @@ LITE_OS_SEC_TEXT_INIT INT32 OsMain(VOID)
#endif
#if (LOSCFG_KERNEL_TRACE == YES)
LOS_TraceInit();
LOS_TraceInit();//日志模块初始化,没有日志一片摸瞎.
#endif
#if (LOSCFG_KERNEL_LITEIPC == YES)
ret = LiteIpcInit();
ret = LiteIpcInit();//这是lite自有的IPC模块 初始化
if (ret != LOS_OK) {
return ret;
}
......@@ -361,20 +361,20 @@ LITE_OS_SEC_TEXT_INIT INT32 OsMain(VOID)
#endif
#ifdef LOSCFG_KERNEL_VDSO
ret = OsInitVdso();
if (ret != LOS_OK) {
ret = OsInitVdso();//VDSO模块初始化
if (ret != LOS_OK) {//VDSO就是Virtual Dynamic Shared Object,即内核提供的虚拟的.so,这个.so文件不在磁盘上,而是在内核里头
return ret;
}
#endif
ret = OsFutexInit();
//Fast Userspace muTexes (快速用户空间互斥体)
ret = OsFutexInit();//linux使用了futex来进行快速通信,pthread_xxx 相关接口全部都是基于futex实现的
if (ret != LOS_OK) {
PRINT_ERR("Create futex failed : %d!\n", ret);
return ret;
}
ret = OomTaskInit();
if (ret != LOS_OK) {
ret = OomTaskInit();//Out-Of-Memory 用户监控使用内存太大的task,在内存不足而某些进程太耗内存时
if (ret != LOS_OK) {//可以直接把进程干掉而释放内存
return ret;
}
......
......@@ -161,11 +161,11 @@ extern "C" {
* @ingroup los_event
* Event control structure
*/
typedef struct tagEvent {
typedef struct tagEvent {//EVENT_CB_S 这结构体名字取的不能统一下吗? 明显这里是另一个人的代码
UINT32 uwEventID; /**< Event mask in the event control block,
indicating the event that has been logically processed. */
LOS_DL_LIST stEventList; /**< Event control block linked list */
} EVENT_CB_S, *PEVENT_CB_S;
} EVENT_CB_S, *PEVENT_CB_S;//一个是结构体,一个是指针
/**
* @ingroup los_event
......
......@@ -45,9 +45,9 @@ extern "C" {
#define OS_MP_GC_PERIOD 100 /* ticks */
typedef enum {
LOS_MP_IPI_WAKEUP,
LOS_MP_IPI_SCHEDULE,
LOS_MP_IPI_HALT,
LOS_MP_IPI_WAKEUP, //唤醒CPU
LOS_MP_IPI_SCHEDULE,//调度CPU
LOS_MP_IPI_HALT, //停止CPU
} MP_IPI_TYPE;
#if (LOSCFG_KERNEL_SMP == YES)
......
......@@ -144,10 +144,11 @@ VOID HalIrqInit(VOID)
GIC_REG_32(GICD_CTLR) = 1;
#if (LOSCFG_KERNEL_SMP == YES)
/* register inter-processor interrupt */
(VOID)LOS_HwiCreate(LOS_MP_IPI_WAKEUP, 0xa0, 0, OsMpWakeHandler, 0);
(VOID)LOS_HwiCreate(LOS_MP_IPI_SCHEDULE, 0xa0, 0, OsMpScheduleHandler, 0);
(VOID)LOS_HwiCreate(LOS_MP_IPI_HALT, 0xa0, 0, OsMpHaltHandler, 0);
/* register inter-processor interrupt *///注册寄存器处理器间中断处理函数,啥意思?就是当前CPU核向其他CPU核发送中断信号
//处理器间中断允许一个CPU向系统其他的CPU发送中断信号,处理器间中断(IPI)不是通过IRQ线传输的,而是作为信号直接放在连接所有CPU本地APIC的总线上。
LOS_HwiCreate(LOS_MP_IPI_WAKEUP, 0xa0, 0, OsMpWakeHandler, 0);//中断处理函数
LOS_HwiCreate(LOS_MP_IPI_SCHEDULE, 0xa0, 0, OsMpScheduleHandler, 0);//中断处理函数
LOS_HwiCreate(LOS_MP_IPI_HALT, 0xa0, 0, OsMpScheduleHandler, 0);//中断处理函数
#endif
}
......
......@@ -399,10 +399,11 @@ VOID HalIrqInit(VOID)
HalIrqInitPercpu();
#if (LOSCFG_KERNEL_SMP == YES)
/* register inter-processor interrupt */
LOS_HwiCreate(LOS_MP_IPI_WAKEUP, 0xa0, 0, OsMpWakeHandler, 0);
LOS_HwiCreate(LOS_MP_IPI_SCHEDULE, 0xa0, 0, OsMpScheduleHandler, 0);
LOS_HwiCreate(LOS_MP_IPI_HALT, 0xa0, 0, OsMpScheduleHandler, 0);
/* register inter-processor interrupt *///注册寄存器处理器间中断处理函数,啥意思?就是当前CPU核向其他CPU核发送中断信号
//处理器间中断允许一个CPU向系统其他的CPU发送中断信号,处理器间中断(IPI)不是通过IRQ线传输的,而是作为信号直接放在连接所有CPU本地APIC的总线上。
LOS_HwiCreate(LOS_MP_IPI_WAKEUP, 0xa0, 0, OsMpWakeHandler, 0);//中断处理函数
LOS_HwiCreate(LOS_MP_IPI_SCHEDULE, 0xa0, 0, OsMpScheduleHandler, 0);//中断处理函数
LOS_HwiCreate(LOS_MP_IPI_HALT, 0xa0, 0, OsMpScheduleHandler, 0);//中断处理函数
#endif
}
......
......@@ -171,16 +171,16 @@ LITE_OS_SEC_TEXT_INIT INT32 main(VOID)
return LOS_NOK;
}
#if (LOSCFG_KERNEL_SMP == YES)
#if (LOSCFG_KERNEL_SMP == YES)//多核支持
PRINT_RELEASE("releasing %u secondary cores\n", LOSCFG_KERNEL_SMP_CORE_NUM - 1);
release_secondary_cores();
release_secondary_cores();//让CPU其他核也开始工作,真正的并行开始了.
#endif
CPU_MAP_SET(0, OsHwIDGet());
OsStart();
OsStart();//内核初始化完成,正式开始工作
while (1) {
__asm volatile("wfi");
__asm volatile("wfi");//让cpu进入idle状态
}
}
......@@ -197,13 +197,13 @@ int SysSchedGetParam(int id, int flag)
return OsGetProcessPriority(LOS_PRIO_PROCESS, id);
}
//设置调度参数
int SysSchedSetParam(int id, unsigned int prio, int flag)
{
int ret;
if (flag < 0) {
return -OsUserTaskSchedulerSet(id, LOS_SCHED_RR, prio, FALSE);
return -OsUserTaskSchedulerSet(id, LOS_SCHED_RR, prio, FALSE);//用户态任务调度设置
}
if (prio < OS_USER_PROCESS_PRIORITY_HIGHEST) {
......@@ -219,9 +219,9 @@ int SysSchedSetParam(int id, unsigned int prio, int flag)
return ret;
}
return OsSetProcessScheduler(LOS_PRIO_PROCESS, id, prio, LOS_SCHED_RR, FALSE);
return OsSetProcessScheduler(LOS_PRIO_PROCESS, id, prio, LOS_SCHED_RR, FALSE);//设置进程调度参数
}
//设置进程的优先级
int SysSetProcessPriority(int which, int who, unsigned int prio)
{
int ret;
......@@ -241,7 +241,7 @@ int SysSetProcessPriority(int which, int who, unsigned int prio)
return OsSetProcessScheduler(which, who, prio, LOS_SCHED_RR, FALSE);
}
//获取进程优先级
int SysGetProcessPriority(int which, int who)
{
if (who == 0) {
......
git add -A
git commit -m '鸿蒙源码分析系列篇 https://blog.csdn.net/kuangyufei
https://my.oschina.net/u/3751245'
git commit -m '内存,进程,task模块注释基本完成. 正在更新: 进程间IPC通讯消息队列模块代码注释...
鸿蒙内核源码分析系列 https://blog.csdn.net/kuangyufei https://my.oschina.net/u/3751245'
git push origin
git push gitee_origin master
git push github_origin master
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册