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