|
|
@ -1,4 +1,9 @@
|
|
|
|
/*
|
|
|
|
/*并发(Concurrent):多个线程在单个核心运行,同一时间只能一个线程运行,内核不停切换线程,
|
|
|
|
|
|
|
|
看起来像同时运行,实际上是线程不停切换
|
|
|
|
|
|
|
|
并行(Parallel)每个线程分配给独立的CPU核心,线程同时运行
|
|
|
|
|
|
|
|
单核CPU多个进程或多个线程内能实现并发(微观上的串行,宏观上的并行)
|
|
|
|
|
|
|
|
多核CPU线程间可以实现宏观和微观上的并行
|
|
|
|
|
|
|
|
LITE_OS_SEC_BSS 和 LITE_OS_SEC_DATA_INIT 是告诉编译器这些全局变量放在哪个数据段
|
|
|
|
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
|
|
|
|
* Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
|
|
|
|
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
|
|
|
|
* Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
|
|
|
|
*
|
|
|
|
*
|
|
|
@ -56,23 +61,23 @@
|
|
|
|
#include "los_vm_syscall.h"
|
|
|
|
#include "los_vm_syscall.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LITE_OS_SEC_BSS LosProcessCB *g_processCBArray = NULL;
|
|
|
|
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;///< 空闲状态下的进程链表
|
|
|
|
LITE_OS_SEC_DATA_INIT STATIC LOS_DL_LIST g_processRecycleList;
|
|
|
|
LITE_OS_SEC_DATA_INIT STATIC LOS_DL_LIST g_processRecycleList;///< 需要回收的进程列表
|
|
|
|
LITE_OS_SEC_BSS UINT32 g_userInitProcess = OS_INVALID_VALUE;
|
|
|
|
LITE_OS_SEC_BSS UINT32 g_userInitProcess = OS_INVALID_VALUE;
|
|
|
|
LITE_OS_SEC_BSS UINT32 g_kernelInitProcess = OS_INVALID_VALUE;
|
|
|
|
LITE_OS_SEC_BSS UINT32 g_kernelInitProcess = OS_INVALID_VALUE;
|
|
|
|
LITE_OS_SEC_BSS UINT32 g_kernelIdleProcess = OS_INVALID_VALUE;
|
|
|
|
LITE_OS_SEC_BSS UINT32 g_kernelIdleProcess = OS_INVALID_VALUE;
|
|
|
|
LITE_OS_SEC_BSS UINT32 g_processMaxNum;
|
|
|
|
LITE_OS_SEC_BSS UINT32 g_processMaxNum;///< 进程最大数量,默认64个
|
|
|
|
LITE_OS_SEC_BSS ProcessGroup *g_processGroup = NULL;
|
|
|
|
LITE_OS_SEC_BSS ProcessGroup *g_processGroup = NULL;///< 全局进程组,负责管理所有进程组
|
|
|
|
|
|
|
|
//将进程插入到空闲的链表中//
|
|
|
|
STATIC INLINE VOID OsInsertPCBToFreeList(LosProcessCB *processCB)
|
|
|
|
STATIC INLINE VOID OsInsertPCBToFreeList(LosProcessCB *processCB)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
UINT32 pid = processCB->processID;
|
|
|
|
UINT32 pid = processCB->processID;//获取进程ID
|
|
|
|
(VOID)memset_s(processCB, sizeof(LosProcessCB), 0, sizeof(LosProcessCB));
|
|
|
|
(VOID)memset_s(processCB, sizeof(LosProcessCB), 0, sizeof(LosProcessCB));//进程描述符数据清0
|
|
|
|
processCB->processID = pid;
|
|
|
|
processCB->processID = pid;//进程ID
|
|
|
|
processCB->processStatus = OS_PROCESS_FLAG_UNUSED;
|
|
|
|
processCB->processStatus = OS_PROCESS_FLAG_UNUSED;//设置为进程未使用
|
|
|
|
processCB->timerID = (timer_t)(UINTPTR)MAX_INVALID_TIMER_VID;
|
|
|
|
processCB->timerID = (timer_t)(UINTPTR)MAX_INVALID_TIMER_VID;//timeID初始化值
|
|
|
|
LOS_ListTailInsert(&g_freeProcess, &processCB->pendList);
|
|
|
|
LOS_ListTailInsert(&g_freeProcess, &processCB->pendList);//进程节点挂入g_freeProcess以分配给后续进程使用
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
STATIC ProcessGroup *OsCreateProcessGroup(UINT32 pid)
|
|
|
|
STATIC ProcessGroup *OsCreateProcessGroup(UINT32 pid)
|
|
|
@ -97,25 +102,25 @@ STATIC ProcessGroup *OsCreateProcessGroup(UINT32 pid)
|
|
|
|
|
|
|
|
|
|
|
|
return group;
|
|
|
|
return group;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* 退出进程组,参数是进程地址和进程组地址的地址 */
|
|
|
|
STATIC VOID OsExitProcessGroup(LosProcessCB *processCB, ProcessGroup **group)
|
|
|
|
STATIC VOID OsExitProcessGroup(LosProcessCB *processCB, ProcessGroup **group)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
LosProcessCB *groupProcessCB = OS_PCB_FROM_PID(processCB->group->groupID);
|
|
|
|
LosProcessCB *groupProcessCB = OS_PCB_FROM_PID(processCB->group->groupID);
|
|
|
|
|
|
|
|
|
|
|
|
LOS_ListDelete(&processCB->subordinateGroupList);
|
|
|
|
LOS_ListDelete(&processCB->subordinateGroupList);//从进程组进程链表上摘出去
|
|
|
|
if (LOS_ListEmpty(&processCB->group->processList) && LOS_ListEmpty(&processCB->group->exitProcessList)) {
|
|
|
|
if (LOS_ListEmpty(&processCB->group->processList) && LOS_ListEmpty(&processCB->group->exitProcessList)) {
|
|
|
|
LOS_ListDelete(&processCB->group->groupList);
|
|
|
|
LOS_ListDelete(&processCB->group->groupList);
|
|
|
|
groupProcessCB->processStatus &= ~OS_PROCESS_FLAG_GROUP_LEADER;
|
|
|
|
groupProcessCB->processStatus &= ~OS_PROCESS_FLAG_GROUP_LEADER;
|
|
|
|
*group = processCB->group;
|
|
|
|
*group = processCB->group;
|
|
|
|
if (OsProcessIsUnused(groupProcessCB) && !(groupProcessCB->processStatus & OS_PROCESS_FLAG_EXIT)) {
|
|
|
|
if (OsProcessIsUnused(groupProcessCB) && !(groupProcessCB->processStatus & OS_PROCESS_FLAG_EXIT)) {
|
|
|
|
LOS_ListDelete(&groupProcessCB->pendList);
|
|
|
|
LOS_ListDelete(&groupProcessCB->pendList);//进程从全局进程链表上摘除
|
|
|
|
OsInsertPCBToFreeList(groupProcessCB);
|
|
|
|
OsInsertPCBToFreeList(groupProcessCB);//释放进程的资源,回到freelist再利用
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
processCB->group = NULL;
|
|
|
|
processCB->group = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*通过指定组ID找到进程组 */
|
|
|
|
STATIC ProcessGroup *OsFindProcessGroup(UINT32 gid)
|
|
|
|
STATIC ProcessGroup *OsFindProcessGroup(UINT32 gid)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
ProcessGroup *group = NULL;
|
|
|
|
ProcessGroup *group = NULL;
|
|
|
@ -132,7 +137,7 @@ STATIC ProcessGroup *OsFindProcessGroup(UINT32 gid)
|
|
|
|
PRINT_INFO("%s is find group : %u failed!\n", __FUNCTION__, gid);
|
|
|
|
PRINT_INFO("%s is find group : %u failed!\n", __FUNCTION__, gid);
|
|
|
|
return NULL;
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*给指定进程组发送信号 */
|
|
|
|
STATIC INT32 OsSendSignalToSpecifyProcessGroup(ProcessGroup *group, siginfo_t *info, INT32 permission)
|
|
|
|
STATIC INT32 OsSendSignalToSpecifyProcessGroup(ProcessGroup *group, siginfo_t *info, INT32 permission)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
INT32 ret, success, err;
|
|
|
|
INT32 ret, success, err;
|
|
|
@ -152,7 +157,7 @@ STATIC INT32 OsSendSignalToSpecifyProcessGroup(ProcessGroup *group, siginfo_t *i
|
|
|
|
/* At least one success. */
|
|
|
|
/* At least one success. */
|
|
|
|
return success ? LOS_OK : ret;
|
|
|
|
return success ? LOS_OK : ret;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//创建进程组//
|
|
|
|
LITE_OS_SEC_TEXT INT32 OsSendSignalToAllProcess(siginfo_t *info, INT32 permission)
|
|
|
|
LITE_OS_SEC_TEXT INT32 OsSendSignalToAllProcess(siginfo_t *info, INT32 permission)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
INT32 ret, success, err;
|
|
|
|
INT32 ret, success, err;
|
|
|
@ -232,7 +237,7 @@ STATIC LosProcessCB *OsFindExitChildProcess(const LosProcessCB *processCB, INT32
|
|
|
|
PRINT_INFO("%s is find the exit child : %d failed in parent : %u\n", __FUNCTION__, childPid, processCB->processID);
|
|
|
|
PRINT_INFO("%s is find the exit child : %d failed in parent : %u\n", __FUNCTION__, childPid, processCB->processID);
|
|
|
|
return NULL;
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* 唤醒等待wakePID结束的任务 */
|
|
|
|
VOID OsWaitWakeTask(LosTaskCB *taskCB, UINT32 wakePID)
|
|
|
|
VOID OsWaitWakeTask(LosTaskCB *taskCB, UINT32 wakePID)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
taskCB->waitID = wakePID;
|
|
|
|
taskCB->waitID = wakePID;
|
|
|
@ -241,7 +246,7 @@ VOID OsWaitWakeTask(LosTaskCB *taskCB, UINT32 wakePID)
|
|
|
|
LOS_MpSchedule(OS_MP_CPU_ALL);
|
|
|
|
LOS_MpSchedule(OS_MP_CPU_ALL);
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* 唤醒等待参数进程结束的任务 */
|
|
|
|
STATIC BOOL OsWaitWakeSpecifiedProcess(LOS_DL_LIST *head, const LosProcessCB *processCB, LOS_DL_LIST **anyList)
|
|
|
|
STATIC BOOL OsWaitWakeSpecifiedProcess(LOS_DL_LIST *head, const LosProcessCB *processCB, LOS_DL_LIST **anyList)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
LOS_DL_LIST *list = head;
|
|
|
|
LOS_DL_LIST *list = head;
|
|
|
@ -249,7 +254,7 @@ STATIC BOOL OsWaitWakeSpecifiedProcess(LOS_DL_LIST *head, const LosProcessCB *pr
|
|
|
|
UINT32 pid = 0;
|
|
|
|
UINT32 pid = 0;
|
|
|
|
BOOL find = FALSE;
|
|
|
|
BOOL find = FALSE;
|
|
|
|
|
|
|
|
|
|
|
|
while (list->pstNext != head) {
|
|
|
|
while (list->pstNext != head) {//遍历等待链表 processCB->waitList
|
|
|
|
taskCB = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(list));
|
|
|
|
taskCB = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(list));
|
|
|
|
if ((taskCB->waitFlag == OS_PROCESS_WAIT_PRO) && (taskCB->waitID == processCB->processID)) {
|
|
|
|
if ((taskCB->waitFlag == OS_PROCESS_WAIT_PRO) && (taskCB->waitID == processCB->processID)) {
|
|
|
|
if (pid == 0) {
|
|
|
|
if (pid == 0) {
|
|
|
@ -259,7 +264,7 @@ STATIC BOOL OsWaitWakeSpecifiedProcess(LOS_DL_LIST *head, const LosProcessCB *pr
|
|
|
|
pid = OS_INVALID_VALUE;
|
|
|
|
pid = OS_INVALID_VALUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
OsWaitWakeTask(taskCB, pid);
|
|
|
|
OsWaitWakeTask(taskCB, pid);//唤醒这个任务,此时会切到 LOS_Wait runTask->waitFlag = 0;处运行
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -272,7 +277,7 @@ STATIC BOOL OsWaitWakeSpecifiedProcess(LOS_DL_LIST *head, const LosProcessCB *pr
|
|
|
|
|
|
|
|
|
|
|
|
return find;
|
|
|
|
return find;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* 检查父进程的等待任务并唤醒父进程去处理等待任务 */
|
|
|
|
STATIC VOID OsWaitCheckAndWakeParentProcess(LosProcessCB *parentCB, const LosProcessCB *processCB)
|
|
|
|
STATIC VOID OsWaitCheckAndWakeParentProcess(LosProcessCB *parentCB, const LosProcessCB *processCB)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
LOS_DL_LIST *head = &parentCB->waitList;
|
|
|
|
LOS_DL_LIST *head = &parentCB->waitList;
|
|
|
@ -281,29 +286,29 @@ STATIC VOID OsWaitCheckAndWakeParentProcess(LosProcessCB *parentCB, const LosPro
|
|
|
|
BOOL findSpecified = FALSE;
|
|
|
|
BOOL findSpecified = FALSE;
|
|
|
|
|
|
|
|
|
|
|
|
if (LOS_ListEmpty(&parentCB->waitList)) {
|
|
|
|
if (LOS_ListEmpty(&parentCB->waitList)) {
|
|
|
|
return;
|
|
|
|
return;//检查是否有正在等待子进程退出的任务,若没有则退出
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
findSpecified = OsWaitWakeSpecifiedProcess(head, processCB, &list);
|
|
|
|
findSpecified = OsWaitWakeSpecifiedProcess(head, processCB, &list);//找到指定的任务
|
|
|
|
if (findSpecified == TRUE) {
|
|
|
|
if (findSpecified == TRUE) {
|
|
|
|
/* No thread is waiting for any child process to finish */
|
|
|
|
/* No thread is waiting for any child process to finish */
|
|
|
|
if (LOS_ListEmpty(&parentCB->waitList)) {
|
|
|
|
if (LOS_ListEmpty(&parentCB->waitList)) {//没有线程正在等待任何子进程结束
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
} else if (!LOS_ListEmpty(&parentCB->childrenList)) {
|
|
|
|
} else if (!LOS_ListEmpty(&parentCB->childrenList)) {
|
|
|
|
/* Other child processes exist, and other threads that are waiting
|
|
|
|
/* Other child processes exist, and other threads that are waiting
|
|
|
|
* for the child to finish continue to wait
|
|
|
|
* for the child to finish continue to wait
|
|
|
|
*/
|
|
|
|
*///存在其他子进程,正在等待它们的子进程结束而将继续等待
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Waiting threads are waiting for a specified child process to finish */
|
|
|
|
/* Waiting threads are waiting for a specified child process to finish */
|
|
|
|
if (list == NULL) {
|
|
|
|
if (list == NULL) {//等待线程正在等待指定的子进程结束
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* No child processes exist and all waiting threads are awakened */
|
|
|
|
/* No child processes exist and all waiting threads are awakened */
|
|
|
|
if (findSpecified == TRUE) {
|
|
|
|
if (findSpecified == TRUE) {//所有等待的任务都唤醒
|
|
|
|
while (list->pstNext != head) {
|
|
|
|
while (list->pstNext != head) {
|
|
|
|
taskCB = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(list));
|
|
|
|
taskCB = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(list));
|
|
|
|
OsWaitWakeTask(taskCB, OS_INVALID_VALUE);
|
|
|
|
OsWaitWakeTask(taskCB, OS_INVALID_VALUE);
|
|
|
@ -311,7 +316,7 @@ STATIC VOID OsWaitCheckAndWakeParentProcess(LosProcessCB *parentCB, const LosPro
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
while (list->pstNext != head) {
|
|
|
|
while (list->pstNext != head) {//处理 OS_PROCESS_WAIT_GID 标签
|
|
|
|
taskCB = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(list));
|
|
|
|
taskCB = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(list));
|
|
|
|
if (taskCB->waitFlag == OS_PROCESS_WAIT_GID) {
|
|
|
|
if (taskCB->waitFlag == OS_PROCESS_WAIT_GID) {
|
|
|
|
if (taskCB->waitID != processCB->group->groupID) {
|
|
|
|
if (taskCB->waitID != processCB->group->groupID) {
|
|
|
@ -334,7 +339,7 @@ STATIC VOID OsWaitCheckAndWakeParentProcess(LosProcessCB *parentCB, const LosPro
|
|
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* 回收指定进程的资源 */
|
|
|
|
LITE_OS_SEC_TEXT VOID OsProcessResourcesToFree(LosProcessCB *processCB)
|
|
|
|
LITE_OS_SEC_TEXT VOID OsProcessResourcesToFree(LosProcessCB *processCB)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (!(processCB->processStatus & (OS_PROCESS_STATUS_INIT | OS_PROCESS_STATUS_RUNNING))) {
|
|
|
|
if (!(processCB->processStatus & (OS_PROCESS_STATUS_INIT | OS_PROCESS_STATUS_RUNNING))) {
|
|
|
@ -351,8 +356,8 @@ LITE_OS_SEC_TEXT VOID OsProcessResourcesToFree(LosProcessCB *processCB)
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef LOSCFG_SECURITY_CAPABILITY
|
|
|
|
#ifdef LOSCFG_SECURITY_CAPABILITY
|
|
|
|
if (processCB->user != NULL) {
|
|
|
|
if (processCB->user != NULL) {
|
|
|
|
(VOID)LOS_MemFree(m_aucSysMem1, processCB->user);
|
|
|
|
(VOID)LOS_MemFree(m_aucSysMem1, processCB->user);//删除用户
|
|
|
|
processCB->user = NULL;
|
|
|
|
processCB->user = NULL;//重置指针为空
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
@ -376,23 +381,23 @@ LITE_OS_SEC_TEXT VOID OsProcessResourcesToFree(LosProcessCB *processCB)
|
|
|
|
|
|
|
|
|
|
|
|
LITE_OS_SEC_TEXT STATIC VOID OsRecycleZombiesProcess(LosProcessCB *childCB, ProcessGroup **group)
|
|
|
|
LITE_OS_SEC_TEXT STATIC VOID OsRecycleZombiesProcess(LosProcessCB *childCB, ProcessGroup **group)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
OsExitProcessGroup(childCB, group);
|
|
|
|
OsExitProcessGroup(childCB, group);//退出进程组
|
|
|
|
LOS_ListDelete(&childCB->siblingList);
|
|
|
|
LOS_ListDelete(&childCB->siblingList);//从父亲大人的子孙链表上摘除
|
|
|
|
if (childCB->processStatus & OS_PROCESS_STATUS_ZOMBIES) {
|
|
|
|
if (childCB->processStatus & OS_PROCESS_STATUS_ZOMBIES) {
|
|
|
|
childCB->processStatus &= ~OS_PROCESS_STATUS_ZOMBIES;
|
|
|
|
childCB->processStatus &= ~OS_PROCESS_STATUS_ZOMBIES;//去掉僵死标签
|
|
|
|
childCB->processStatus |= OS_PROCESS_FLAG_UNUSED;
|
|
|
|
childCB->processStatus |= OS_PROCESS_FLAG_UNUSED;//贴上没使用标签,进程由进程池分配,进程退出后重新回到空闲进程池
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
LOS_ListDelete(&childCB->pendList);
|
|
|
|
LOS_ListDelete(&childCB->pendList);//将自己从阻塞链表上摘除
|
|
|
|
if (childCB->processStatus & OS_PROCESS_FLAG_EXIT) {
|
|
|
|
if (childCB->processStatus & OS_PROCESS_FLAG_EXIT) {
|
|
|
|
LOS_ListHeadInsert(&g_processRecycleList, &childCB->pendList);
|
|
|
|
LOS_ListHeadInsert(&g_processRecycleList, &childCB->pendList);//从头部插入,注意g_processRecyleList挂的是pendList节点,所以要通过OS_PCB_FROM_PENDLIST找.
|
|
|
|
} else if (childCB->processStatus & OS_PROCESS_FLAG_GROUP_LEADER) {
|
|
|
|
} else if (childCB->processStatus & OS_PROCESS_FLAG_GROUP_LEADER) {
|
|
|
|
LOS_ListTailInsert(&g_processRecycleList, &childCB->pendList);
|
|
|
|
LOS_ListTailInsert(&g_processRecycleList, &childCB->pendList);//从尾部插入
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
OsInsertPCBToFreeList(childCB);
|
|
|
|
OsInsertPCBToFreeList(childCB);//直接插到freeList中去,可用于重新分配了。
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*! 当一个进程自然退出的时候,它的孩子进程由两位老祖宗收养 */
|
|
|
|
STATIC VOID OsDealAliveChildProcess(LosProcessCB *processCB)
|
|
|
|
STATIC VOID OsDealAliveChildProcess(LosProcessCB *processCB)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
UINT32 parentID;
|
|
|
|
UINT32 parentID;
|
|
|
@ -401,20 +406,20 @@ STATIC VOID OsDealAliveChildProcess(LosProcessCB *processCB)
|
|
|
|
LOS_DL_LIST *nextList = NULL;
|
|
|
|
LOS_DL_LIST *nextList = NULL;
|
|
|
|
LOS_DL_LIST *childHead = NULL;
|
|
|
|
LOS_DL_LIST *childHead = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
if (!LOS_ListEmpty(&processCB->childrenList)) {
|
|
|
|
if (!LOS_ListEmpty(&processCB->childrenList)) {//如果存在孩子进程
|
|
|
|
childHead = processCB->childrenList.pstNext;
|
|
|
|
childHead = processCB->childrenList.pstNext;//获取孩子链表
|
|
|
|
LOS_ListDelete(&(processCB->childrenList));
|
|
|
|
LOS_ListDelete(&(processCB->childrenList));//清空自己的孩子链表
|
|
|
|
if (OsProcessIsUserMode(processCB)) {
|
|
|
|
if (OsProcessIsUserMode(processCB)) {//是用户态进程
|
|
|
|
parentID = g_userInitProcess;
|
|
|
|
parentID = g_userInitProcess;
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
parentID = g_kernelInitProcess;
|
|
|
|
parentID = g_kernelInitProcess;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for (nextList = childHead; ;) {
|
|
|
|
for (nextList = childHead; ;) {//遍历孩子链表
|
|
|
|
childCB = OS_PCB_FROM_SIBLIST(nextList);
|
|
|
|
childCB = OS_PCB_FROM_SIBLIST(nextList);//找到孩子的真身//找到孩子的真身
|
|
|
|
childCB->parentProcessID = parentID;
|
|
|
|
childCB->parentProcessID = parentID;
|
|
|
|
nextList = nextList->pstNext;
|
|
|
|
nextList = nextList->pstNext;//找下一个孩子进程
|
|
|
|
if (nextList == childHead) {
|
|
|
|
if (nextList == childHead) {//所以孩子都完成操作
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -425,22 +430,23 @@ STATIC VOID OsDealAliveChildProcess(LosProcessCB *processCB)
|
|
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*! 回收指定进程的已经退出的孩子进程所占资源 */
|
|
|
|
STATIC VOID OsChildProcessResourcesFree(const LosProcessCB *processCB)
|
|
|
|
STATIC VOID OsChildProcessResourcesFree(const LosProcessCB *processCB)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
LosProcessCB *childCB = NULL;
|
|
|
|
LosProcessCB *childCB = NULL;
|
|
|
|
ProcessGroup *group = NULL;
|
|
|
|
ProcessGroup *group = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
while (!LOS_ListEmpty(&((LosProcessCB *)processCB)->exitChildList)) {
|
|
|
|
while (!LOS_ListEmpty(&((LosProcessCB *)processCB)->exitChildList)) {//遍历直到没有了退出的孩子进程
|
|
|
|
childCB = LOS_DL_LIST_ENTRY(processCB->exitChildList.pstNext, LosProcessCB, siblingList);
|
|
|
|
childCB = LOS_DL_LIST_ENTRY(processCB->exitChildList.pstNext, LosProcessCB, siblingList);//获取孩子进程
|
|
|
|
OsRecycleZombiesProcess(childCB, &group);
|
|
|
|
OsRecycleZombiesProcess(childCB, &group);//其中会将childCB从exitChildList链表上摘出去
|
|
|
|
(VOID)LOS_MemFree(m_aucSysMem1, group);
|
|
|
|
(VOID)LOS_MemFree(m_aucSysMem1, group);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
STATIC VOID OsProcessNaturalExit(LosTaskCB *runTask, UINT32 status)
|
|
|
|
STATIC VOID OsProcessNaturalExit(LosTaskCB *runTask, UINT32 status)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
LosProcessCB *processCB = OS_PCB_FROM_PID(runTask->processID);
|
|
|
|
LosProcessCB *processCB = OS_PCB_FROM_PID(runTask->processID);//释放孩子进程的资源
|
|
|
|
|
|
|
|
|
|
|
|
LosProcessCB *parentCB = NULL;
|
|
|
|
LosProcessCB *parentCB = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
LOS_ASSERT(processCB->processStatus & OS_PROCESS_STATUS_RUNNING);
|
|
|
|
LOS_ASSERT(processCB->processStatus & OS_PROCESS_STATUS_RUNNING);
|
|
|
@ -475,26 +481,26 @@ STATIC VOID OsProcessNaturalExit(LosTaskCB *runTask, UINT32 status)
|
|
|
|
LOS_Panic("pid : %u is the root process exit!\n", processCB->processID);
|
|
|
|
LOS_Panic("pid : %u is the root process exit!\n", processCB->processID);
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*! 进程模块初始化,被编译放在代码段 .init 中*/
|
|
|
|
STATIC UINT32 OsProcessInit(VOID)
|
|
|
|
STATIC UINT32 OsProcessInit(VOID)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
UINT32 index;
|
|
|
|
UINT32 index;
|
|
|
|
UINT32 size;
|
|
|
|
UINT32 size;
|
|
|
|
|
|
|
|
|
|
|
|
g_processMaxNum = LOSCFG_BASE_CORE_PROCESS_LIMIT;
|
|
|
|
g_processMaxNum = LOSCFG_BASE_CORE_PROCESS_LIMIT;//默认支持64个进程
|
|
|
|
size = g_processMaxNum * sizeof(LosProcessCB);
|
|
|
|
size = g_processMaxNum * sizeof(LosProcessCB);
|
|
|
|
|
|
|
|
|
|
|
|
g_processCBArray = (LosProcessCB *)LOS_MemAlloc(m_aucSysMem1, size);
|
|
|
|
g_processCBArray = (LosProcessCB *)LOS_MemAlloc(m_aucSysMem1, size);// 进程池,占用内核堆,内存池分配
|
|
|
|
if (g_processCBArray == NULL) {
|
|
|
|
if (g_processCBArray == NULL) {
|
|
|
|
return LOS_NOK;
|
|
|
|
return LOS_NOK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
(VOID)memset_s(g_processCBArray, size, 0, size);
|
|
|
|
(VOID)memset_s(g_processCBArray, size, 0, size);//安全方式重置清0
|
|
|
|
|
|
|
|
|
|
|
|
LOS_ListInit(&g_freeProcess);
|
|
|
|
LOS_ListInit(&g_freeProcess);//进程空闲链表初始化,创建一个进程时从g_freeProcess中申请一个进程描述符使用
|
|
|
|
LOS_ListInit(&g_processRecycleList);
|
|
|
|
LOS_ListInit(&g_processRecycleList);//进程回收链表初始化,回收完成后进入g_freeProcess等待再次被申请使用
|
|
|
|
|
|
|
|
|
|
|
|
for (index = 0; index < g_processMaxNum; index++) {
|
|
|
|
for (index = 0; index < g_processMaxNum; index++) {//进程池循环创建
|
|
|
|
g_processCBArray[index].processID = index;
|
|
|
|
g_processCBArray[index].processID = index;//进程ID[0-g_processMaxNum-1]赋值
|
|
|
|
g_processCBArray[index].processStatus = OS_PROCESS_FLAG_UNUSED;
|
|
|
|
g_processCBArray[index].processStatus = OS_PROCESS_FLAG_UNUSED;
|
|
|
|
LOS_ListTailInsert(&g_freeProcess, &g_processCBArray[index].pendList);
|
|
|
|
LOS_ListTailInsert(&g_freeProcess, &g_processCBArray[index].pendList);
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -510,16 +516,16 @@ STATIC UINT32 OsProcessInit(VOID)
|
|
|
|
|
|
|
|
|
|
|
|
return LOS_OK;
|
|
|
|
return LOS_OK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*! 进程回收再利用过程*/
|
|
|
|
LITE_OS_SEC_TEXT VOID OsProcessCBRecycleToFree(VOID)
|
|
|
|
LITE_OS_SEC_TEXT VOID OsProcessCBRecycleToFree(VOID)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
UINT32 intSave;
|
|
|
|
UINT32 intSave;
|
|
|
|
LosProcessCB *processCB = NULL;
|
|
|
|
LosProcessCB *processCB = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
SCHEDULER_LOCK(intSave);
|
|
|
|
SCHEDULER_LOCK(intSave);
|
|
|
|
while (!LOS_ListEmpty(&g_processRecycleList)) {
|
|
|
|
while (!LOS_ListEmpty(&g_processRecycleList)) {//循环任务回收链表,直到为空
|
|
|
|
processCB = OS_PCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&g_processRecycleList));
|
|
|
|
processCB = OS_PCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&g_processRecycleList));
|
|
|
|
if (!(processCB->processStatus & OS_PROCESS_FLAG_EXIT)) {
|
|
|
|
if (!(processCB->processStatus & OS_PROCESS_FLAG_EXIT)) {//进程没有退出标签
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
SCHEDULER_UNLOCK(intSave);
|
|
|
|
SCHEDULER_UNLOCK(intSave);
|
|
|
@ -530,32 +536,32 @@ LITE_OS_SEC_TEXT VOID OsProcessCBRecycleToFree(VOID)
|
|
|
|
processCB->processStatus &= ~OS_PROCESS_FLAG_EXIT;
|
|
|
|
processCB->processStatus &= ~OS_PROCESS_FLAG_EXIT;
|
|
|
|
#ifdef LOSCFG_KERNEL_VM
|
|
|
|
#ifdef LOSCFG_KERNEL_VM
|
|
|
|
LosVmSpace *space = NULL;
|
|
|
|
LosVmSpace *space = NULL;
|
|
|
|
if (OsProcessIsUserMode(processCB)) {
|
|
|
|
if (OsProcessIsUserMode(processCB)) {//进程是否是用户态进程
|
|
|
|
space = processCB->vmSpace;
|
|
|
|
space = processCB->vmSpace;//只有用户态的进程才需要释放虚拟内存空间
|
|
|
|
}
|
|
|
|
}
|
|
|
|
processCB->vmSpace = NULL;
|
|
|
|
processCB->vmSpace = NULL;
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
/* OS_PROCESS_FLAG_GROUP_LEADER: The lead process group cannot be recycled without destroying the PCB.
|
|
|
|
/* OS_PROCESS_FLAG_GROUP_LEADER: The lead process group cannot be recycled without destroying the PCB.
|
|
|
|
* !OS_PROCESS_FLAG_UNUSED: Parent process does not reclaim child process resources.
|
|
|
|
* !OS_PROCESS_FLAG_UNUSED: Parent process does not reclaim child process resources.
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
LOS_ListDelete(&processCB->pendList);
|
|
|
|
LOS_ListDelete(&processCB->pendList);//将进程从进程链表上摘除
|
|
|
|
if ((processCB->processStatus & OS_PROCESS_FLAG_GROUP_LEADER) ||
|
|
|
|
if ((processCB->processStatus & OS_PROCESS_FLAG_GROUP_LEADER) ||
|
|
|
|
(processCB->processStatus & OS_PROCESS_STATUS_ZOMBIES)) {
|
|
|
|
(processCB->processStatus & OS_PROCESS_STATUS_ZOMBIES)) {
|
|
|
|
LOS_ListTailInsert(&g_processRecycleList, &processCB->pendList);
|
|
|
|
LOS_ListTailInsert(&g_processRecycleList, &processCB->pendList);//将进程挂到进程回收链表上,
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
/* Clear the bottom 4 bits of process status */
|
|
|
|
/* Clear the bottom 4 bits of process status */
|
|
|
|
OsInsertPCBToFreeList(processCB);
|
|
|
|
OsInsertPCBToFreeList(processCB);//进程回到可分配池中,再分配利用
|
|
|
|
}
|
|
|
|
}
|
|
|
|
SCHEDULER_UNLOCK(intSave);
|
|
|
|
SCHEDULER_UNLOCK(intSave);
|
|
|
|
#ifdef LOSCFG_KERNEL_VM
|
|
|
|
#ifdef LOSCFG_KERNEL_VM
|
|
|
|
(VOID)LOS_VmSpaceFree(space);
|
|
|
|
(VOID)LOS_VmSpaceFree(space);//释放用户态进程的虚拟内存空间,因为内核只有一个虚拟空间,因此不需要释放虚拟空间.
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
SCHEDULER_LOCK(intSave);
|
|
|
|
SCHEDULER_LOCK(intSave);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SCHEDULER_UNLOCK(intSave);
|
|
|
|
SCHEDULER_UNLOCK(intSave);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*! 删除PCB块 其实是 PCB块回归进程池,先进入回收链表*/
|
|
|
|
STATIC VOID OsDeInitPCB(LosProcessCB *processCB)
|
|
|
|
STATIC VOID OsDeInitPCB(LosProcessCB *processCB)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
UINT32 intSave;
|
|
|
|
UINT32 intSave;
|
|
|
@ -565,11 +571,11 @@ STATIC VOID OsDeInitPCB(LosProcessCB *processCB)
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
OsProcessResourcesToFree(processCB);
|
|
|
|
OsProcessResourcesToFree(processCB);//释放进程所占用的资源
|
|
|
|
|
|
|
|
|
|
|
|
SCHEDULER_LOCK(intSave);
|
|
|
|
SCHEDULER_LOCK(intSave);
|
|
|
|
if (processCB->parentProcessID != OS_INVALID_VALUE) {
|
|
|
|
if (processCB->parentProcessID != OS_INVALID_VALUE) {
|
|
|
|
LOS_ListDelete(&processCB->siblingList);
|
|
|
|
LOS_ListDelete(&processCB->siblingList);//将进程从兄弟链表中摘除
|
|
|
|
processCB->parentProcessID = OS_INVALID_VALUE;
|
|
|
|
processCB->parentProcessID = OS_INVALID_VALUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -577,8 +583,8 @@ STATIC VOID OsDeInitPCB(LosProcessCB *processCB)
|
|
|
|
OsExitProcessGroup(processCB, &group);
|
|
|
|
OsExitProcessGroup(processCB, &group);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
processCB->processStatus &= ~OS_PROCESS_STATUS_INIT;
|
|
|
|
processCB->processStatus &= ~OS_PROCESS_STATUS_INIT;//设置进程状态为非初始化
|
|
|
|
processCB->processStatus |= OS_PROCESS_FLAG_EXIT;
|
|
|
|
processCB->processStatus |= OS_PROCESS_FLAG_EXIT;//设置进程状态为退出
|
|
|
|
LOS_ListHeadInsert(&g_processRecycleList, &processCB->pendList);
|
|
|
|
LOS_ListHeadInsert(&g_processRecycleList, &processCB->pendList);
|
|
|
|
SCHEDULER_UNLOCK(intSave);
|
|
|
|
SCHEDULER_UNLOCK(intSave);
|
|
|
|
|
|
|
|
|
|
|
@ -586,7 +592,7 @@ STATIC VOID OsDeInitPCB(LosProcessCB *processCB)
|
|
|
|
OsWriteResourceEvent(OS_RESOURCE_EVENT_FREE);
|
|
|
|
OsWriteResourceEvent(OS_RESOURCE_EVENT_FREE);
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*! 设置进程的名字*/
|
|
|
|
UINT32 OsSetProcessName(LosProcessCB *processCB, const CHAR *name)
|
|
|
|
UINT32 OsSetProcessName(LosProcessCB *processCB, const CHAR *name)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
errno_t errRet;
|
|
|
|
errno_t errRet;
|
|
|
@ -618,29 +624,28 @@ UINT32 OsSetProcessName(LosProcessCB *processCB, const CHAR *name)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return LOS_OK;
|
|
|
|
return LOS_OK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*! 初始化PCB(进程控制块)*/
|
|
|
|
STATIC UINT32 OsInitPCB(LosProcessCB *processCB, UINT32 mode, UINT16 priority, const CHAR *name)
|
|
|
|
STATIC UINT32 OsInitPCB(LosProcessCB *processCB, UINT32 mode, UINT16 priority, const CHAR *name)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
processCB->processMode = mode;
|
|
|
|
processCB->processMode = mode; //用户态进程还是内核态进程
|
|
|
|
processCB->processStatus = OS_PROCESS_STATUS_INIT;
|
|
|
|
processCB->processStatus = OS_PROCESS_STATUS_INIT; //进程初始状态
|
|
|
|
processCB->parentProcessID = OS_INVALID_VALUE;
|
|
|
|
processCB->parentProcess = NULL;
|
|
|
|
processCB->threadGroupID = OS_INVALID_VALUE;
|
|
|
|
processCB->threadGroup = NULL;
|
|
|
|
processCB->priority = priority;
|
|
|
|
processCB->umask = OS_PROCESS_DEFAULT_UMASK; //掩码
|
|
|
|
processCB->umask = OS_PROCESS_DEFAULT_UMASK;
|
|
|
|
|
|
|
|
processCB->timerID = (timer_t)(UINTPTR)MAX_INVALID_TIMER_VID;
|
|
|
|
processCB->timerID = (timer_t)(UINTPTR)MAX_INVALID_TIMER_VID;
|
|
|
|
|
|
|
|
|
|
|
|
LOS_ListInit(&processCB->threadSiblingList);
|
|
|
|
LOS_ListInit(&processCB->threadSiblingList);//初始化孩子任务/线程链表,上面挂的都是由此fork的孩子线程 见于 OsTaskCBInit LOS_ListTailInsert(&(processCB->threadSiblingList), &(taskCB->threadList));
|
|
|
|
LOS_ListInit(&processCB->childrenList);
|
|
|
|
LOS_ListInit(&processCB->childrenList); //初始化孩子进程链表,上面挂的都是由此fork的孩子进程 见于 OsCopyParent LOS_ListTailInsert(&parentProcessCB->childrenList, &childProcessCB->siblingList);
|
|
|
|
LOS_ListInit(&processCB->exitChildList);
|
|
|
|
LOS_ListInit(&processCB->exitChildList); //初始化记录退出孩子进程链表,上面挂的是哪些exit 见于 OsProcessNaturalExit LOS_ListTailInsert(&parentCB->exitChildList, &processCB->siblingList);
|
|
|
|
LOS_ListInit(&(processCB->waitList));
|
|
|
|
LOS_ListInit(&(processCB->waitList)); //初始化等待任务链表 上面挂的是处于等待的 见于 OsWaitInsertWaitLIstInOrder LOS_ListHeadInsert(&processCB->waitList, &runTask->pendList);
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef LOSCFG_KERNEL_VM
|
|
|
|
#ifdef LOSCFG_KERNEL_VM
|
|
|
|
if (OsProcessIsUserMode(processCB)) {
|
|
|
|
if (OsProcessIsUserMode(processCB)) {//如果是用户态进程
|
|
|
|
processCB->vmSpace = OsCreateUserVmSpace();
|
|
|
|
processCB->vmSpace = OsCreateUserVmSpace();//创建用户空间
|
|
|
|
if (processCB->vmSpace == NULL) {
|
|
|
|
if (processCB->vmSpace == NULL) {
|
|
|
|
processCB->processStatus = OS_PROCESS_FLAG_UNUSED;
|
|
|
|
processCB->processStatus = OS_PROCESS_FLAG_UNUSED;
|
|
|
|
return LOS_ENOMEM;
|
|
|
|
return LOS_ENOMEM;
|
|
|
|
}
|
|
|
|
}//在鸿蒙内核态进程只有kprocess 和 kidle 两个
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
processCB->vmSpace = LOS_GetKVmSpace();
|
|
|
|
processCB->vmSpace = LOS_GetKVmSpace();
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -653,7 +658,7 @@ STATIC UINT32 OsInitPCB(LosProcessCB *processCB, UINT32 mode, UINT16 priority, c
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
#ifdef LOSCFG_SECURITY_CAPABILITY
|
|
|
|
#ifdef LOSCFG_SECURITY_CAPABILITY
|
|
|
|
OsInitCapability(processCB);
|
|
|
|
OsInitCapability(processCB);//初始化进程安全相关功能
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
if (OsSetProcessName(processCB, name) != LOS_OK) {
|
|
|
|
if (OsSetProcessName(processCB, name) != LOS_OK) {
|
|
|
@ -662,10 +667,10 @@ STATIC UINT32 OsInitPCB(LosProcessCB *processCB, UINT32 mode, UINT16 priority, c
|
|
|
|
|
|
|
|
|
|
|
|
return LOS_OK;
|
|
|
|
return LOS_OK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//创建用户
|
|
|
|
#ifdef LOSCFG_SECURITY_CAPABILITY
|
|
|
|
#ifdef LOSCFG_SECURITY_CAPABILITY
|
|
|
|
STATIC User *OsCreateUser(UINT32 userID, UINT32 gid, UINT32 size)
|
|
|
|
STATIC User *OsCreateUser(UINT32 userID, UINT32 gid, UINT32 size)//参数size 表示组数量
|
|
|
|
{
|
|
|
|
{ //(size - 1) * sizeof(UINT32) 用于 user->groups[..],这种设计节约了内存,不造成不需要的浪费
|
|
|
|
User *user = LOS_MemAlloc(m_aucSysMem1, sizeof(User) + (size - 1) * sizeof(UINT32));
|
|
|
|
User *user = LOS_MemAlloc(m_aucSysMem1, sizeof(User) + (size - 1) * sizeof(UINT32));
|
|
|
|
if (user == NULL) {
|
|
|
|
if (user == NULL) {
|
|
|
|
return NULL;
|
|
|
|
return NULL;
|
|
|
@ -675,11 +680,11 @@ STATIC User *OsCreateUser(UINT32 userID, UINT32 gid, UINT32 size)
|
|
|
|
user->effUserID = userID;
|
|
|
|
user->effUserID = userID;
|
|
|
|
user->gid = gid;
|
|
|
|
user->gid = gid;
|
|
|
|
user->effGid = gid;
|
|
|
|
user->effGid = gid;
|
|
|
|
user->groupNumber = size;
|
|
|
|
user->groupNumber = size;//用户组数量
|
|
|
|
user->groups[0] = gid;
|
|
|
|
user->groups[0] = gid; //用户组列表,一个用户可以属于多个用户组
|
|
|
|
return user;
|
|
|
|
return user;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*! 检查参数群组ID是否在当前用户所属群组中*/
|
|
|
|
LITE_OS_SEC_TEXT BOOL LOS_CheckInGroups(UINT32 gid)
|
|
|
|
LITE_OS_SEC_TEXT BOOL LOS_CheckInGroups(UINT32 gid)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
UINT32 intSave;
|
|
|
|
UINT32 intSave;
|
|
|
@ -687,8 +692,8 @@ LITE_OS_SEC_TEXT BOOL LOS_CheckInGroups(UINT32 gid)
|
|
|
|
User *user = NULL;
|
|
|
|
User *user = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
SCHEDULER_LOCK(intSave);
|
|
|
|
SCHEDULER_LOCK(intSave);
|
|
|
|
user = OsCurrUserGet();
|
|
|
|
user = OsCurrUserGet();//当前进程所属用户
|
|
|
|
for (count = 0; count < user->groupNumber; count++) {
|
|
|
|
for (count = 0; count < user->groupNumber; count++) {//循环对比
|
|
|
|
if (user->groups[count] == gid) {
|
|
|
|
if (user->groups[count] == gid) {
|
|
|
|
SCHEDULER_UNLOCK(intSave);
|
|
|
|
SCHEDULER_UNLOCK(intSave);
|
|
|
|
return TRUE;
|
|
|
|
return TRUE;
|
|
|
@ -699,7 +704,7 @@ LITE_OS_SEC_TEXT BOOL LOS_CheckInGroups(UINT32 gid)
|
|
|
|
return FALSE;
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*! 获取当前进程的用户ID*/
|
|
|
|
LITE_OS_SEC_TEXT INT32 LOS_GetUserID(VOID)
|
|
|
|
LITE_OS_SEC_TEXT INT32 LOS_GetUserID(VOID)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
#ifdef LOSCFG_SECURITY_CAPABILITY
|
|
|
|
#ifdef LOSCFG_SECURITY_CAPABILITY
|
|
|
@ -714,7 +719,7 @@ LITE_OS_SEC_TEXT INT32 LOS_GetUserID(VOID)
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*! 获取当前进程的用户组ID*/
|
|
|
|
LITE_OS_SEC_TEXT INT32 LOS_GetGroupID(VOID)
|
|
|
|
LITE_OS_SEC_TEXT INT32 LOS_GetGroupID(VOID)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
#ifdef LOSCFG_SECURITY_CAPABILITY
|
|
|
|
#ifdef LOSCFG_SECURITY_CAPABILITY
|
|
|
@ -730,7 +735,7 @@ LITE_OS_SEC_TEXT INT32 LOS_GetGroupID(VOID)
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*! 进程创建初始化*/
|
|
|
|
STATIC UINT32 OsProcessCreateInit(LosProcessCB *processCB, UINT32 flags, const CHAR *name, UINT16 priority)
|
|
|
|
STATIC UINT32 OsProcessCreateInit(LosProcessCB *processCB, UINT32 flags, const CHAR *name, UINT16 priority)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
ProcessGroup *group = NULL;
|
|
|
|
ProcessGroup *group = NULL;
|
|
|
@ -777,7 +782,7 @@ EXIT:
|
|
|
|
OsDeInitPCB(processCB);
|
|
|
|
OsDeInitPCB(processCB);
|
|
|
|
return ret;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*! 创建2,0号进程,即内核态进程的老祖宗*/
|
|
|
|
LITE_OS_SEC_TEXT_INIT UINT32 OsSystemProcessCreate(VOID)
|
|
|
|
LITE_OS_SEC_TEXT_INIT UINT32 OsSystemProcessCreate(VOID)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
UINT32 ret = OsProcessInit();
|
|
|
|
UINT32 ret = OsProcessInit();
|
|
|
@ -791,13 +796,13 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsSystemProcessCreate(VOID)
|
|
|
|
return ret;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
kerInitProcess->processStatus &= ~OS_PROCESS_STATUS_INIT;
|
|
|
|
kerInitProcess->processStatus &= ~OS_PROCESS_STATUS_INIT;//去掉初始化标签
|
|
|
|
g_processGroup = kerInitProcess->group;
|
|
|
|
g_processGroup = kerInitProcess->group;
|
|
|
|
LOS_ListInit(&g_processGroup->groupList);
|
|
|
|
LOS_ListInit(&g_processGroup->groupList);
|
|
|
|
OsCurrProcessSet(kerInitProcess);
|
|
|
|
OsCurrProcessSet(kerInitProcess);
|
|
|
|
|
|
|
|
|
|
|
|
LosProcessCB *idleProcess = OS_PCB_FROM_PID(g_kernelIdleProcess);
|
|
|
|
LosProcessCB *idleProcess = OS_PCB_FROM_PID(g_kernelIdleProcess);
|
|
|
|
ret = OsInitPCB(idleProcess, OS_KERNEL_MODE, OS_TASK_PRIORITY_LOWEST, "KIdle");
|
|
|
|
ret = OsInitPCB(idleProcess, OS_KERNEL_MODE, OS_TASK_PRIORITY_LOWEST, "KIdle");//创建内核态0号进程
|
|
|
|
if (ret != LOS_OK) {
|
|
|
|
if (ret != LOS_OK) {
|
|
|
|
return ret;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -820,7 +825,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsSystemProcessCreate(VOID)
|
|
|
|
|
|
|
|
|
|
|
|
return LOS_OK;
|
|
|
|
return LOS_OK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// 进程调度参数检查
|
|
|
|
STATIC INLINE INT32 OsProcessSchedlerParamCheck(INT32 which, INT32 pid, UINT16 prio, UINT16 policy)
|
|
|
|
STATIC INLINE INT32 OsProcessSchedlerParamCheck(INT32 which, INT32 pid, UINT16 prio, UINT16 policy)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (OS_PID_CHECK_INVALID(pid)) {
|
|
|
|
if (OS_PID_CHECK_INVALID(pid)) {
|
|
|
|