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