更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
los_process_pri.h 文件参考

浏览源代码.

结构体

struct  User
 
struct  ProcessGroup
 
struct  ProcessCB
 

类型定义

typedef struct ProcessCB LosProcessCB
 

函数

STATIC INLINE BOOL OsProcessIsUnused (const LosProcessCB *processCB)
 
STATIC INLINE BOOL OsProcessIsInactive (const LosProcessCB *processCB)
 进程不活跃函数定义:身上贴有不使用且不活跃标签的进程 更多...
 
STATIC INLINE BOOL OsProcessIsDead (const LosProcessCB *processCB)
 进程死啦死啦的定义: 身上贴有不使用且状态为僵死的进程 更多...
 
STATIC INLINE BOOL OsProcessIsInit (const LosProcessCB *processCB)
 
STATIC INLINE BOOL OsProcessIsUserMode (const LosProcessCB *processCB)
 
STATIC INLINE VOID OsProcessExitCodeCoreDumpSet (LosProcessCB *processCB)
 置进程退出码第七位为1 更多...
 
STATIC INLINE VOID OsProcessExitCodeSignalSet (LosProcessCB *processCB, UINT32 signal)
 设置进程退出信号(0 ~ 7) 更多...
 
STATIC INLINE VOID OsProcessExitCodeSignalClear (LosProcessCB *processCB)
 清除进程退出信号(0 ~ 7) 更多...
 
STATIC INLINE BOOL OsProcessExitCodeSignalIsSet (LosProcessCB *processCB)
 进程退出码是否被设置过,默认是 0 ,如果 & 0x7FU 还是 0 ,说明没有被设置过. 更多...
 
STATIC INLINE VOID OsProcessExitCodeSet (LosProcessCB *processCB, UINT32 code)
 设置进程退出号(8 ~ 15) 更多...
 
STATIC INLINE BOOL OsProcessIDUserCheckInvalid (UINT32 pid)
 
STATIC INLINE LosProcessCBOsCurrProcessGet (VOID)
 
STATIC INLINE UserOsCurrUserGet (VOID)
 
STATIC INLINE UINT32 OsProcessUserIDGet (const LosTaskCB *taskCB)
 
STATIC INLINE UINT32 OsProcessThreadGroupIDGet (const LosTaskCB *taskCB)
 
STATIC INLINE UINT32 OsProcessThreadNumberGet (const LosTaskCB *taskCB)
 
STATIC INLINE LosVmSpaceOsProcessVmSpaceGet (const LosProcessCB *processCB)
 
STATIC INLINE struct VnodeOsProcessExecVnodeGet (const LosProcessCB *processCB)
 
UINT32 OsSystemProcessCreate (VOID)
 
VOID OsProcessNaturalExit (LosProcessCB *processCB, UINT32 status)
 
VOID OsProcessCBRecycleToFree (VOID)
 
VOID OsProcessResourcesToFree (LosProcessCB *processCB)
 
UINT32 OsUserInitProcess (VOID)
 
INT32 OsClone (UINT32 flags, UINTPTR sp, UINT32 size)
 OsClone 进程克隆 更多...
 
VOID OsExecProcessVmSpaceRestore (LosVmSpace *oldSpace)
 
LosVmSpaceOsExecProcessVmSpaceReplace (LosVmSpace *newSpace, UINTPTR stackBase, INT32 randomDevFD)
 
UINT32 OsExecRecycleAndInit (LosProcessCB *processCB, const CHAR *name, LosVmSpace *oldAspace, UINTPTR oldFiles)
 进程的回收再利用,被LOS_DoExecveFile调用 更多...
 
UINT32 OsExecStart (const TSK_ENTRY_FUNC entry, UINTPTR sp, UINTPTR mapBase, UINT32 mapSize)
 执行用户态任务, entry为入口函数 ,其中 创建好task,task上下文 等待调度真正执行, sp:栈指针 mapBase:栈底 mapSize:栈大小 更多...
 
UINT32 OsSetProcessName (LosProcessCB *processCB, const CHAR *name)
 
INT32 OsSetProcessScheduler (INT32 which, INT32 pid, UINT16 prio, UINT16 policy)
 设置进程调度计划 更多...
 
INT32 OsGetProcessPriority (INT32 which, INT32 pid)
 接口封装 - 获取进程优先级 which:标识进程,进程组,用户 更多...
 
UINT32 OsGetUserInitProcessID (VOID)
 获取用户态进程的根进程,所有用户进程都是g_processCBArray[g_userInitProcess] fork来的 更多...
 
UINT32 OsGetIdleProcessID (VOID)
 获取内核态空闲进程 更多...
 
INT32 OsSetProcessGroupID (UINT32 pid, UINT32 gid)
 
INT32 OsSetCurrProcessGroupID (UINT32 gid)
 
UINT32 OsGetKernelInitProcessID (VOID)
 获取内核态根进程 更多...
 
VOID OsSetSigHandler (UINTPTR addr)
 设置进程的信号处理函数 更多...
 
UINTPTR OsGetSigHandler (VOID)
 获取进程的信号处理函数 更多...
 
VOID OsWaitWakeTask (LosTaskCB *taskCB, UINT32 wakePID)
 
INT32 OsSendSignalToProcessGroup (INT32 pid, siginfo_t *info, INT32 permission)
 
INT32 OsSendSignalToAllProcess (siginfo_t *info, INT32 permission)
 
UINT32 OsProcessAddNewTask (UINT32 pid, LosTaskCB *taskCB, SchedParam *param)
 
VOID OsDeleteTaskFromProcess (LosTaskCB *taskCB)
 
VOID OsProcessThreadGroupDestroy (VOID)
 

变量

LosProcessCBg_processCBArray
 进程池 OsProcessInit 更多...
 
UINT32 g_processMaxNum
 进程最大数量 更多...
 
UINTPTR __user_init_entry
 第一个用户态进程(init)的入口地址 查看 LITE_USER_SEC_ENTRY 更多...
 
UINTPTR __user_init_bss
 查看 LITE_USER_SEC_BSS ,赋值由liteos.ld完成 更多...
 
UINTPTR __user_init_end
 init 进程的用户空间初始化结束地址 更多...
 
UINTPTR __user_init_load_addr
 init 进程的加载地址 ,由链接器赋值 更多...
 

类型定义说明

◆ LosProcessCB

typedef struct ProcessCB LosProcessCB

进程控制块.

函数说明

◆ OsClone()

INT32 OsClone ( UINT32  flags,
UINTPTR  sp,
UINT32  size 
)

OsClone 进程克隆

参数
flags
size进程主任务内核栈大小
sp进程主任务的入口函数
返回
参见

在文件 los_process.c2049 行定义.

2050{
2051 UINT32 cloneFlag = CLONE_PARENT | CLONE_THREAD | CLONE_VFORK | CLONE_VM;
2052
2053 if (flags & (~cloneFlag)) {
2054 PRINT_WARN("Clone dont support some flags!\n");
2055 }
2056
2057 return OsCopyProcess(cloneFlag & flags, NULL, sp, size);
2058}
macro EXC_SP_SET reg1 mrc 获取CPU信息 and mov mul reg0 计算当前CPU栈的偏移位置 ldr reg1 相减得到栈顶 mov sp
Definition: asm.h:57
STATIC INT32 OsCopyProcess(UINT32 flags, const CHAR *name, UINTPTR sp, UINT32 size)
拷贝进程
Definition: los_process.c:1999
unsigned int UINT32
Definition: los_typedef.h:57
函数调用图:
这是这个函数的调用关系图:

◆ OsCurrProcessGet()

STATIC INLINE LosProcessCB * OsCurrProcessGet ( VOID  )

获取当前进程PCB

在文件 los_process_pri.h353 行定义.

354{
355 UINT32 intSave;
356
357 intSave = LOS_IntLock();
358 LosProcessCB *runProcess = OS_PCB_FROM_PID(OsCurrTaskGet()->processID);
359 LOS_IntRestore(intSave);
360 return runProcess;
361}
STATIC INLINE VOID LOS_IntRestore(UINT32 intSave)
Restore interrupts. | 恢复到使用LOS_IntLock关闭所有中断之前的状态
Definition: los_hwi.h:337
STATIC INLINE UINT32 LOS_IntLock(VOID)
Disable all interrupts. | 关闭当前处理器所有中断响应
Definition: los_hwi.h:286
STATIC INLINE LosTaskCB * OsCurrTaskGet(VOID)
函数调用图:

◆ OsCurrUserGet()

STATIC INLINE User * OsCurrUserGet ( VOID  )

获取当前进程的所属用户

在文件 los_process_pri.h365 行定义.

366{
367 User *user = NULL;
368 UINT32 intSave;
369
370 intSave = LOS_IntLock();
371 user = OsCurrProcessGet()->user;
372 LOS_IntRestore(intSave);
373 return user;
374}
STATIC INLINE LosProcessCB * OsCurrProcessGet(VOID)
User * user
进程的拥有者
函数调用图:
这是这个函数的调用关系图:

◆ OsDeleteTaskFromProcess()

VOID OsDeleteTaskFromProcess ( LosTaskCB taskCB)

在文件 los_process.c107 行定义.

108{
109 LosProcessCB *processCB = OS_PCB_FROM_PID(taskCB->processID);
110
111 LOS_ListDelete(&taskCB->threadList);
112 processCB->threadNumber--;
114}
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListDelete(LOS_DL_LIST *node)
Definition: los_list.h:292
VOID OsTaskInsertToRecycleList(LosTaskCB *taskCB)
Definition: los_task.c:198
volatile UINT32 threadNumber
LOS_DL_LIST threadList
UINT32 processID
函数调用图:
这是这个函数的调用关系图:

◆ OsExecProcessVmSpaceReplace()

LosVmSpace * OsExecProcessVmSpaceReplace ( LosVmSpace newSpace,
UINTPTR  stackBase,
INT32  randomDevFD 
)

在文件 los_process.c1541 行定义.

1542{
1543 LosProcessCB *processCB = OsCurrProcessGet();
1544 LosTaskCB *runTask = OsCurrTaskGet();
1545
1548
1549 LosVmSpace *oldSpace = processCB->vmSpace;
1550 processCB->vmSpace = newSpace;
1551 processCB->vmSpace->heapBase += OsGetRndOffset(randomDevFD);
1552 processCB->vmSpace->heapNow = processCB->vmSpace->heapBase;
1553 processCB->vmSpace->mapBase += OsGetRndOffset(randomDevFD);
1554 processCB->vmSpace->mapSize = stackBase - processCB->vmSpace->mapBase;
1555 runTask->archMmu = (UINTPTR)&processCB->vmSpace->archMmu;
1557 return oldSpace;
1558}
VOID LOS_ArchMmuContextSwitch(LosArchMmu *archMmu)
LOS_ArchMmuContextSwitch 切换MMU上下文
UINT32 OsGetRndOffset(INT32 randomDevFD)
Definition: los_load_elf.c:719
LITE_OS_SEC_TEXT VOID OsProcessThreadGroupDestroy(VOID)
Definition: los_process.c:2200
LITE_OS_SEC_TEXT VOID OsTaskCBRecycleToFree()
Definition: los_task.c:472
unsigned long UINTPTR
Definition: los_typedef.h:68
内存管理单元(英语:memory management unit,缩写为MMU),有时称作分页内存管理单元(英语:paged memory management unit,缩写为PMMU)。
Definition: los_arch_mmu.h:86
LosVmSpace * vmSpace
UINTPTR archMmu
虚拟空间,每个进程都有一个属于自己的虚拟内存地址空间
Definition: los_vm_map.h:146
VADDR_T mapBase
Definition: los_vm_map.h:155
VADDR_T heapBase
Definition: los_vm_map.h:152
VADDR_T heapNow
Definition: los_vm_map.h:153
LosArchMmu archMmu
Definition: los_vm_map.h:157
UINT32 mapSize
Definition: los_vm_map.h:156
函数调用图:
这是这个函数的调用关系图:

◆ OsExecProcessVmSpaceRestore()

VOID OsExecProcessVmSpaceRestore ( LosVmSpace oldSpace)

在文件 los_process.c1531 行定义.

1532{
1533 LosProcessCB *processCB = OsCurrProcessGet();
1534 LosTaskCB *runTask = OsCurrTaskGet();
1535
1536 processCB->vmSpace = oldSpace;
1537 runTask->archMmu = (UINTPTR)&processCB->vmSpace->archMmu;
1539}
函数调用图:
这是这个函数的调用关系图:

◆ OsExecRecycleAndInit()

UINT32 OsExecRecycleAndInit ( LosProcessCB processCB,
const CHAR name,
LosVmSpace oldSpace,
UINTPTR  oldFiles 
)

进程的回收再利用,被LOS_DoExecveFile调用

参数
processCB
name
oldSpace
oldFiles
返回
LITE_OS_SEC_TEXT

在文件 los_process.c1568 行定义.

1570{
1571 UINT32 ret;
1572 const CHAR *processName = NULL;
1573
1574 if ((processCB == NULL) || (name == NULL)) {
1575 return LOS_NOK;
1576 }
1577
1578 processName = strrchr(name, '/');
1579 processName = (processName == NULL) ? name : (processName + 1); /* 1: Do not include '/' */
1580
1581 ret = (UINT32)OsSetTaskName(OsCurrTaskGet(), processName, TRUE);
1582 if (ret != LOS_OK) {
1583 return ret;
1584 }
1585
1586#ifdef LOSCFG_KERNEL_LITEIPC
1587 (VOID)LiteIpcPoolDestroy(processCB->processID);
1588#endif
1589
1590 processCB->sigHandler = 0;
1592
1593 LOS_VmSpaceFree(oldSpace);
1594#ifdef LOSCFG_FS_VFS
1595 CloseOnExec((struct files_struct *)oldFiles);
1596 delete_files_snapshot((struct files_struct *)oldFiles);
1597#endif
1598
1599 OsSwtmrRecycle(processCB->processID);//回收定时器
1600 processCB->timerID = (timer_t)(UINTPTR)MAX_INVALID_TIMER_VID;
1601
1602#ifdef LOSCFG_SECURITY_VID
1603 VidMapDestroy(processCB);
1604 ret = VidMapListInit(processCB);
1605 if (ret != LOS_OK) {
1606 return LOS_NOK;
1607 }
1608#endif
1609
1610 processCB->processStatus &= ~OS_PROCESS_FLAG_EXIT; //去掉进程退出标签
1611 processCB->processStatus |= OS_PROCESS_FLAG_ALREADY_EXEC;//加上进程运行elf标签
1612
1613 return LOS_OK;
1614}
void delete_files_snapshot(struct files_struct *files)
删除文件管理器快照
void CloseOnExec(struct files_struct *files)
Definition: vfs_cloexec.c:42
LITE_OS_SEC_TEXT UINT32 LiteIpcPoolDestroy(UINT32 processID)
销毁指定进程的IPC池
Definition: hm_liteipc.c:386
LITE_OS_SEC_TEXT_INIT VOID OsSwtmrRecycle(UINT32 processID)
回收指定进程的软时钟
Definition: los_swtmr.c:391
LITE_OS_SEC_TEXT INT32 OsSetTaskName(LosTaskCB *taskCB, const CHAR *name, BOOL setPName)
Definition: los_task.c:1337
char CHAR
Definition: los_typedef.h:63
STATUS_T LOS_VmSpaceFree(LosVmSpace *space)
timer_t timerID
UINT32 processID
UINTPTR sigHandler
UINT16 processStatus
sig_cb sig
信号控制块,用于异步通信,类似于 linux singal模块
sigset_t sigprocmask
Signals that are blocked | 任务屏蔽了哪些信号
Definition: los_signal.h:223
void VidMapDestroy(LosProcessCB *processCB)
销毁虚拟ID映射
Definition: vid.c:57
UINT32 VidMapListInit(LosProcessCB *processCB)
Definition: vid.c:36
函数调用图:
这是这个函数的调用关系图:

◆ OsExecStart()

UINT32 OsExecStart ( const TSK_ENTRY_FUNC  entry,
UINTPTR  sp,
UINTPTR  mapBase,
UINT32  mapSize 
)

执行用户态任务, entry为入口函数 ,其中 创建好task,task上下文 等待调度真正执行, sp:栈指针 mapBase:栈底 mapSize:栈大小

在文件 los_process.c1616 行定义.

1617{
1618 UINT32 intSave;
1619
1620 if (entry == NULL) {
1621 return LOS_NOK;
1622 }
1623
1624 if ((sp == 0) || (LOS_Align(sp, LOSCFG_STACK_POINT_ALIGN_SIZE) != sp)) {//对齐
1625 return LOS_NOK;
1626 }
1627 //注意 sp此时指向栈底,栈底地址要大于栈顶
1628 if ((mapBase == 0) || (mapSize == 0) || (sp <= mapBase) || (sp > (mapBase + mapSize))) {//参数检查
1629 return LOS_NOK;
1630 }
1631
1632 LosTaskCB *taskCB = OsCurrTaskGet();//获取当前任务
1633 SCHEDULER_LOCK(intSave);//拿自旋锁
1634
1635 taskCB->userMapBase = mapBase;//用户态栈顶位置
1636 taskCB->userMapSize = mapSize;//用户态栈
1637 taskCB->taskEntry = (TSK_ENTRY_FUNC)entry;//任务的入口函数
1638 //初始化内核态栈
1639 TaskContext *taskContext = (TaskContext *)OsTaskStackInit(taskCB->taskID, taskCB->stackSize,
1640 (VOID *)taskCB->topOfStack, FALSE);
1641 OsUserTaskStackInit(taskContext, (UINTPTR)taskCB->taskEntry, sp);//初始化用户栈,将内核栈中上下文的 context->R[0] = sp ,context->sp = sp
1642 //这样做的目的是将用户栈SP保存到内核栈中,
1643 SCHEDULER_UNLOCK(intSave);//解锁
1644 return LOS_OK;
1645}
LITE_OS_SEC_TEXT UINTPTR LOS_Align(UINTPTR addr, UINT32 boundary)
Align the value (addr) by some bytes (boundary) you specify.
Definition: los_misc.c:35
VOID *(* TSK_ENTRY_FUNC)(UINTPTR param1, UINTPTR param2, UINTPTR param3, UINTPTR param4)
Define the type of a task entrance function.
Definition: los_task.h:480
VOID * OsTaskStackInit(UINT32 taskID, UINT32 stackSize, VOID *topStack, BOOL initFlag)
内核态任务运行栈初始化
Definition: los_hw.c:73
VOID OsUserTaskStackInit(TaskContext *context, UINTPTR taskEntry, UINTPTR stack)
用户态运行栈初始化,此时上下文还在内核区
Definition: los_hw.c:123
TSK_ENTRY_FUNC taskEntry
UINT32 taskID
UINT32 stackSize
UINTPTR userMapBase
用户空间的栈顶位置,内存来自用户空间,和topOfStack有本质的区别.
UINTPTR topOfStack
UINT32 userMapSize
函数调用图:
这是这个函数的调用关系图:

◆ OsGetIdleProcessID()

UINT32 OsGetIdleProcessID ( VOID  )

获取内核态空闲进程

在文件 los_process.c2254 行定义.

2255{
2256 return g_kernelIdleProcess;
2257}
LITE_OS_SEC_BSS UINT32 g_kernelIdleProcess
0号进程 内核态idle进程,由Kprocess fork
Definition: los_process.c:85
这是这个函数的调用关系图:

◆ OsGetKernelInitProcessID()

UINT32 OsGetKernelInitProcessID ( VOID  )

获取内核态根进程

在文件 los_process.c2249 行定义.

2250{
2251 return g_kernelInitProcess;
2252}
LITE_OS_SEC_BSS UINT32 g_kernelInitProcess
2号进程 内核态初始Kprocess进程,内核态下其他进程由它 fork
Definition: los_process.c:84
这是这个函数的调用关系图:

◆ OsGetProcessPriority()

INT32 OsGetProcessPriority ( INT32  which,
INT32  pid 
)

接口封装 - 获取进程优先级 which:标识进程,进程组,用户

在文件 los_process.c1055 行定义.

1056{
1057 UINT32 intSave;
1058 SchedParam param = { 0 };
1059 (VOID)which;
1060
1061 if (OS_PID_CHECK_INVALID(pid)) {
1062 return -LOS_EINVAL;
1063 }
1064
1065 if (which != LOS_PRIO_PROCESS) {
1066 return -LOS_EINVAL;
1067 }
1068
1069 LosProcessCB *processCB = OS_PCB_FROM_PID(pid);
1070 SCHEDULER_LOCK(intSave);
1071 if (OsProcessIsUnused(processCB)) {
1072 SCHEDULER_UNLOCK(intSave);
1073 return -LOS_ESRCH;
1074 }
1075
1076 LosTaskCB *taskCB = OS_TCB_FROM_TID(processCB->threadGroupID);
1077 taskCB->ops->schedParamGet(taskCB, &param);
1078
1079 SCHEDULER_UNLOCK(intSave);
1080 return param.basePrio;
1081}
STATIC INLINE BOOL OsProcessIsUnused(const LosProcessCB *processCB)
UINT32 threadGroupID
UINT32(* schedParamGet)(const LosTaskCB *taskCB, SchedParam *param)
获取调度参数
UINT16 basePrio
const SchedOps * ops
函数调用图:
这是这个函数的调用关系图:

◆ OsGetSigHandler()

UINTPTR OsGetSigHandler ( VOID  )

获取进程的信号处理函数

在文件 los_process.c2264 行定义.

2265{
2266 return OsCurrProcessGet()->sigHandler;
2267}
函数调用图:
这是这个函数的调用关系图:

◆ OsGetUserInitProcessID()

UINT32 OsGetUserInitProcessID ( VOID  )

获取用户态进程的根进程,所有用户进程都是g_processCBArray[g_userInitProcess] fork来的

在文件 los_process.c2244 行定义.

2245{
2246 return g_userInitProcess;//用户态根进程 序号为 1
2247}
LITE_OS_SEC_BSS UINT32 g_userInitProcess
1号进程 用户态的初始init进程,用户态下其他进程由它 fork
Definition: los_process.c:83
这是这个函数的调用关系图:

◆ OsProcessAddNewTask()

UINT32 OsProcessAddNewTask ( UINT32  pid,
LosTaskCB taskCB,
SchedParam param 
)

在文件 los_process.c116 行定义.

117{
118 UINT32 intSave;
119 UINT16 numCount;
120 LosProcessCB *processCB = OS_PCB_FROM_PID(pid);
121
122 SCHEDULER_LOCK(intSave);
123 taskCB->processID = pid;
124 LOS_ListTailInsert(&(processCB->threadSiblingList), &(taskCB->threadList));
125
126 if (OsProcessIsUserMode(processCB)) {
127 taskCB->taskStatus |= OS_TASK_FLAG_USER_MODE;
128 if (processCB->threadNumber > 0) {
129 LosTaskCB *task = OS_TCB_FROM_TID(processCB->threadGroupID);
130 task->ops->schedParamGet(task, param);
131 } else {
133 }
134 } else {
135 LosTaskCB *runTask = OsCurrTaskGet();
136 runTask->ops->schedParamGet(runTask, param);
137 }
138
139#ifdef LOSCFG_KERNEL_VM
140 taskCB->archMmu = (UINTPTR)&processCB->vmSpace->archMmu;
141#endif
142 if (!processCB->threadNumber) {
143 processCB->threadGroupID = taskCB->taskID;
144 }
145 processCB->threadNumber++;
146
147 numCount = processCB->threadCount;
148 processCB->threadCount++;
149 SCHEDULER_UNLOCK(intSave);
150 return numCount;
151}
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListTailInsert(LOS_DL_LIST *list, LOS_DL_LIST *node)
Insert a node to the tail of a doubly linked list.
Definition: los_list.h:244
STATIC INLINE BOOL OsProcessIsUserMode(const LosProcessCB *processCB)
VOID OsSchedProcessDefaultSchedParamGet(UINT16 policy, SchedParam *param)
Definition: los_sched.c:267
unsigned short UINT16
Definition: los_typedef.h:56
UINT32 threadCount
LOS_DL_LIST threadSiblingList
UINT16 policy
UINT16 taskStatus
if(tv==NULL)
Definition: time.c:430
函数调用图:
这是这个函数的调用关系图:

◆ OsProcessCBRecycleToFree()

VOID OsProcessCBRecycleToFree ( VOID  )

进程回收再利用过程

在文件 los_process.c625 行定义.

626{
627 UINT32 intSave;
628 LosProcessCB *processCB = NULL;
629
630 SCHEDULER_LOCK(intSave);
631 while (!LOS_ListEmpty(&g_processRecycleList)) {//循环任务回收链表,直到为空
632 processCB = OS_PCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&g_processRecycleList));//找到回收链表中第一个进程实体
633 //OS_PCB_FROM_PENDLIST 代表的是通过pendlist节点找到 PCB实体,因为g_processRecyleList上面挂的是pendlist节点位置
634 if (!(processCB->processStatus & OS_PROCESS_FLAG_EXIT)) {//进程没有退出标签
635 break;
636 }
637 SCHEDULER_UNLOCK(intSave);
638
640
641 SCHEDULER_LOCK(intSave);
642 processCB->processStatus &= ~OS_PROCESS_FLAG_EXIT;//给进程撕掉退出标签,(可能进程并没有这个标签)
643#ifdef LOSCFG_KERNEL_VM
644 LosVmSpace *space = NULL;
645 if (OsProcessIsUserMode(processCB)) {//进程是否是用户态进程
646 space = processCB->vmSpace;//只有用户态的进程才需要释放虚拟内存空间
647 }
648 processCB->vmSpace = NULL;
649#endif
650 /* OS_PROCESS_FLAG_GROUP_LEADER: The lead process group cannot be recycled without destroying the PCB.
651 * !OS_PROCESS_FLAG_UNUSED: Parent process does not reclaim child process resources.
652 */
653 LOS_ListDelete(&processCB->pendList);//将进程从进程链表上摘除
654 if ((processCB->processStatus & OS_PROCESS_FLAG_GROUP_LEADER) ||//如果进程是进程组组长或者处于僵死状态
655 (processCB->processStatus & OS_PROCESS_STATUS_ZOMBIES)) {
656 LOS_ListTailInsert(&g_processRecycleList, &processCB->pendList);//将进程挂到进程回收链表上,因为组长不能走啊
657 } else {
658 /* Clear the bottom 4 bits of process status */
659 OsInsertPCBToFreeList(processCB);//进程回到可分配池中,再分配利用
660 }
661#ifdef LOSCFG_KERNEL_VM
662 SCHEDULER_UNLOCK(intSave);
663 (VOID)LOS_VmSpaceFree(space);//释放用户态进程的虚拟内存空间,因为内核只有一个虚拟空间,因此不需要释放虚拟空间.
664 SCHEDULER_LOCK(intSave);
665#endif
666 }
667
668 SCHEDULER_UNLOCK(intSave);
669}
LITE_OS_SEC_ALW_INLINE STATIC INLINE BOOL LOS_ListEmpty(LOS_DL_LIST *list)
Identify whether a specified doubly linked list is empty. | 判断链表是否为空
Definition: los_list.h:321
LITE_OS_SEC_DATA_INIT STATIC LOS_DL_LIST g_processRecycleList
需要回收的进程列表
Definition: los_process.c:82
STATIC INLINE VOID OsInsertPCBToFreeList(LosProcessCB *processCB)
将进程插入到空闲链表中
Definition: los_process.c:97
LOS_DL_LIST pendList
函数调用图:
这是这个函数的调用关系图:

◆ OsProcessExecVnodeGet()

STATIC INLINE struct Vnode * OsProcessExecVnodeGet ( const LosProcessCB processCB)

在文件 los_process_pri.h408 行定义.

409{
410 return processCB->execVnode;
411}
struct Vnode * execVnode

◆ OsProcessExitCodeCoreDumpSet()

STATIC INLINE VOID OsProcessExitCodeCoreDumpSet ( LosProcessCB processCB)

置进程退出码第七位为1

在文件 los_process_pri.h318 行定义.

319{
320 processCB->exitCode |= 0x80U; // 0b10000000
321}
UINT32 exitCode
这是这个函数的调用关系图:

◆ OsProcessExitCodeSet()

STATIC INLINE VOID OsProcessExitCodeSet ( LosProcessCB processCB,
UINT32  code 
)

设置进程退出号(8 ~ 15)

在文件 los_process_pri.h338 行定义.

339{
340 processCB->exitCode |= ((code & 0x000000FFU) << 8U) & 0x0000FF00U; /* 8: Move 8 bits to the left, exitCode */
341}
这是这个函数的调用关系图:

◆ OsProcessExitCodeSignalClear()

STATIC INLINE VOID OsProcessExitCodeSignalClear ( LosProcessCB processCB)

清除进程退出信号(0 ~ 7)

在文件 los_process_pri.h328 行定义.

329{
330 processCB->exitCode &= (~0x7FU);// 低7位全部清0
331}
这是这个函数的调用关系图:

◆ OsProcessExitCodeSignalIsSet()

STATIC INLINE BOOL OsProcessExitCodeSignalIsSet ( LosProcessCB processCB)

进程退出码是否被设置过,默认是 0 ,如果 & 0x7FU 还是 0 ,说明没有被设置过.

在文件 los_process_pri.h333 行定义.

334{
335 return (processCB->exitCode) & 0x7FU;
336}
这是这个函数的调用关系图:

◆ OsProcessExitCodeSignalSet()

STATIC INLINE VOID OsProcessExitCodeSignalSet ( LosProcessCB processCB,
UINT32  signal 
)

设置进程退出信号(0 ~ 7)

在文件 los_process_pri.h323 行定义.

324{
325 processCB->exitCode |= signal & 0x7FU;// 0b01111111
326}
这是这个函数的调用关系图:

◆ OsProcessIDUserCheckInvalid()

STATIC INLINE BOOL OsProcessIDUserCheckInvalid ( UINT32  pid)

内联函数 进程ID是否有效

在文件 los_process_pri.h348 行定义.

349{
350 return ((pid >= g_processMaxNum) || (pid == 0));
351}
UINT32 g_processMaxNum
进程最大数量
Definition: los_process.c:86
这是这个函数的调用关系图:

◆ OsProcessIsDead()

STATIC INLINE BOOL OsProcessIsDead ( const LosProcessCB processCB)

进程死啦死啦的定义: 身上贴有不使用且状态为僵死的进程

Used to check if the process is dead.

在文件 los_process_pri.h252 行定义.

253{
254 return ((processCB->processStatus & (OS_PROCESS_FLAG_UNUSED | OS_PROCESS_STATUS_ZOMBIES)) != 0);
255}
这是这个函数的调用关系图:

◆ OsProcessIsInactive()

STATIC INLINE BOOL OsProcessIsInactive ( const LosProcessCB processCB)

进程不活跃函数定义:身上贴有不使用且不活跃标签的进程

Used to check if the process is inactive.

在文件 los_process_pri.h243 行定义.

244{
245 return ((processCB->processStatus & (OS_PROCESS_FLAG_UNUSED | OS_PROCESS_STATUS_INACTIVE)) != 0);
246}
这是这个函数的调用关系图:

◆ OsProcessIsInit()

STATIC INLINE BOOL OsProcessIsInit ( const LosProcessCB processCB)

在文件 los_process_pri.h257 行定义.

258{
259 return (processCB->processStatus & OS_PROCESS_STATUS_INIT);
260}
这是这个函数的调用关系图:

◆ OsProcessIsUnused()

STATIC INLINE BOOL OsProcessIsUnused ( const LosProcessCB processCB)

Used to check if the process control block is unused.

在文件 los_process_pri.h234 行定义.

235{
236 return ((processCB->processStatus & OS_PROCESS_FLAG_UNUSED) != 0);
237}
这是这个函数的调用关系图:

◆ OsProcessIsUserMode()

STATIC INLINE BOOL OsProcessIsUserMode ( const LosProcessCB processCB)

用户态进程

在文件 los_process_pri.h299 行定义.

300{
301 return (processCB->processMode == OS_USER_MODE);
302}
UINT16 processMode
这是这个函数的调用关系图:

◆ OsProcessNaturalExit()

VOID OsProcessNaturalExit ( LosProcessCB processCB,
UINT32  status 
)

一个进程的自然消亡过程,参数是当前运行的任务

在文件 los_process.c550 行定义.

551{
552 LosProcessCB *parentCB = NULL;
553
554 OsChildProcessResourcesFree(processCB);//释放孩子进程的资源
555
556
557 /* is a child process */
558 if (processCB->parentProcessID != OS_INVALID_VALUE) {//判断是否有父进程
559 parentCB = OS_PCB_FROM_PID(processCB->parentProcessID);//获取父进程实体
560 LOS_ListDelete(&processCB->siblingList);//将自己从兄弟链表中摘除,家人们,永别了!
561 if (!OsProcessExitCodeSignalIsSet(processCB)) {//是否设置了退出码?
562 OsProcessExitCodeSet(processCB, status);//将进程状态设为退出码
563 }
564 LOS_ListTailInsert(&parentCB->exitChildList, &processCB->siblingList);//挂到父进程的孩子消亡链表,家人中,永别的可不止我一个.
565 LOS_ListDelete(&processCB->subordinateGroupList);//和志同道合的朋友们永别了,注意家里可不一定是朋友的,所有各有链表.
566 LOS_ListTailInsert(&processCB->group->exitProcessList, &processCB->subordinateGroupList);//挂到进程组消亡链表,朋友中,永别的可不止我一个.
567
568 OsWaitCheckAndWakeParentProcess(parentCB, processCB);//检查父进程的等待任务链表并唤醒对应的任务,此处将会频繁的切到其他任务运行.
569
570 OsDealAliveChildProcess(processCB);//孩子们要怎么处理,移交给(用户态和内核态)根进程
571
572 processCB->processStatus |= OS_PROCESS_STATUS_ZOMBIES;//贴上僵死进程的标签
573
574#ifdef LOSCFG_KERNEL_VM
575 (VOID)OsKill(processCB->parentProcessID, SIGCHLD, OS_KERNEL_KILL_PERMISSION);//以内核权限发送SIGCHLD(子进程退出)信号.
576#endif
577 LOS_ListHeadInsert(&g_processRecycleList, &processCB->pendList);//将进程通过其阻塞节点挂入全局进程回收链表
578 return;
579 }
580
581 LOS_Panic("pid : %u is the root process exit!\n", processCB->processID);
582 return;
583}
NORETURN VOID LOS_Panic(const CHAR *fmt,...)
Kernel panic function.
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListHeadInsert(LOS_DL_LIST *list, LOS_DL_LIST *node)
Insert a node to the head of a doubly linked list.
Definition: los_list.h:268
STATIC VOID OsDealAliveChildProcess(LosProcessCB *processCB)
Definition: los_process.c:503
STATIC VOID OsChildProcessResourcesFree(const LosProcessCB *processCB)
Definition: los_process.c:537
STATIC VOID OsWaitCheckAndWakeParentProcess(LosProcessCB *parentCB, const LosProcessCB *processCB)
Definition: los_process.c:368
STATIC INLINE BOOL OsProcessExitCodeSignalIsSet(LosProcessCB *processCB)
进程退出码是否被设置过,默认是 0 ,如果 & 0x7FU 还是 0 ,说明没有被设置过.
STATIC INLINE VOID OsProcessExitCodeSet(LosProcessCB *processCB, UINT32 code)
设置进程退出号(8 ~ 15)
int OsKill(pid_t pid, int sig, int permission)
Definition: los_signal.c:450
LOS_DL_LIST siblingList
LOS_DL_LIST subordinateGroupList
UINT32 parentProcessID
LOS_DL_LIST exitChildList
ProcessGroup * group
LOS_DL_LIST exitProcessList
函数调用图:
这是这个函数的调用关系图:

◆ OsProcessResourcesToFree()

VOID OsProcessResourcesToFree ( LosProcessCB processCB)

回收指定进程的资源

在文件 los_process.c431 行定义.

432{
433#ifdef LOSCFG_KERNEL_VM
434 if (OsProcessIsUserMode(processCB)) {
435 (VOID)OsVmSpaceRegionFree(processCB->vmSpace);
436 }
437#endif
438#ifdef LOSCFG_FS_VFS
439 if (OsProcessIsUserMode(processCB)) {//用户进程
440 delete_files(processCB->files);//归还进程占用的进程描述符`profd`,如果是最后一个占用的系统描述符的进程,则同时归还系统文件描述符`sysfd`
441 }
442 processCB->files = NULL; //重置指针为空
443#endif
444
445#ifdef LOSCFG_SECURITY_CAPABILITY //安全开关
446 if (processCB->user != NULL) {
447 (VOID)LOS_MemFree(m_aucSysMem1, processCB->user);//删除用户
448 processCB->user = NULL; //重置指针为空
449 }
450#endif
451
452 OsSwtmrRecycle(processCB->processID);//回收进程使用的定时器
453 processCB->timerID = (timer_t)(UINTPTR)MAX_INVALID_TIMER_VID;
454
455#ifdef LOSCFG_SECURITY_VID
456 if (processCB->timerIdMap.bitMap != NULL) {
457 VidMapDestroy(processCB);
458 processCB->timerIdMap.bitMap = NULL;
459 }
460#endif
461
462#ifdef LOSCFG_KERNEL_LITEIPC
463 (VOID)LiteIpcPoolDestroy(processCB->processID);
464#endif
465
466#ifdef LOSCFG_KERNEL_CPUP
467 UINT32 intSave;
468 OsCpupBase *processCpup = processCB->processCpup;
469 SCHEDULER_LOCK(intSave);
470 processCB->processCpup = NULL;
471 SCHEDULER_UNLOCK(intSave);
472 (VOID)LOS_MemFree(m_aucSysMem1, processCpup);
473#endif
474
475 if (processCB->resourceLimit != NULL) {
476 (VOID)LOS_MemFree((VOID *)m_aucSysMem0, processCB->resourceLimit);
477 processCB->resourceLimit = NULL;
478 }
479}
void delete_files(struct files_struct *files)
删除参数进程的文件管理器
UINT8 * m_aucSysMem1
系统动态内存池地址的起始地址 @note_thinking 能否不要用 0,1来命名核心变量 ???
Definition: los_memory.c:108
UINT32 LOS_MemFree(VOID *pool, VOID *ptr)
释放从指定动态内存中申请的内存
Definition: los_memory.c:1369
UINT8 * m_aucSysMem0
异常交互动态内存池地址的起始地址,当不支持异常交互特性时,m_aucSysMem0等于m_aucSysMem1。
Definition: los_memory.c:107
STATUS_T OsVmSpaceRegionFree(LosVmSpace *space)
struct rlimit * resourceLimit
每个进程在运行时系统不会无限制的允许单个进程不断的消耗资源,因此都会设置资源限制。
OsCpupBase * processCpup
struct files_struct * files
TimerIdMap timerIdMap
UINT32 * bitMap
Definition: vid_type.h:40
函数调用图:
这是这个函数的调用关系图:

◆ OsProcessThreadGroupDestroy()

VOID OsProcessThreadGroupDestroy ( VOID  )

在文件 los_process.c2200 行定义.

2201{
2202#ifdef LOSCFG_KERNEL_VM
2203 UINT32 intSave;
2204
2205 LosProcessCB *processCB = OsCurrProcessGet();
2206 LosTaskCB *currTask = OsCurrTaskGet();
2207 SCHEDULER_LOCK(intSave);
2208 if ((processCB->processStatus & OS_PROCESS_FLAG_EXIT) || !OsProcessIsUserMode(processCB)) {
2209 SCHEDULER_UNLOCK(intSave);
2210 return;
2211 }
2212
2213 processCB->processStatus |= OS_PROCESS_FLAG_EXIT;
2214 processCB->threadGroupID = currTask->taskID;
2215
2216 LOS_DL_LIST *list = &processCB->threadSiblingList;
2217 LOS_DL_LIST *head = list;
2218 do {
2219 LosTaskCB *taskCB = LOS_DL_LIST_ENTRY(list->pstNext, LosTaskCB, threadList);
2220 if ((OsTaskIsInactive(taskCB) ||
2221 ((taskCB->taskStatus & OS_TASK_STATUS_READY) && !taskCB->sig.sigIntLock)) &&
2222 !(taskCB->taskStatus & OS_TASK_STATUS_RUNNING)) {
2223 OsInactiveTaskDelete(taskCB);
2224 } else if (taskCB != currTask) {
2226 } else {
2227 /* Skip the current task */
2228 list = list->pstNext;
2229 }
2230 } while (head != list->pstNext);
2231
2232 SCHEDULER_UNLOCK(intSave);
2233
2234 LOS_ASSERT(processCB->threadNumber == 1);
2235#endif
2236 return;
2237}
STATIC VOID ThreadGroupActiveTaskKilled(LosTaskCB *taskCB)
按指定状态退出指定进程
Definition: los_process.c:2167
STATIC INLINE BOOL OsTaskIsInactive(const LosTaskCB *taskCB)
LITE_OS_SEC_TEXT VOID OsInactiveTaskDelete(LosTaskCB *taskCB)
Definition: los_task.c:947
struct LOS_DL_LIST * pstNext
Definition: los_list.h:84
unsigned int sigIntLock
信号中断锁
Definition: los_signal.h:229
函数调用图:
这是这个函数的调用关系图:

◆ OsProcessThreadGroupIDGet()

STATIC INLINE UINT32 OsProcessThreadGroupIDGet ( const LosTaskCB taskCB)

在文件 los_process_pri.h390 行定义.

391{
392 return OS_PCB_FROM_PID(taskCB->processID)->threadGroupID;
393}
这是这个函数的调用关系图:

◆ OsProcessThreadNumberGet()

STATIC INLINE UINT32 OsProcessThreadNumberGet ( const LosTaskCB taskCB)

在文件 los_process_pri.h395 行定义.

396{
397 return OS_PCB_FROM_PID(taskCB->processID)->threadNumber;
398}
这是这个函数的调用关系图:

◆ OsProcessUserIDGet()

STATIC INLINE UINT32 OsProcessUserIDGet ( const LosTaskCB taskCB)

在文件 los_process_pri.h376 行定义.

377{
378 UINT32 intSave = LOS_IntLock();
379 UINT32 uid = OS_INVALID;
380
381 LosProcessCB *process = OS_PCB_FROM_PID(taskCB->processID);
382 if (process->user != NULL) {
383 uid = process->user->userID;
384 }
385 LOS_IntRestore(intSave);
386 return uid;
387}
UINT32 userID
用户ID [0,60000],0为root用户
函数调用图:

◆ OsProcessVmSpaceGet()

STATIC INLINE LosVmSpace * OsProcessVmSpaceGet ( const LosProcessCB processCB)

在文件 los_process_pri.h401 行定义.

402{
403 return processCB->vmSpace;
404}
这是这个函数的调用关系图:

◆ OsSendSignalToAllProcess()

INT32 OsSendSignalToAllProcess ( siginfo_t *  info,
INT32  permission 
)

给所有进程发送指定信号

在文件 los_process.c242 行定义.

243{
244 INT32 ret, success, err;
245 ProcessGroup *group = NULL;
246
247 success = 0;
248 err = OsSendSignalToSpecifyProcessGroup(g_processGroup, info, permission);//给g_processGroup进程组发送信号
249 success |= !err;
250 ret = err;
251 /* all processes group */
252 LOS_DL_LIST_FOR_EACH_ENTRY(group, &g_processGroup->groupList, ProcessGroup, groupList) {//遍历进程组
253 /* all processes in the process group. */
254 err = OsSendSignalToSpecifyProcessGroup(group, info, permission);
255 success |= !err;
256 ret = err;
257 }
258 return success ? LOS_OK : ret;
259}
LITE_OS_SEC_BSS ProcessGroup * g_processGroup
全局进程组,负责管理所有进程组
Definition: los_process.c:87
STATIC INT32 OsSendSignalToSpecifyProcessGroup(ProcessGroup *group, siginfo_t *info, INT32 permission)
Definition: los_process.c:221
signed int INT32
Definition: los_typedef.h:60
LOS_DL_LIST groupList
函数调用图:
这是这个函数的调用关系图:

◆ OsSendSignalToProcessGroup()

INT32 OsSendSignalToProcessGroup ( INT32  pid,
siginfo_t *  info,
INT32  permission 
)

发送指定信号给给进程组

在文件 los_process.c262 行定义.

263{
264 ProcessGroup *group = NULL;
265 /* Send SIG to all processes in process group PGRP.
266 If PGRP is zero, send SIG to all processes in
267 the current process's process group. */
268 group = OsFindProcessGroup(pid ? -pid : LOS_GetCurrProcessGroupID());
269 if (group == NULL) {
270 return -LOS_ESRCH;
271 }
272 /* all processes in the process group. */
273 return OsSendSignalToSpecifyProcessGroup(group, info, permission);
274}
STATIC ProcessGroup * OsFindProcessGroup(UINT32 gid)
Definition: los_process.c:203
LITE_OS_SEC_TEXT INT32 LOS_GetCurrProcessGroupID(VOID)
获取当前进程的组ID
Definition: los_process.c:1485
函数调用图:
这是这个函数的调用关系图:

◆ OsSetCurrProcessGroupID()

INT32 OsSetCurrProcessGroupID ( UINT32  gid)

在文件 los_process.c1456 行定义.

1457{
1458 return OsSetProcessGroupID(OsCurrProcessGet()->processID, gid);
1459}
LITE_OS_SEC_TEXT INT32 OsSetProcessGroupID(UINT32 pid, UINT32 gid)
Definition: los_process.c:1439
函数调用图:
这是这个函数的调用关系图:

◆ OsSetProcessGroupID()

INT32 OsSetProcessGroupID ( UINT32  pid,
UINT32  gid 
)

在文件 los_process.c1439 行定义.

1440{
1441 ProcessGroup *group = NULL;
1442 UINT32 ret;
1443 UINT32 intSave;
1444
1445 if ((OS_PID_CHECK_INVALID(pid)) || (OS_PID_CHECK_INVALID(gid))) {
1446 return -LOS_EINVAL;
1447 }
1448
1449 SCHEDULER_LOCK(intSave);
1450 ret = OsSetProcessGroupIDUnsafe(pid, gid, &group);
1451 SCHEDULER_UNLOCK(intSave);
1452 (VOID)LOS_MemFree(m_aucSysMem1, group);
1453 return -ret;
1454}
STATIC UINT32 OsSetProcessGroupIDUnsafe(UINT32 pid, UINT32 gid, ProcessGroup **group)
Definition: los_process.c:1400
函数调用图:
这是这个函数的调用关系图:

◆ OsSetProcessName()

UINT32 OsSetProcessName ( LosProcessCB processCB,
const CHAR name 
)

设置进程的名字

在文件 los_process.c704 行定义.

705{
706 errno_t errRet;
707
708 if (processCB == NULL) {
709 return LOS_EINVAL;
710 }
711
712 if (name != NULL) {
713 errRet = strncpy_s(processCB->processName, OS_PCB_NAME_LEN, name, OS_PCB_NAME_LEN - 1);
714 if (errRet == EOK) {
715 return LOS_OK;
716 }
717 }
718
719 switch (processCB->processMode) {
720 case OS_KERNEL_MODE:
721 errRet = snprintf_s(processCB->processName, OS_PCB_NAME_LEN, OS_PCB_NAME_LEN - 1,
722 "KerProcess%u", processCB->processID);
723 break;
724 default:
725 errRet = snprintf_s(processCB->processName, OS_PCB_NAME_LEN, OS_PCB_NAME_LEN - 1,
726 "UserProcess%u", processCB->processID);
727 break;
728 }
729
730 if (errRet < 0) {
731 return LOS_NOK;
732 }
733 return LOS_OK;
734}
CHAR processName[OS_PCB_NAME_LEN]
这是这个函数的调用关系图:

◆ OsSetProcessScheduler()

INT32 OsSetProcessScheduler ( INT32  which,
INT32  pid,
UINT16  prio,
UINT16  policy 
)

设置进程调度计划

在文件 los_process.c983 行定义.

984{
985 SchedParam param = { 0 };
986 UINT32 intSave;
987
988 INT32 ret = OsProcessSchedlerParamCheck(which, pid, prio, policy);
989 if (ret != LOS_OK) {
990 return -ret;
991 }
992
993 LosProcessCB *processCB = OS_PCB_FROM_PID(pid);
994 SCHEDULER_LOCK(intSave);//持有调度自旋锁,多CPU情况下调度期间需要原子处理
995 if (OsProcessIsInactive(processCB)) {//进程未活动的处理
996 ret = LOS_ESRCH;
997 goto EXIT;
998 }
999
1000#ifdef LOSCFG_SECURITY_CAPABILITY
1001 if (!OsProcessCapPermitCheck(processCB, &param, prio)) {
1002 ret = LOS_EPERM;
1003 goto EXIT;
1004 }
1005#endif
1006
1007 LosTaskCB *taskCB = OS_TCB_FROM_TID(processCB->threadGroupID);
1008 taskCB->ops->schedParamGet(taskCB, &param);
1009 param.basePrio = prio;
1010
1011 BOOL needSched = taskCB->ops->schedParamModify(taskCB, &param);
1012 SCHEDULER_UNLOCK(intSave);//还锁
1013
1014 LOS_MpSchedule(OS_MP_CPU_ALL);//核间中断
1015 if (needSched && OS_SCHEDULER_ACTIVE) {
1016 LOS_Schedule();//发起调度
1017 }
1018 return LOS_OK;
1019
1020EXIT:
1021 SCHEDULER_UNLOCK(intSave);//还锁
1022 return -ret;
1023}
VOID LOS_Schedule(VOID)
Trigger active task scheduling.
Definition: los_sched.c:469
VOID LOS_MpSchedule(UINT32 target)
Definition: los_mp.c:76
STATIC INLINE INT32 OsProcessSchedlerParamCheck(INT32 which, INT32 pid, UINT16 prio, UINT16 policy)
进程调度参数检查
Definition: los_process.c:939
STATIC BOOL OsProcessCapPermitCheck(const LosProcessCB *processCB, const SchedParam *param, UINT16 prio)
Definition: los_process.c:961
STATIC INLINE BOOL OsProcessIsInactive(const LosProcessCB *processCB)
进程不活跃函数定义:身上贴有不使用且不活跃标签的进程
size_t BOOL
Definition: los_typedef.h:88
BOOL(* schedParamModify)(LosTaskCB *taskCB, const SchedParam *param)
修改调度参数
函数调用图:
这是这个函数的调用关系图:

◆ OsSetSigHandler()

VOID OsSetSigHandler ( UINTPTR  addr)

设置进程的信号处理函数

在文件 los_process.c2259 行定义.

2260{
2261 OsCurrProcessGet()->sigHandler = addr;
2262}
函数调用图:
这是这个函数的调用关系图:

◆ OsSystemProcessCreate()

UINT32 OsSystemProcessCreate ( VOID  )

创建2,0号进程,即内核态进程的老祖宗

在文件 los_process.c896 行定义.

897{
898 UINT32 ret = OsProcessInit();
899 if (ret != LOS_OK) {
900 return ret;
901 }
902
903 LosProcessCB *kerInitProcess = OS_PCB_FROM_PID(g_kernelInitProcess);//获取进程池中2号实体
904 ret = OsProcessCreateInit(kerInitProcess, OS_KERNEL_MODE, "KProcess");//创建内核态祖宗进程
905 if (ret != LOS_OK) {
906 return ret;
907 }
908
909 kerInitProcess->processStatus &= ~OS_PROCESS_STATUS_INIT;//去掉初始化标签
910 g_processGroup = kerInitProcess->group;//进程组ID就是2号进程本身
911 LOS_ListInit(&g_processGroup->groupList);//初始化进程组链表
912
913 LosProcessCB *idleProcess = OS_PCB_FROM_PID(g_kernelIdleProcess);//获取进程池中0号实体
914 ret = OsInitPCB(idleProcess, OS_KERNEL_MODE, "KIdle");//创建内核态0号进程
915 if (ret != LOS_OK) {
916 return ret;
917 }
918 idleProcess->parentProcessID = kerInitProcess->processID;//认2号进程为父,它可是长子.
919 LOS_ListTailInsert(&kerInitProcess->childrenList, &idleProcess->siblingList);//挂到内核态祖宗进程的子孙链接上
920 idleProcess->group = kerInitProcess->group;//和老祖宗一个进程组,注意是父子并不代表是朋友.
921 LOS_ListTailInsert(&kerInitProcess->group->processList, &idleProcess->subordinateGroupList);//挂到老祖宗的进程组链表上,进入了老祖宗的朋友圈.
922#ifdef LOSCFG_SECURITY_CAPABILITY
923 idleProcess->user = kerInitProcess->user;//共享用户
924#endif
925#ifdef LOSCFG_FS_VFS
926 idleProcess->files = kerInitProcess->files;//共享文件
927#endif
928 idleProcess->processStatus &= ~OS_PROCESS_STATUS_INIT;
929
930 ret = OsIdleTaskCreate();//创建cpu的idle任务,从此当前CPU OsPercpuGet()->idleTaskID 有了休息的地方.
931 if (ret != LOS_OK) {
932 return ret;
933 }
934 idleProcess->threadGroupID = OsGetIdleTaskId();
935
936 return LOS_OK;
937}
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListInit(LOS_DL_LIST *list)
Definition: los_list.h:104
STATIC UINT32 OsInitPCB(LosProcessCB *processCB, UINT32 mode, const CHAR *name)
Definition: los_process.c:737
STATIC UINT32 OsProcessInit(VOID)
Definition: los_process.c:586
STATIC UINT32 OsProcessCreateInit(LosProcessCB *processCB, UINT32 flags, const CHAR *name)
Definition: los_process.c:859
LITE_OS_SEC_TEXT_INIT UINT32 OsIdleTaskCreate(VOID)
创建一个空闲任务
Definition: los_task.c:300
UINT32 OsGetIdleTaskId(VOID)
获取IdletaskId,每个CPU核都对Task进行了内部管理,做到真正的并行处理
Definition: los_task.c:295
LOS_DL_LIST childrenList
LOS_DL_LIST processList
函数调用图:
这是这个函数的调用关系图:

◆ OsUserInitProcess()

UINT32 OsUserInitProcess ( VOID  )

在文件 los_process.c1746 行定义.

1747{
1748 UINT32 ret;
1749 UINT32 size;
1750 TSK_INIT_PARAM_S param = { 0 };
1751 VOID *stack = NULL;
1752
1753 LosProcessCB *processCB = OS_PCB_FROM_PID(g_userInitProcess);
1754 ret = OsProcessCreateInit(processCB, OS_USER_MODE, "Init");
1755 if (ret != LOS_OK) {
1756 return ret;
1757 }
1758
1759 ret = OsLoadUserInit(processCB);
1760 if (ret != LOS_OK) {
1761 goto ERROR;
1762 }
1763
1764 stack = OsUserInitStackAlloc(processCB, &size);
1765 if (stack == NULL) {
1766 PRINT_ERR("Alloc user init process user stack failed!\n");
1767 goto ERROR;
1768 }
1769
1771 param.userParam.userSP = (UINTPTR)stack + size;
1772 param.userParam.userMapBase = (UINTPTR)stack;
1773 param.userParam.userMapSize = size;
1774 param.uwResved = OS_TASK_FLAG_PTHREAD_JOIN;
1775 ret = OsUserInitProcessStart(processCB, &param);
1776 if (ret != LOS_OK) {
1777 (VOID)OsUnMMap(processCB->vmSpace, param.userParam.userMapBase, param.userParam.userMapSize);
1778 goto ERROR;
1779 }
1780
1781 return LOS_OK;
1782
1783ERROR:
1784 OsDeInitPCB(processCB);
1785 return ret;
1786}
STATIC VOID * OsUserInitStackAlloc(LosProcessCB *processCB, UINT32 *size)
Definition: los_process.c:1510
STATIC UINT32 OsUserInitProcessStart(LosProcessCB *processCB, TSK_INIT_PARAM_S *param)
用户进程开始初始化
Definition: los_process.c:1648
STATIC UINT32 OsLoadUserInit(LosProcessCB *processCB)
Definition: los_process.c:1681
STATIC VOID OsDeInitPCB(LosProcessCB *processCB)
Definition: los_process.c:672
UINTPTR __user_init_entry
第一个用户态进程(init)的入口地址 查看 LITE_USER_SEC_ENTRY
STATUS_T OsUnMMap(LosVmSpace *space, VADDR_T addr, size_t size)
UINT32 userMapSize
用户空间的栈大小,栈底 = userMapBase + userMapSize
Definition: los_task.h:494
UINTPTR userMapBase
用户空间的栈顶位置.
Definition: los_task.h:493
UINTPTR userSP
用户空间当前栈指针位置
Definition: los_task.h:492
TSK_ENTRY_FUNC pfnTaskEntry
Definition: los_task.h:504
UserTaskParam userParam
任务用户态运行时任何参数
Definition: los_task.h:517
UINT32 uwResved
Definition: los_task.h:513
函数调用图:

◆ OsWaitWakeTask()

VOID OsWaitWakeTask ( LosTaskCB taskCB,
UINT32  wakePID 
)

唤醒等待wakePID结束的任务

在文件 los_process.c326 行定义.

327{
328 taskCB->waitID = wakePID;
329 taskCB->ops->wake(taskCB);
330#ifdef LOSCFG_KERNEL_SMP
331 LOS_MpSchedule(OS_MP_CPU_ALL);//向所有cpu发送调度指令
332#endif
333}
VOID(* wake)(LosTaskCB *taskCB)
任务唤醒
UINTPTR waitID
函数调用图:
这是这个函数的调用关系图:

变量说明

◆ __user_init_bss

UINTPTR __user_init_bss
extern

查看 LITE_USER_SEC_BSS ,赋值由liteos.ld完成

◆ __user_init_end

UINTPTR __user_init_end
extern

init 进程的用户空间初始化结束地址

◆ __user_init_entry

UINTPTR __user_init_entry
extern

第一个用户态进程(init)的入口地址 查看 LITE_USER_SEC_ENTRY

◆ __user_init_load_addr

UINTPTR __user_init_load_addr
extern

init 进程的加载地址 ,由链接器赋值

◆ g_processCBArray

LosProcessCB* g_processCBArray
extern

进程池 OsProcessInit

进程池 OsProcessInit

在文件 los_process.c80 行定义.

◆ g_processMaxNum

UINT32 g_processMaxNum
extern

进程最大数量

进程最大数量

在文件 los_process.c86 行定义.