提交 d99011b6 编写于 作者: 鸿蒙内核源码分析's avatar 鸿蒙内核源码分析
上级 84f2e085
......@@ -38,7 +38,7 @@
extern "C" {
#endif /* __cplusplus */
#endif /* __cplusplus */
//从用户空间到内核空间的数据拷贝
INT32 LOS_StrncpyFromUser(CHAR *dst, const CHAR *src, INT32 count)
{
CHAR character;
......@@ -47,13 +47,13 @@ INT32 LOS_StrncpyFromUser(CHAR *dst, const CHAR *src, INT32 count)
size_t offset = 0;
if ((!LOS_IsKernelAddress((VADDR_T)(UINTPTR)dst)) || (!LOS_IsUserAddress((VADDR_T)(UINTPTR)src)) || (count <= 0)) {
return -EFAULT;
return -EFAULT;//判断是否在各自空间
}
maxCount = (LOS_IsUserAddressRange((VADDR_T)(UINTPTR)src, (size_t)count)) ? \
count : (USER_ASPACE_TOP_MAX - (UINTPTR)src);
for (i = 0; i < maxCount; ++i) {
count : (USER_ASPACE_TOP_MAX - (UINTPTR)src);//最大能拷贝的数据量,结束地址不能超过 USER_ASPACE_TOP_MAX
//USER_ASPACE_TOP_MAX 是用户空间能触及的最大虚拟内存空间地址
for (i = 0; i < maxCount; ++i) {//一个个字符拷贝
if (LOS_GetUser(&character, src + offset) != LOS_OK) {
return -EFAULT;
}
......
......@@ -55,7 +55,7 @@ extern "C" {
* @return Return -EFAULT if error. Return 0 if success.
*/
#define LOS_GetUser(dst, src) _arm_get_user((dst), (src), sizeof(*(dst)), sizeof(*(src)))
//LOS_GetUser 用于在复制数据之前验证用户模式是否有权访问src。
#ifdef __cplusplus
#if __cplusplus
}
......
......@@ -67,7 +67,7 @@ extern "C" {
//LITE_OS_SEC_BSS 和 LITE_OS_SEC_DATA_INIT 是告诉编译器这些全局变量放在哪个数据段
LITE_OS_SEC_BSS LosProcessCB *g_runProcess[LOSCFG_KERNEL_CORE_NUM];// CPU内核个数,超过一个就实现了并行
LITE_OS_SEC_BSS LosProcessCB *g_processCBArray = NULL; // 进程池数组
LITE_OS_SEC_DATA_INIT STATIC LOS_DL_LIST g_freeProcess;// 空闲状态下可供分配的进程,此时进程白纸一张
LITE_OS_SEC_DATA_INIT STATIC LOS_DL_LIST g_freeProcess;// 空闲状态下的进程链表, .个人觉得应该取名为 g_freeProcessList
LITE_OS_SEC_DATA_INIT STATIC LOS_DL_LIST g_processRecyleList;// 需要回收的进程列表
LITE_OS_SEC_BSS UINT32 g_userInitProcess = OS_INVALID_VALUE;// 用户态的初始init进程,用户态下其他进程由它 fork
LITE_OS_SEC_BSS UINT32 g_kernelInitProcess = OS_INVALID_VALUE;// 内核态初始Kprocess进程,内核态下其他进程由它 fork
......@@ -408,7 +408,7 @@ LITE_OS_SEC_TEXT STATIC VOID OsRecycleZombiesProcess(LosProcessCB *childCB, Proc
LOS_ListDelete(&childCB->pendList);
if (childCB->processStatus & OS_PROCESS_FLAG_EXIT) {
LOS_ListHeadInsert(&g_processRecyleList, &childCB->pendList);
LOS_ListHeadInsert(&g_processRecyleList, &childCB->pendList);//注意g_processRecyleList挂的是pendList节点,所以要通过OS_PCB_FROM_PENDLIST找.
} else if (childCB->processStatus & OS_PROCESS_FLAG_GROUP_LEADER) {
LOS_ListTailInsert(&g_processRecyleList, &childCB->pendList);
} else {
......@@ -522,7 +522,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsProcessInit(VOID)
for (index = 0; index < g_processMaxNum; index++) {//进程池循环创建
g_processCBArray[index].processID = index;//进程ID[0-g_processMaxNum]赋值
g_processCBArray[index].processStatus = OS_PROCESS_FLAG_UNUSED;// 默认都是白纸一张,臣妾干净着呢
LOS_ListTailInsert(&g_freeProcess, &g_processCBArray[index].pendList);// 初始全是可分配进程描述符
LOS_ListTailInsert(&g_freeProcess, &g_processCBArray[index].pendList);//注意g_freeProcess挂的是pendList节点,所以使用要通过OS_PCB_FROM_PENDLIST找到进程实体.
}
// ????? 为啥用户模式的根进程 选1 ,内核模式的根进程选2
g_userInitProcess = 1; /* 1: The root process ID of the user-mode process is fixed at 1 *///用户模式的根进程
......@@ -563,7 +563,7 @@ STATIC UINT32 OsCreateIdleProcess(VOID)
(VOID)memcpy_s(OS_TCB_FROM_TID(*idleTaskID)->taskName, OS_TCB_NAME_LEN, idleName, strlen(idleName));//task 名字叫 idle
return LOS_OK;
}
//进程回收再利用过程
LITE_OS_SEC_TEXT VOID OsProcessCBRecyleToFree(VOID)
{
UINT32 intSave;
......@@ -571,8 +571,9 @@ LITE_OS_SEC_TEXT VOID OsProcessCBRecyleToFree(VOID)
LosProcessCB *processCB = NULL;
SCHEDULER_LOCK(intSave);
while (!LOS_ListEmpty(&g_processRecyleList)) {
processCB = OS_PCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&g_processRecyleList));
while (!LOS_ListEmpty(&g_processRecyleList)) {//循环回收链表,直到为空
processCB = OS_PCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&g_processRecyleList));//找到回收链表中第一个进程实体
//OS_PCB_FROM_PENDLIST 代表的是通过pendlist节点找到 PCB实体,因为g_processRecyleList上面挂的是pendlist节点位置
if (!(processCB->processStatus & OS_PROCESS_FLAG_EXIT)) {
break;
}
......@@ -704,13 +705,13 @@ STATIC UINT32 OsInitPCB(LosProcessCB *processCB, UINT32 mode, UINT16 priority, U
processCB->threadGroupID = OS_INVALID_VALUE;//所属线程组
processCB->priority = priority;//优先级
processCB->policy = policy;//调度算法 LOS_SCHED_RR
processCB->umask = OS_PROCESS_DEFAULT_UMASK;
processCB->umask = OS_PROCESS_DEFAULT_UMASK;//掩码
processCB->timerID = (timer_t)(UINTPTR)MAX_INVALID_TIMER_VID;
LOS_ListInit(&processCB->threadSiblingList);
LOS_ListInit(&processCB->childrenList);
LOS_ListInit(&processCB->exitChildList);
LOS_ListInit(&(processCB->waitList));
LOS_ListInit(&processCB->threadSiblingList);//初始化任务/线程链表
LOS_ListInit(&processCB->childrenList); //初始化孩子链表
LOS_ListInit(&processCB->exitChildList); //初始化记录哪些孩子退出了的链表
LOS_ListInit(&(processCB->waitList)); //初始化等待链表
for (count = 0; count < OS_PRIORITY_QUEUE_NUM; ++count) { //根据 priority数 创建对应个数的队列
LOS_ListInit(&processCB->threadPriQueueList[count]);
......@@ -1044,41 +1045,41 @@ EXIT:
SCHEDULER_UNLOCK(intSave);//还锁
return -ret;
}
//接口封装 - 设置进程调度参数
LITE_OS_SEC_TEXT INT32 LOS_SetProcessScheduler(INT32 pid, UINT16 policy, UINT16 prio)
{
return OsSetProcessScheduler(LOS_PRIO_PROCESS, pid, prio, policy, TRUE);
}
//接口封装 - 获得进程调度参数
LITE_OS_SEC_TEXT INT32 LOS_GetProcessScheduler(INT32 pid)
{
LosProcessCB *processCB = NULL;
UINT32 intSave;
INT32 policy;
if (OS_PID_CHECK_INVALID(pid)) {
if (OS_PID_CHECK_INVALID(pid)) {//检查PID不能越界
return -LOS_EINVAL;
}
SCHEDULER_LOCK(intSave);
processCB = OS_PCB_FROM_PID(pid);
if (OsProcessIsUnused(processCB)) {
processCB = OS_PCB_FROM_PID(pid);//通过pid获取进程实体
if (OsProcessIsUnused(processCB)) {//进程是否在使用判断
policy = -LOS_ESRCH;
goto OUT;
}
policy = processCB->policy;
policy = processCB->policy;//获取进程调度方式
OUT:
SCHEDULER_UNLOCK(intSave);
return policy;
}
//接口封装 - 设置进程优先级
LITE_OS_SEC_TEXT INT32 LOS_SetProcessPriority(INT32 pid, UINT16 prio)
{
return OsSetProcessScheduler(LOS_PRIO_PROCESS, pid, prio, LOS_SCHED_RR, FALSE);
return OsSetProcessScheduler(LOS_PRIO_PROCESS, pid, prio, LOS_SCHED_RR, FALSE);//抢占式调度
}
//接口封装 - 获取进程优先级 which:标识进程,进程组,用户
LITE_OS_SEC_TEXT INT32 OsGetProcessPriority(INT32 which, INT32 pid)
{
LosProcessCB *processCB = NULL;
......@@ -1107,12 +1108,12 @@ OUT:
SCHEDULER_UNLOCK(intSave);
return prio;
}
//接口封装 - 获取进程优先级
LITE_OS_SEC_TEXT INT32 LOS_GetProcessPriority(INT32 pid)
{
return OsGetProcessPriority(LOS_PRIO_PROCESS, pid);
}
//等待唤醒进程的信号
LITE_OS_SEC_TEXT VOID OsWaitSignalToWakeProcess(LosProcessCB *processCB)
{
LosTaskCB *taskCB = NULL;
......@@ -1122,11 +1123,11 @@ LITE_OS_SEC_TEXT VOID OsWaitSignalToWakeProcess(LosProcessCB *processCB)
}
/* only suspend process can continue */
if (!(processCB->processStatus & OS_PROCESS_STATUS_PEND)) {
if (!(processCB->processStatus & OS_PROCESS_STATUS_PEND)) {//进程必须处于阻塞状态
return;
}
if (!LOS_ListEmpty(&processCB->waitList)) {
if (!LOS_ListEmpty(&processCB->waitList)) {//进程保存waitLits以支持wait/waitpid
taskCB = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&processCB->waitList));
OsWaitWakeTask(taskCB, OS_INVALID_VALUE);
}
......@@ -1702,7 +1703,7 @@ STATIC VOID OsInitCopyTaskParam(LosProcessCB *childProcessCB, const CHAR *name,
SCHEDULER_UNLOCK(intSave);
}
//拷贝一个Task过程
STATIC UINT32 OsCopyTask(UINT32 flags, LosProcessCB *childProcessCB, const CHAR *name, UINTPTR entry, UINT32 size)
{
LosTaskCB *childTaskCB = NULL;
......@@ -1711,9 +1712,9 @@ STATIC UINT32 OsCopyTask(UINT32 flags, LosProcessCB *childProcessCB, const CHAR
UINT32 intSave;
UINT32 taskID;
OsInitCopyTaskParam(childProcessCB, name, entry, size, &childPara);
OsInitCopyTaskParam(childProcessCB, name, entry, size, &childPara);//初始化Task参数
ret = LOS_TaskCreateOnly(&taskID, &childPara);
ret = LOS_TaskCreateOnly(&taskID, &childPara);//只创建任务,不调度
if (ret != LOS_OK) {
if (ret == LOS_ERRNO_TSK_TCB_UNAVAILABLE) {
return LOS_EAGAIN;
......@@ -1721,19 +1722,19 @@ STATIC UINT32 OsCopyTask(UINT32 flags, LosProcessCB *childProcessCB, const CHAR
return LOS_ENOMEM;
}
childTaskCB = OS_TCB_FROM_TID(taskID);
childTaskCB->taskStatus = OsCurrTaskGet()->taskStatus;
if (childTaskCB->taskStatus & OS_TASK_STATUS_RUNNING) {
childTaskCB->taskStatus &= ~OS_TASK_STATUS_RUNNING;
} else {
if (OS_SCHEDULER_ACTIVE) {
childTaskCB = OS_TCB_FROM_TID(taskID);//通过taskId获取task实体
childTaskCB->taskStatus = OsCurrTaskGet()->taskStatus;//任务状态先同步,注意这里是赋值操作. ...01101001
if (childTaskCB->taskStatus & OS_TASK_STATUS_RUNNING) {//因只能有一个运行的task,所以如果一样要改4号位
childTaskCB->taskStatus &= ~OS_TASK_STATUS_RUNNING;//将四号位清0 ,变成 ...01100001
} else {//非运行状态下会发生什么?
if (OS_SCHEDULER_ACTIVE) {//克隆线程发生错误未运行
LOS_Panic("Clone thread status not running error status: 0x%x\n", childTaskCB->taskStatus);
}
childTaskCB->taskStatus &= ~OS_TASK_STATUS_UNUSED;
childProcessCB->priority = OS_PROCESS_PRIORITY_LOWEST;
childTaskCB->taskStatus &= ~OS_TASK_STATUS_UNUSED;//干净的Task
childProcessCB->priority = OS_PROCESS_PRIORITY_LOWEST;//进程设为最低优先级
}
if (OsProcessIsUserMode(childProcessCB)) {
if (OsProcessIsUserMode(childProcessCB)) {//是否是用户进程
SCHEDULER_LOCK(intSave);
OsUserCloneParentStack(childTaskCB, OsCurrTaskGet());
SCHEDULER_UNLOCK(intSave);
......@@ -1970,33 +1971,33 @@ LITE_OS_SEC_TEXT VOID OsProcessExit(LosTaskCB *runTask, INT32 status)
OsProcessNaturalExit(runTask, status);
SCHEDULER_UNLOCK(intSave);
}
//接口封装 进程退出
LITE_OS_SEC_TEXT VOID LOS_Exit(INT32 status)
{
OsTaskExitGroup((UINT32)status);
OsProcessExit(OsCurrTaskGet(), (UINT32)status);
}
//获取用户进程的根进程,所有用户进程都是g_processCBArray[g_userInitProcess] fork来的
LITE_OS_SEC_TEXT UINT32 OsGetUserInitProcessID(VOID)
{
return g_userInitProcess;
}
//获取Idel进程,CPU不公正时待的地方,等待被事件唤醒
LITE_OS_SEC_TEXT UINT32 OsGetIdleProcessID(VOID)
{
return g_kernelIdleProcess;
}
//获取内核进程的根进程,所有内核进程都是g_processCBArray[g_kernelInitProcess] fork来的,包括g_processCBArray[g_kernelIdleProcess]进程
LITE_OS_SEC_TEXT UINT32 OsGetKernelInitProcessID(VOID)
{
return g_kernelInitProcess;
}
//设置进程的中断处理函数
LITE_OS_SEC_TEXT VOID OsSetSigHandler(UINTPTR addr)
{
OsCurrProcessGet()->sigHandler = addr;
}
//获取进程的中断处理函数
LITE_OS_SEC_TEXT UINTPTR OsGetSigHandler(VOID)
{
return OsCurrProcessGet()->sigHandler;
......
......@@ -80,7 +80,7 @@ typedef struct ProcessCB {
CHAR processName[OS_PCB_NAME_LEN]; /**< Process name */
UINT32 processID; /**< process ID = leader thread ID */
UINT16 processStatus; /**< [15:4] process Status; [3:0] The number of threads currently
running in the process */
running in the process *///这里设计很巧妙.用一个16表示了两层逻辑 数量和状态,点赞!
UINT16 priority; /**< process priority */
UINT16 policy; /**< process policy */
UINT16 timeSlice; /**< Remaining time slice */
......@@ -139,9 +139,9 @@ typedef struct ProcessCB {
#define CLONE_PARENT 0x00008000
#define CLONE_THREAD 0x00010000
#define OS_PCB_FROM_PID(processID) (((LosProcessCB *)g_processCBArray) + (processID))
#define OS_PCB_FROM_SIBLIST(ptr) LOS_DL_LIST_ENTRY((ptr), LosProcessCB, siblingList)
#define OS_PCB_FROM_PENDLIST(ptr) LOS_DL_LIST_ENTRY((ptr), LosProcessCB, pendList)
#define OS_PCB_FROM_PID(processID) (((LosProcessCB *)g_processCBArray) + (processID))//通过数组找到LosProcessCB
#define OS_PCB_FROM_SIBLIST(ptr) LOS_DL_LIST_ENTRY((ptr), LosProcessCB, siblingList)//通过siblingList节点找到 LosProcessCB
#define OS_PCB_FROM_PENDLIST(ptr) LOS_DL_LIST_ENTRY((ptr), LosProcessCB, pendList) //通过pendlist节点找到 LosProcessCB
/**
* @ingroup los_process
......@@ -149,7 +149,7 @@ typedef struct ProcessCB {
*
* The process is created but does not participate in scheduling.
*/
#define OS_PROCESS_STATUS_INIT 0x0010U
#define OS_PROCESS_STATUS_INIT 0x0010U //进程初始状态
/**
* @ingroup los_process
......@@ -157,7 +157,7 @@ typedef struct ProcessCB {
*
* The process is ready.
*/
#define OS_PROCESS_STATUS_READY 0x0020U
#define OS_PROCESS_STATUS_READY 0x0020U //进程就绪状态
/**
* @ingroup los_process
......@@ -165,7 +165,7 @@ typedef struct ProcessCB {
*
* The process is running.
*/
#define OS_PROCESS_STATUS_RUNNING 0x0040U
#define OS_PROCESS_STATUS_RUNNING 0x0040U //进程运行状态
/**
* @ingroup los_process
......@@ -173,7 +173,7 @@ typedef struct ProcessCB {
*
* The process is pend
*/
#define OS_PROCESS_STATUS_PEND 0x0080U
#define OS_PROCESS_STATUS_PEND 0x0080U //进程阻塞状态
/**
* @ingroup los_process
......@@ -181,7 +181,7 @@ typedef struct ProcessCB {
*
* The process is run out but the resources occupied by the process are not recovered.
*/
#define OS_PROCESS_STATUS_ZOMBIES 0x100U
#define OS_PROCESS_STATUS_ZOMBIES 0x100U //进程僵死状态
/**
* @ingroup los_process
......@@ -189,15 +189,15 @@ typedef struct ProcessCB {
*
* The number of task currently running under the process, it only works with multiple cores.
*/
#define OS_PROCESS_RUNTASK_COUNT_MASK 0x000FU
#define OS_PROCESS_RUNTASK_COUNT_MASK 0x000FU //进程处于运行状态的数量掩码
//进程当前运行的任务数,它只适用于多个内核,这里注意 一个进程的多个任务是可以同时给多个内核运行的.
/**
* @ingroup los_process
* Flag that indicates the process or process control block status.
*
* The process status mask.
*/
#define OS_PROCESS_STATUS_MASK 0xFFF0U
#define OS_PROCESS_STATUS_MASK 0xFFF0U //进程状态掩码
/**
* @ingroup los_process
......@@ -206,7 +206,7 @@ typedef struct ProcessCB {
* The process status equal this is process control block unused,
* coexisting with OS_PROCESS_STATUS_ZOMBIES means that the control block is not recovered.
*/
#define OS_PROCESS_FLAG_UNUSED 0x0200U
#define OS_PROCESS_FLAG_UNUSED 0x0200U //进程未使用标签,一般用于进程的初始状态 freelist里面都是这种标签
/**
* @ingroup los_process
......@@ -214,7 +214,7 @@ typedef struct ProcessCB {
*
* The process has been call exit, it only works with multiple cores.
*/
#define OS_PROCESS_FLAG_EXIT 0x0400U
#define OS_PROCESS_FLAG_EXIT 0x0400U //进程退出标签,退出的进程进入回收链表等待回收资源
/**
* @ingroup los_process
......@@ -222,7 +222,7 @@ typedef struct ProcessCB {
*
* The process is the leader of the process group.
*/
#define OS_PROCESS_FLAG_GROUP_LEADER 0x0800U
#define OS_PROCESS_FLAG_GROUP_LEADER 0x0800U //进程当了进程组领导标签
/**
* @ingroup los_process
......@@ -230,7 +230,7 @@ typedef struct ProcessCB {
*
* The process has performed the exec operation.
*/
#define OS_PROCESS_FLAG_ALREADY_EXEC 0x1000U
#define OS_PROCESS_FLAG_ALREADY_EXEC 0x1000U //进程已经开始工作的标签
/**
* @ingroup los_process
......@@ -238,13 +238,13 @@ typedef struct ProcessCB {
*
* The process is dying or already dying.
*/
#define OS_PROCESS_STATUS_INACTIVE (OS_PROCESS_FLAG_EXIT | OS_PROCESS_STATUS_ZOMBIES)
#define OS_PROCESS_STATUS_INACTIVE (OS_PROCESS_FLAG_EXIT | OS_PROCESS_STATUS_ZOMBIES)
//不活跃进程定义: 身上贴有退出便签且状态为僵死的进程
/**
* @ingroup los_process
* Used to check if the process control block is unused.
*/
STATIC INLINE BOOL OsProcessIsUnused(const LosProcessCB *processCB)
STATIC INLINE BOOL OsProcessIsUnused(const LosProcessCB *processCB)//查下进程是否没在使用?
{
return ((processCB->processStatus & OS_PROCESS_FLAG_UNUSED) != 0);
}
......@@ -253,7 +253,7 @@ STATIC INLINE BOOL OsProcessIsUnused(const LosProcessCB *processCB)
* @ingroup los_process
* Used to check if the process is inactive.
*/
STATIC INLINE BOOL OsProcessIsInactive(const LosProcessCB *processCB)
STATIC INLINE BOOL OsProcessIsInactive(const LosProcessCB *processCB)//查下进程是否不活跃?
{
return ((processCB->processStatus & (OS_PROCESS_FLAG_UNUSED | OS_PROCESS_STATUS_INACTIVE)) != 0);
}
......@@ -262,46 +262,46 @@ STATIC INLINE BOOL OsProcessIsInactive(const LosProcessCB *processCB)
* @ingroup los_process
* Used to check if the process is dead.
*/
STATIC INLINE BOOL OsProcessIsDead(const LosProcessCB *processCB)
STATIC INLINE BOOL OsProcessIsDead(const LosProcessCB *processCB)//查下进程是否死啦死啦滴?
{
return ((processCB->processStatus & (OS_PROCESS_FLAG_UNUSED | OS_PROCESS_STATUS_ZOMBIES)) != 0);
}
}//进程死啦死啦的定义: 身上贴有不使用且状态为僵死的进程
/**
* @ingroup los_process
* Hold the time slice process
*/
#define OS_PROCESS_SCHED_RR_INTERVAL LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT
#define OS_PROCESS_SCHED_RR_INTERVAL LOSCFG_BASE_CORE_TIMESLICE_TIMEOUT //抢占式调度方式采用的时间片数量
/**
* @ingroup los_process
* The highest priority of a kernel mode process.
*/
#define OS_PROCESS_PRIORITY_HIGHEST 0
#define OS_PROCESS_PRIORITY_HIGHEST 0 //进程最高优先级
/**
* @ingroup los_process
* The lowest priority of a kernel mode process
*/
#define OS_PROCESS_PRIORITY_LOWEST 31
#define OS_PROCESS_PRIORITY_LOWEST 31 //进程最低优先级
/**
* @ingroup los_process
* The highest priority of a user mode process.
*/
#define OS_USER_PROCESS_PRIORITY_HIGHEST 10
#define OS_USER_PROCESS_PRIORITY_HIGHEST 10 //内核模式和用户模式的优先级分割线 10-31 用户级, 0-9内核级
/**
* @ingroup los_process
* The lowest priority of a user mode process
*/
#define OS_USER_PROCESS_PRIORITY_LOWEST OS_PROCESS_PRIORITY_LOWEST
#define OS_USER_PROCESS_PRIORITY_LOWEST OS_PROCESS_PRIORITY_LOWEST //用户进程的最低优先级
/**
* @ingroup los_process
* User state root process default priority
*/
#define OS_PROCESS_USERINIT_PRIORITY 28
#define OS_PROCESS_USERINIT_PRIORITY 28 //用户进程默认的优先级,28级好低啊
#define OS_GET_PROCESS_STATUS(status) ((UINT16)((UINT16)(status) & OS_PROCESS_STATUS_MASK))
#define OS_PROCESS_GET_RUNTASK_COUNT(status) ((UINT16)(((UINT16)(status)) & OS_PROCESS_RUNTASK_COUNT_MASK))
......@@ -310,24 +310,24 @@ STATIC INLINE BOOL OsProcessIsDead(const LosProcessCB *processCB)
#define OS_PROCESS_RUNTASK_COUNT_DEC(status) ((UINT16)(((UINT16)(status)) & OS_PROCESS_STATUS_MASK) | \
((OS_PROCESS_GET_RUNTASK_COUNT(status) - 1) & OS_PROCESS_RUNTASK_COUNT_MASK))
#define OS_TASK_DEFAULT_STACK_SIZE 0x2000
#define OS_USER_TASK_SYSCALL_SATCK_SIZE 0x3000
#define OS_USER_TASK_STACK_SIZE 0x100000
#define OS_TASK_DEFAULT_STACK_SIZE 0x2000 //task默认栈大小 8K
#define OS_USER_TASK_SYSCALL_SATCK_SIZE 0x3000 //用户通过系统调用的栈大小 12K ,这时是运行在内核模式下
#define OS_USER_TASK_STACK_SIZE 0x100000 //用户任务运行在用户空间的栈大小 1M
#define OS_KERNEL_MODE 0x0U
#define OS_USER_MODE 0x1U
STATIC INLINE BOOL OsProcessIsUserMode(const LosProcessCB *processCB)
#define OS_KERNEL_MODE 0x0U //内核模式
#define OS_USER_MODE 0x1U //用户模式
STATIC INLINE BOOL OsProcessIsUserMode(const LosProcessCB *processCB)//是用户进程吗?
{
return (processCB->processMode == OS_USER_MODE);
}
#define LOS_SCHED_NORMAL 0U
#define LOS_SCHED_FIFO 1U //先进先出,按顺序
#define LOS_SCHED_RR 2U //抢占式调度
#define LOS_SCHED_NORMAL 0U //正常调度
#define LOS_SCHED_FIFO 1U //先进先出,按顺序
#define LOS_SCHED_RR 2U //抢占式调度
#define LOS_PRIO_PROCESS 0U //进程标识
#define LOS_PRIO_PGRP 1U
#define LOS_PRIO_USER 2U
#define LOS_PRIO_PROCESS 0U //进程标识
#define LOS_PRIO_PGRP 1U //进程组标识
#define LOS_PRIO_USER 2U //用户标识
#define OS_KERNEL_PROCESS_GROUP 2U //内核进程组
#define OS_USER_PRIVILEGE_PROCESS_GROUP 1U //用户特权进程组
......@@ -338,28 +338,28 @@ STATIC INLINE BOOL OsProcessIsUserMode(const LosProcessCB *processCB)
* | | exit code | core dump | signal |
*/
#define OS_PRO_EXIT_OK 0
//以下函数都是进程的退出方式
STATIC INLINE VOID OsProcessExitCodeCoreDumpSet(LosProcessCB *processCB)
{
processCB->exitCode |= 0x80U;
processCB->exitCode |= 0x80U;// 0b10000000 对应退出码为看
}
STATIC INLINE VOID OsProcessExitCodeSignalSet(LosProcessCB *processCB, UINT32 signal)
{
processCB->exitCode |= signal & 0x7FU;
processCB->exitCode |= signal & 0x7FU;//0b01111111
}
STATIC INLINE VOID OsProcessExitCodeSignalClear(LosProcessCB *processCB)
{
processCB->exitCode &= (~0x7FU);
processCB->exitCode &= (~0x7FU);//低7位全部清0
}
STATIC INLINE BOOL OsProcessExitCodeSignalIsSet(LosProcessCB *processCB)
{
return (processCB->exitCode) & 0x7FU;
return (processCB->exitCode) & 0x7FU;//低7位全部置1
}
STATIC INLINE VOID OsProcessExitCodeSet(LosProcessCB *processCB, UINT32 code)
STATIC INLINE VOID OsProcessExitCodeSet(LosProcessCB *processCB, UINT32 code)//外界提供退出码
{
processCB->exitCode |= ((code & 0x000000FFU) << 8U) & 0x0000FF00U; /* 8: Move 8 bits to the left, exitCode */
}
......@@ -374,18 +374,18 @@ STATIC INLINE BOOL OsProcessIDUserCheckInvalid(UINT32 pid)
{
return ((pid >= g_processMaxNum) || (pid == 0));
}
//获取当前进程PCB
STATIC INLINE LosProcessCB *OsCurrProcessGet(VOID)
{
UINT32 intSave;
LosProcessCB *runProcess = NULL;
intSave = LOS_IntLock();
runProcess = g_runProcess[ArchCurrCpuid()];
LOS_IntRestore(intSave);
intSave = LOS_IntLock();//不响应硬件中断
runProcess = g_runProcess[ArchCurrCpuid()];//定义当前进程:当前运行进程数组里找索引位当前运行的CPU核ID的
LOS_IntRestore(intSave);//恢复硬件中断
return runProcess;
}
//设置当前进程,加入g_runProcess中
STATIC INLINE VOID OsCurrProcessSet(const LosProcessCB *process)
{
g_runProcess[ArchCurrCpuid()] = (LosProcessCB *)process;
......
......@@ -37,7 +37,7 @@
#include "user_copy.h"
#include "los_signal.h"
#include "los_strncpy_from_user.h"
//打开消息队列
mqd_t SysMqOpen(const char *mqName, int openFlag, mode_t mode, struct mq_attr *attr)
{
mqd_t ret;
......
......@@ -133,7 +133,7 @@ int SysSchedGetScheduler(int id, int flag)
return LOS_GetProcessScheduler(id);
}
//系统调用,设置调度参数
int SysSchedSetScheduler(int id, int policy, int prio, int flag)
{
int ret;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册