42#ifdef LOSCFG_SECURITY_CAPABILITY
53 }
else if (ret == OS_KERNEL_PROCESS_GROUP) {
55 }
else if ((ret == OS_USER_PRIVILEGE_PROCESS_GROUP) && (pid != who)) {
68 bool needSched =
false;
71 if (OS_TID_CHECK_INVALID(tid)) {
75 if (priority > OS_TASK_PRIORITY_LOWEST) {
79 if ((policy != LOS_SCHED_FIFO) && (policy != LOS_SCHED_RR)) {
84 SCHEDULER_LOCK(intSave);
87 SCHEDULER_UNLOCK(intSave);
92 param.
policy = (policyFlag ==
true) ? policy : param.
policy;
95 SCHEDULER_UNLOCK(intSave);
98 if (needSched && OS_SCHEDULER_ACTIVE) {
115 unsigned int intSave;
120 if (OS_TID_CHECK_INVALID(
id)) {
125 SCHEDULER_LOCK(intSave);
128 SCHEDULER_UNLOCK(intSave);
133 SCHEDULER_UNLOCK(intSave);
148 if (prio < OS_USER_PROCESS_PRIORITY_HIGHEST) {
167 unsigned int intSave;
170 if (OS_TID_CHECK_INVALID(
id)) {
175 SCHEDULER_LOCK(intSave);
178 SCHEDULER_UNLOCK(intSave);
183 SCHEDULER_UNLOCK(intSave);
191 if (OS_PID_CHECK_INVALID(
id)) {
202 if (prio < OS_USER_PROCESS_PRIORITY_HIGHEST) {
238 if (policy != LOS_SCHED_RR) {
242 return OS_USER_PROCESS_PRIORITY_HIGHEST;
247 if (policy != LOS_SCHED_RR) {
251 return OS_USER_PROCESS_PRIORITY_LOWEST;
256 unsigned int intSave;
259 time_t timeSlice = 0;
268 if (OS_PID_CHECK_INVALID(pid)) {
275 processCB = OS_PCB_FROM_PID(pid);
278 SCHEDULER_LOCK(intSave);
281 SCHEDULER_UNLOCK(intSave);
287 taskCB->ops->schedParamGet(taskCB, ¶m);
288 if (param.
policy == LOS_SCHED_RR) {
294 SCHEDULER_UNLOCK(intSave);
296 timeSlice = timeSlice * OS_NS_PER_CYCLE;
297 tv.tv_sec = timeSlice / OS_SYS_NS_PER_SECOND;
298 tv.tv_nsec = timeSlice % OS_SYS_NS_PER_SECOND;
307int SysWait(
int pid, USER
int *status,
int options,
void *rusage)
311 return LOS_Wait(pid, status, (
unsigned int)options, NULL);
314int SysWaitid(idtype_t type,
int pid, USER siginfo_t *info,
int options,
void *rusage)
343 ret =
LOS_Waitid(truepid, info, (
unsigned int)options, NULL);
357 return OsClone(CLONE_VFORK, 0, 0);
380 }
else if (gid <= OS_USER_PRIVILEGE_PROCESS_GROUP) {
413#ifdef LOSCFG_SECURITY_CAPABILITY
417 SCHEDULER_LOCK(intSave);
419 SCHEDULER_UNLOCK(intSave);
428#ifdef LOSCFG_SECURITY_CAPABILITY
432 SCHEDULER_LOCK(intSave);
434 SCHEDULER_UNLOCK(intSave);
444 int realUserID, effUserID, saveUserID;
445#ifdef LOSCFG_SECURITY_CAPABILITY
446 unsigned int intSave;
448 SCHEDULER_LOCK(intSave);
452 SCHEDULER_UNLOCK(intSave);
479#ifdef LOSCFG_SECURITY_CAPABILITY
481 unsigned int intSave;
487 SCHEDULER_LOCK(intSave);
493 }
else if (user->
userID != uid) {
500 SCHEDULER_UNLOCK(intSave);
511#ifdef LOSCFG_SECURITY_CAPABILITY
514 if ((ruid < 0) && (ruid != -1)) {
518 if ((euid < 0) && (euid != -1)) {
522 if ((suid < 0) && (suid != -1)) {
532#ifdef LOSCFG_SECURITY_CAPABILITY
535 if ((ruid == -1) && (euid == -1) && (suid == -1)) {
545 if (((euid != -1) && (euid != ruid)) || ((suid != -1) && (suid != ruid))) {
549 }
else if (euid >= 0) {
550 if ((suid != -1) && (suid != euid)) {
558 if ((ruid != 0) || (euid != 0) || (suid != 0)) {
567#ifdef LOSCFG_SECURITY_CAPABILITY
570 if ((ruid != 0) || (euid != 0)) {
579#ifdef LOSCFG_SECURITY_CAPABILITY
581 unsigned int intSave;
590 SCHEDULER_LOCK(intSave);
596 for (count = 0; count < user->
groupNumber; count++) {
597 if (user->
groups[count] == oldGid) {
598 user->
groups[count] = gid;
603 }
else if (user->
gid != gid) {
610 SCHEDULER_UNLOCK(intSave);
625 int realGroupID, effGroupID, saveGroupID;
626#ifdef LOSCFG_SECURITY_CAPABILITY
627 unsigned int intSave;
629 SCHEDULER_LOCK(intSave);
633 SCHEDULER_UNLOCK(intSave);
658#ifdef LOSCFG_SECURITY_CAPABILITY
661 if ((rgid < 0) && (rgid != -1)) {
665 if ((egid < 0) && (egid != -1)) {
669 if ((sgid < 0) && (sgid != -1)) {
679#ifdef LOSCFG_SECURITY_CAPABILITY
682 if ((rgid == -1) && (egid == -1) && (sgid == -1)) {
692 if (((egid != -1) && (egid != rgid)) || ((sgid != -1) && (sgid != rgid))) {
696 }
else if (egid >= 0) {
697 if ((sgid != -1) && (sgid != egid)) {
706 if ((rgid != 0) || (egid != 0) || (sgid != 0)) {
715#ifdef LOSCFG_SECURITY_CAPABILITY
718 if ((rgid != 0) || (egid != 0)) {
730#ifdef LOSCFG_SECURITY_CAPABILITY
731static int SetGroups(
int listSize,
const int *safeList,
int size)
733 User *oldUser = NULL;
734 unsigned int intSave;
737 if (newUser == NULL) {
741 SCHEDULER_LOCK(intSave);
743 (VOID)memcpy_s(newUser,
sizeof(
User), oldUser,
sizeof(
User));
744 if (safeList != NULL) {
745 (VOID)memcpy_s(newUser->
groups, size *
sizeof(
int), safeList, size *
sizeof(
int));
747 if (listSize == size) {
748 newUser->
groups[listSize] = oldUser->
gid;
753 SCHEDULER_UNLOCK(intSave);
761 unsigned int intSave;
764 int *safeList = NULL;
765 unsigned int listSize;
767 SCHEDULER_LOCK(intSave);
769 SCHEDULER_UNLOCK(intSave);
771 listSize = groupCount *
sizeof(
int);
774 }
else if (list == NULL) {
776 }
else if (size < groupCount) {
781 if (safeList == NULL) {
785 SCHEDULER_LOCK(intSave);
787 SCHEDULER_UNLOCK(intSave);
791 groupCount = -EFAULT;
801#ifdef LOSCFG_SECURITY_CAPABILITY
810 }
else if (list == NULL) {
812 }
else if (size < groupCount) {
827#ifdef LOSCFG_SECURITY_CAPABILITY
832 int *safeList = NULL;
835 if ((size != 0) && (list == NULL)) {
839 if ((size < 0) || (size > OS_GROUPS_NUMBER_MAX)) {
843#ifdef LOSCFG_SECURITY_CAPABILITY
850 if (safeList == NULL) {
860 for (count = 0; count < size; count++) {
861 if (safeList[count] == gid) {
863 }
else if (safeList[count] < 0) {
870 ret =
SetGroups(listSize, safeList, size);
872 if (safeList != NULL) {
889 return OS_INVALID_VALUE;
893 if (joinable == TRUE) {
894 param.
uwResved = LOS_TASK_ATTR_JOINABLE;
896 param.
uwResved = LOS_TASK_STATUS_DETACHED;
904 unsigned int intSave;
912 SCHEDULER_LOCK(intSave);
921 SCHEDULER_UNLOCK(intSave);
932 unsigned int intSave;
935 if (OS_TID_CHECK_INVALID(taskID)) {
939 LosTaskCB *taskCB = OS_TCB_FROM_TID(taskID);
940 SCHEDULER_LOCK(intSave);
949 SCHEDULER_UNLOCK(intSave);
955 unsigned int intSave;
958 if (OS_TID_CHECK_INVALID(taskID)) {
962 SCHEDULER_LOCK(intSave);
964 SCHEDULER_UNLOCK(intSave);
978 unsigned int intSave;
981 if (OS_TID_CHECK_INVALID(taskID)) {
985 LosTaskCB *taskCB = OS_TCB_FROM_TID(taskID);
986 SCHEDULER_LOCK(intSave);
995 SCHEDULER_UNLOCK(intSave);
1022int SysFutex(
const unsigned int *uAddr,
unsigned int flags,
int val,
1023 unsigned int absTime,
const unsigned int *newUserAddr)
1025 if ((flags & FUTEX_MASK) == FUTEX_REQUEUE) {
1029 if ((flags & FUTEX_MASK) == FUTEX_WAKE) {
1046 if (OS_PID_CHECK_INVALID(
id)) {
1050 *processID = (
id == 0) ? (OS_TCB_FROM_TID(*taskID)->processID) : id;
1052 if (OS_TID_CHECK_INVALID(
id)) {
1056 *processID = OS_INVALID_VALUE;
1065 unsigned int processID;
1066 unsigned int taskID;
1067 unsigned int intSave;
1068 unsigned int cpuAffiMask;
1071 if (ret != LOS_OK) {
1075 SCHEDULER_LOCK(intSave);
1078 SCHEDULER_UNLOCK(intSave);
1083 if (ret != LOS_OK) {
1084 SCHEDULER_UNLOCK(intSave);
1085 if (ret == EINVAL) {
1092#ifdef LOSCFG_KERNEL_SMP
1093 cpuAffiMask = (
unsigned int)OS_TCB_FROM_TID(taskID)->cpuAffiMask;
1098 SCHEDULER_UNLOCK(intSave);
1100 if (ret != LOS_OK) {
1111 unsigned int processID;
1112 unsigned int taskID;
1113 unsigned int intSave;
1114 unsigned short currCpuMask;
1115 bool needSched = FALSE;
1117 if (cpuset > LOSCFG_KERNEL_CPU_MASK) {
1122 if (ret != LOS_OK) {
1128 if (ret != LOS_OK) {
1131 SCHEDULER_LOCK(intSave);
1133 SCHEDULER_UNLOCK(intSave);
1137 SCHEDULER_LOCK(intSave);
1139 if (ret != LOS_OK) {
1140 SCHEDULER_UNLOCK(intSave);
1141 if (ret == EINVAL) {
1149 SCHEDULER_UNLOCK(intSave);
1150 if (needSched && OS_SCHEDULER_ACTIVE) {
BOOL IsCapPermit(UINT32 capIndex)
VOID * LOS_MemAlloc(VOID *pool, UINT32 size)
从指定内存池中申请size长度的内存,注意这可不是从内核堆空间中申请内存
UINT8 * m_aucSysMem1
系统动态内存池地址的起始地址 @note_thinking 能否不要用 0,1来命名核心变量 ???
UINT32 LOS_MemFree(VOID *pool, VOID *ptr)
释放从指定动态内存中申请的内存
LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskDelete(UINT32 taskID)
Delete a task.
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskYield(VOID)
Change the scheduling sequence of tasks with the same priority.
VOID LOS_Schedule(VOID)
Trigger active task scheduling.
VOID *(* TSK_ENTRY_FUNC)(UINTPTR param1, UINTPTR param2, UINTPTR param3, UINTPTR param4)
Define the type of a task entrance function.
INT32 OsFutexWait(const UINT32 *userVaddr, UINT32 flags, UINT32 val, UINT32 absTime)
设置线程等待 | 向Futex表中插入代表被阻塞的线程的node
INT32 OsFutexRequeue(const UINT32 *userVaddr, UINT32 flags, INT32 wakeNumber, INT32 count, const UINT32 *newUserVaddr)
调整指定锁在Futex表中的位置
INT32 OsFutexWake(const UINT32 *userVaddr, UINT32 flags, INT32 wakeNumber)
唤醒一个被指定锁阻塞的线程
VOID LOS_MpSchedule(UINT32 target)
LITE_OS_SEC_TEXT INT32 OsGetProcessPriority(INT32 which, INT32 pid)
接口封装 - 获取进程优先级 which:标识进程,进程组,用户
LITE_OS_SEC_TEXT UINT32 OsGetUserInitProcessID(VOID)
获取用户态进程的根进程,所有用户进程都是g_processCBArray[g_userInitProcess] fork来的
LITE_OS_SEC_TEXT INT32 OsSetProcessScheduler(INT32 which, INT32 pid, UINT16 prio, UINT16 policy)
设置进程调度计划
LITE_OS_SEC_TEXT INT32 LOS_GetUserID(VOID)
LITE_OS_SEC_TEXT INT32 LOS_Waitid(INT32 pid, USER siginfo_t *info, UINT32 options, VOID *rusage)
LITE_OS_SEC_TEXT INT32 LOS_GetProcessScheduler(INT32 pid)
获得指定进程的调度策略
LITE_OS_SEC_TEXT INT32 LOS_GetGroupID(VOID)
LITE_OS_SEC_TEXT INT32 LOS_Wait(INT32 pid, USER INT32 *status, UINT32 options, VOID *rusage)
LITE_OS_SEC_TEXT INT32 LOS_GetProcessGroupID(UINT32 pid)
LITE_OS_SEC_TEXT VOID OsProcessThreadGroupDestroy(VOID)
LITE_OS_SEC_TEXT INT32 OsSetProcessGroupID(UINT32 pid, UINT32 gid)
LITE_OS_SEC_TEXT INT32 LOS_GetCurrProcessGroupID(VOID)
获取当前进程的组ID
LITE_OS_SEC_TEXT INT32 OsClone(UINT32 flags, UINTPTR sp, UINT32 size)
OsClone 进程克隆
LITE_OS_SEC_TEXT UINT32 LOS_GetCurrProcessID(VOID)
获取当前进程的进程ID
STATIC INLINE BOOL OsProcessIsInactive(const LosProcessCB *processCB)
进程不活跃函数定义:身上贴有不使用且不活跃标签的进程
STATIC INLINE User * OsCurrUserGet(VOID)
STATIC INLINE LosProcessCB * OsCurrProcessGet(VOID)
STATIC INLINE LosTaskCB * OsCurrTaskGet(VOID)
STATIC INLINE BOOL OsTaskIsInactive(const LosTaskCB *taskCB)
LITE_OS_SEC_TEXT BOOL OsTaskCpuAffiSetUnsafe(UINT32 taskID, UINT16 newCpuAffiMask, UINT16 *oldCpuAffiMask)
CPU亲和性(affinity)将任务绑在指定CPU上,用于多核CPU情况,(该函数仅在SMP模式下支持)
LITE_OS_SEC_TEXT UINT32 OsTaskJoinPendUnsafe(LosTaskCB *taskCB)
挂起任务,任务进入等待链表,Join代表是支持通过一个任务去唤醒其他的任务
INT32 OsUserTaskOperatePermissionsCheck(const LosTaskCB *taskCB)
LITE_OS_SEC_TEXT UINT32 OsTaskSetDetachUnsafe(LosTaskCB *taskCB)
任务设置分离模式 Deatch和JOIN是一对有你没我的状态
LITE_OS_SEC_TEXT VOID OsRunningTaskToExit(LosTaskCB *runTask, UINT32 status)
LITE_OS_SEC_TEXT_INIT UINT32 OsCreateUserTask(UINT32 processID, TSK_INIT_PARAM_S *initParam)
创建一个用户态任务
STATIC INLINE BOOL LOS_IsUserAddress(VADDR_T vaddr)
虚拟地址是否在用户空间
static int OsUserTaskSchedulerSet(unsigned int tid, unsigned short policy, unsigned short priority, bool policyFlag)
设置用户级任务调度信息
int SysGetProcessGroupID(unsigned int pid)
获取指定进程的组ID,为0时返回当前进程ID
void SysUserExitGroup(int status)
int SysGetCurrProcessGroupID(void)
获取当前进程组ID
int SysGetRealEffSaveGroupID(int *rgid, int *egid, int *sgid)
int SysSchedGetPriorityMin(int policy)
int SysThreadJoin(unsigned int taskID)
static int OsPermissionToCheck(unsigned int pid, unsigned int who)
static int GetGroups(int size, int list[])
int SysGetRealEffSaveUserID(int *ruid, int *euid, int *suid)
int SysSetGroupID(int gid)
int SysSchedGetAffinity(int id, unsigned int *cpuset, int flag)
static int SetRealEffSaveGroupIDCheck(int rgid, int egid, int sgid)
unsigned int SysCreateUserThread(const TSK_ENTRY_FUNC func, const UserTaskParam *userParam, bool joinable)
int SysSetThreadArea(const char *area)
int SysSchedSetParam(int id, unsigned int prio, int flag)
int SysSetGroups(int size, const int list[])
int SysGetProcessPriority(int which, int who)
int SysSchedSetScheduler(int id, int policy, int prio, int flag)
unsigned int SysGetPPID(void)
int SysSchedGetParam(int id, int flag)
int SysSetRealEffSaveUserID(int ruid, int euid, int suid)
static int SetRealEffSaveUserIDCheck(int ruid, int euid, int suid)
static int SchedAffinityParameterPreprocess(int id, int flag, unsigned int *taskID, unsigned int *processID)
unsigned int SysGetTid(void)
获取当前任务ID
void SysSchedYield(int type)
int SysFutex(const unsigned int *uAddr, unsigned int flags, int val, unsigned int absTime, const unsigned int *newUserAddr)
SysFutex 操作用户态快速互斥锁 系统调用
char * SysGetThreadArea(void)
int SysWaitid(idtype_t type, int pid, USER siginfo_t *info, int options, void *rusage)
int SysGetUserID(void)
获取用户ID
int SysGetEffUserID(void)
int SysUserThreadDetach(unsigned int taskID)
unsigned int SysGetPID(void)
int SysSetRealEffSaveGroupID(int rgid, int egid, int sgid)
int SysSetRealEffUserID(int ruid, int euid)
int SysWait(int pid, USER int *status, int options, void *rusage)
int SysSetUserID(int uid)
static int SetGroups(int listSize, const int *safeList, int size)
int SysSchedGetPriorityMax(int policy)
int SysSetRealEffGroupID(int rgid, int egid)
int SysSchedSetAffinity(int id, const unsigned short cpuset, int flag)
int SysGetGroups(int size, int list[])
int SysSchedGetScheduler(int id, int flag)
int SysSchedRRGetInterval(int pid, struct timespec *tp)
int SysSetProcessPriority(int which, int who, unsigned int prio)
void SysThreadExit(int status)
int SysUserThreadSetDetach(unsigned int taskID)
int SysSetProcessGroupID(unsigned int pid, unsigned int gid)
为指定进程设置进程组ID
LOS_DL_LIST threadSiblingList
BOOL(* schedParamModify)(LosTaskCB *taskCB, const SchedParam *param)
修改调度参数
UINT32(* schedParamGet)(const LosTaskCB *taskCB, SchedParam *param)
获取调度参数
UINTPTR userArea
用户空间的堆区开始位置
UINT32 userID
用户ID [0,60000],0为root用户
UINT32 gid
用户组ID [0,60000],0为root用户组
TSK_ENTRY_FUNC pfnTaskEntry
UserTaskParam userParam
任务用户态运行时任何参数
ARG_NUM_3 ARG_NUM_1 ARG_NUM_2 ARG_NUM_2 ARG_NUM_3 ARG_NUM_1 ARG_NUM_4 ARG_NUM_2 ARG_NUM_2 ARG_NUM_5 ARG_NUM_2 ARG_NUM_0 ARG_NUM_2 ARG_NUM_1 ARG_NUM_2 ARG_NUM_3 ARG_NUM_7 ARG_NUM_2 ARG_NUM_3 ARG_NUM_2 ARG_NUM_4 ARG_NUM_5 ARG_NUM_6 ARG_NUM_3 ARG_NUM_5 ARG_NUM_7 ARG_NUM_1 ARG_NUM_4 ARG_NUM_5 ARG_NUM_4 ARG_NUM_7 ARG_NUM_2 ARG_NUM_3 ARG_NUM_7 ARG_NUM_7 ARG_NUM_3 ARG_NUM_3 ARG_NUM_3 ARG_NUM_7 ARG_NUM_3 ARG_NUM_2 char ARG_NUM_2 ARG_NUM_1 ARG_NUM_0 ARG_NUM_0 ARG_NUM_3 void ARG_NUM_1 ARG_NUM_0 unsigned ARG_NUM_0 ARG_NUM_2 ARG_NUM_3 ARG_NUM_2 ARG_NUM_5 ARG_NUM_3 ARG_NUM_3 ARG_NUM_4 ARG_NUM_1 ARG_NUM_1 ARG_NUM_3 ARG_NUM_2 ARG_NUM_1 ARG_NUM_4 ARG_NUM_4 ARG_NUM_5 ARG_NUM_3 ARG_NUM_2 void ARG_NUM_6 unsigned ARG_NUM_0 unsigned ARG_NUM_0 ARG_NUM_3 ARG_NUM_3 ARG_NUM_2 ARG_NUM_2 ARG_NUM_1 ARG_NUM_2 ARG_NUM_1 char ARG_NUM_0 ARG_NUM_4 ARG_NUM_1 ARG_NUM_2 ARG_NUM_2 ARG_NUM_4 ARG_NUM_5 ARG_NUM_2 ARG_NUM_3 ARG_NUM_3 ARG_NUM_3 ARG_NUM_3 ARG_NUM_6 ARG_NUM_6 ARG_NUM_5 ARG_NUM_3 void ARG_NUM_3 ARG_NUM_3 ARG_NUM_5 ARG_NUM_1 unsigned ARG_NUM_3 long
ARG_NUM_3 ARG_NUM_1 ARG_NUM_2 ARG_NUM_2 ARG_NUM_3 ARG_NUM_1 ARG_NUM_4 ARG_NUM_2 ARG_NUM_2 ARG_NUM_5 ARG_NUM_2 void
size_t LOS_ArchCopyToUser(void *dst, const void *src, size_t len)
从内核空间拷贝到用户空间
size_t LOS_ArchCopyFromUser(void *dst, const void *src, size_t len)