提交 2912d9b4 编写于 作者: 鸿蒙内核源码分析's avatar 鸿蒙内核源码分析

任务的内核态和用户态栈空间注释

搜索 @note_pic 可以查看全部字符图
搜索 @note_why 是注者尚未看明白的地方,如果您看明白了,请告诉注者完善
搜索 @note_thinking 是注者的思考和吐槽的地方
上级 3759e9fe
......@@ -46,8 +46,8 @@ STATIC INLINE VOID OsSetCurrCpuSp(UINTPTR regSp)
}
#define OS_SYSTEM_NORMAL 0 //当前CPU都处于空闲状态
#define OS_SYSTEM_EXC_CURR_CPU 1 //当前CPU处于执行状态
#define OS_SYSTEM_EXC_OTHER_CPU 2 //其他CPU处于执行状态
#define OS_SYSTEM_EXC_CURR_CPU 1 //当前CPU处于异常状态
#define OS_SYSTEM_EXC_OTHER_CPU 2 //其他CPU处于异常状态
extern UINT32 OsGetSystemStatus(VOID);
extern VOID BackTraceSub(UINTPTR regFP);
......
......@@ -78,7 +78,7 @@ STATIC UINTPTR g_maxAddr;
STATIC UINT32 g_currHandleExcCpuID = INVALID_CPUID;
VOID OsExcHook(UINT32 excType, ExcContext *excBufAddr, UINT32 far, UINT32 fsr);
UINT32 g_curNestCount[LOSCFG_KERNEL_CORE_NUM] = { 0 };//
BOOL g_excFromUserMode[LOSCFG_KERNEL_CORE_NUM];//记录CPU core 是否在用户态运行
BOOL g_excFromUserMode[LOSCFG_KERNEL_CORE_NUM];//记录CPU core 异常来自用户态
STATIC EXC_PROC_FUNC g_excHook = (EXC_PROC_FUNC)OsExcHook;//全局异常处理钩子
#if (LOSCFG_KERNEL_SMP == YES)
STATIC SPIN_LOCK_INIT(g_excSerializerSpin);//初始化异常系列化自旋锁
......@@ -183,7 +183,7 @@ STATIC INT32 OsDecodeDataFSR(UINT32 regDFSR)
ret = OsDecodeFS(bitsFS);
return ret;
}
//共享页缺失
//共享页缺失异常
UINT32 OsArmSharedPageFault(UINT32 excType, ExcContext *frame, UINT32 far, UINT32 fsr)
{
PRINT_INFO("page fault entry!!!\n");
......@@ -274,12 +274,12 @@ STATIC VOID OsExcSysInfo(UINT32 excType, const ExcContext *excBufAddr)
runProcess->vmSpace->base + runProcess->vmSpace->size,
runTask->taskName,
runTask->taskID);
if (OsProcessIsUserMode(runProcess)) {
PrintExcInfo("task user stack = 0x%08x -> 0x%08x\n",
//这里可以看出一个任务有两个运行栈空间
if (OsProcessIsUserMode(runProcess)) {//用户态栈空间,对于栈而言,栈底的地址要小于栈顶的地址
PrintExcInfo("task user stack = 0x%08x -> 0x%08x\n", //用户态栈空间由用户空间提供
runTask->userMapBase, runTask->userMapBase + runTask->userMapSize);
} else {
PrintExcInfo("task kernel stack = 0x%08x -> 0x%08x\n",
} else {//内核态栈空间,由内核空间提供
PrintExcInfo("task kernel stack = 0x%08x -> 0x%08x\n",//
runTask->topOfStack, runTask->topOfStack + runTask->stackSize);
}
......@@ -518,7 +518,8 @@ STATIC VOID OsUserExcHandle(ExcContext *excBufAddr)
g_intCount[currCpu]++;
PrintExcInfo("User mode exception ends unscheduled!\n");
}
//此函数用于验证fp或验证检查开始和结束范围
//sp是上级函数即调用者的堆栈首地址,fp是上级函数的堆栈结束地址
/* this function is used to validate fp or validate the checking range start and end. */
STATIC INLINE BOOL IsValidFP(UINTPTR regFP, UINTPTR start, UINTPTR end, vaddr_t *vaddr)
{
......@@ -559,7 +560,7 @@ STATIC INLINE BOOL FindSuitableStack(UINTPTR regFP, UINTPTR *start, UINTPTR *end
const StackInfo *stack = NULL;
vaddr_t kvaddr;
if (g_excFromUserMode[ArchCurrCpuid()] == TRUE) {
if (g_excFromUserMode[ArchCurrCpuid()] == TRUE) {//当前CPU在用户态执行发生异常
taskCB = OsCurrTaskGet();
stackStart = taskCB->userMapBase;
stackEnd = taskCB->userMapBase + taskCB->userMapSize;
......@@ -656,17 +657,17 @@ VOID BackTraceSub(UINTPTR regFP)
}
}
}
//回溯追踪
VOID BackTrace(UINT32 regFP)
{
PrintExcInfo("*******backtrace begin*******\n");
BackTraceSub(regFP);
}
//运行初始化
//异常初始化
VOID OsExcInit(VOID)
{
OsExcStackInfoReg(g_excStack, sizeof(g_excStack) / sizeof(g_excStack[0]));//内核栈信息注册
OsExcStackInfoReg(g_excStack, sizeof(g_excStack) / sizeof(g_excStack[0]));//异常模式下注册内核栈信息
}
//由注册后回调
VOID OsExcHook(UINT32 excType, ExcContext *excBufAddr, UINT32 far, UINT32 fsr)
......
......@@ -63,10 +63,10 @@ typedef struct {
UINT64 SPSR;
} ExcContext;
#else
typedef struct {
UINT32 USP; /**< User mode stack pointer *///用户模式下栈指针
UINT32 ULR; /**< User mode program returning address *///用户模式下程序返回地址
UINT32 regCPSR; /**< Current program status register (CPSR) *///当前程序状态寄存器
typedef struct { //异常上下文,任务被中断需切换上下文,就是一种异常
UINT32 USP; /**< User mode stack pointer */ //用户态下的栈指针
UINT32 ULR; /**< User mode program returning address */ //用户态下程序返回地址
UINT32 regCPSR; /**< Current program status register (CPSR) */ //当前程序状态寄存器
UINT32 R0; /**< Register R0 */
UINT32 R1; /**< Register R1 */
UINT32 R2; /**< Register R2 */
......@@ -80,9 +80,9 @@ typedef struct {
UINT32 R10; /**< Register R10 */
UINT32 R11; /**< Register R11 */
UINT32 R12; /**< Register R12 */
UINT32 SP; /**< Stack pointer */
UINT32 LR; /**< Program returning address. */
UINT32 PC; /**< PC pointer of the exceptional function */
UINT32 SP; /**< Stack pointer */ //内核态下栈指针
UINT32 LR; /**< Program returning address. */ //用户态下程序返回地址
UINT32 PC; /**< PC pointer of the exceptional function */ //异常函数的PC位置
} ExcContext;
#endif
......@@ -93,11 +93,11 @@ typedef struct {
* Description: exception information stored when an exception occurs on an LPC2458 platform.
*
*/
typedef struct {
typedef struct {//异常信息结构体
UINT16 phase; /**< Phase in which an exception occurs *///异常发生的阶段
UINT16 type; /**< Exception type *///异常类型
UINT16 nestCnt; /**< Count of nested exception *///嵌套异常计数
UINT16 reserved; /**< Reserved for alignment */
UINT16 reserved; /**< Reserved for alignment */ //为对齐而保留
ExcContext *context; /**< Hardware context when an exception occurs *///异常发生时的硬件上下文
} ExcInfo;
......@@ -117,7 +117,7 @@ typedef struct {
* los_exc.h: the header file that contains the API declaration.
* @see None.
*/
STATIC INLINE UINTPTR Get_Fp(VOID)
STATIC INLINE UINTPTR Get_Fp(VOID)//内核FP寄存器地址获取函数
{
UINTPTR regFp;
......
......@@ -492,7 +492,7 @@ LITE_OS_SEC_TEXT_INIT STATIC UINT32 OsTaskCreateParamCheck(const UINT32 *taskID,
{
LosProcessCB *process = NULL;
UINT32 poolSize = OS_SYS_MEM_SIZE;
*pool = (VOID *)m_aucSysMem1;
*pool = (VOID *)m_aucSysMem1;//默认使用
if (taskID == NULL) {
return LOS_ERRNO_TSK_ID_INVALID;
......@@ -521,7 +521,7 @@ LITE_OS_SEC_TEXT_INIT STATIC UINT32 OsTaskCreateParamCheck(const UINT32 *taskID,
return LOS_ERRNO_TSK_PRIOR_ERROR;
}
#ifdef LOSCFG_EXC_INTERACTION
#ifdef LOSCFG_EXC_INTERACTION
if (!OsExcInteractionTaskCheck(initParam)) {
*pool = m_aucSysMem0;
poolSize = OS_EXC_INTERACTMEM_SIZE;
......@@ -690,8 +690,8 @@ LITE_OS_SEC_TEXT_INIT STATIC VOID OsTaskCBInitBase(LosTaskCB *taskCB,
taskCB->args[1] = initParam->auwArgs[1];
taskCB->args[2] = initParam->auwArgs[2];
taskCB->args[3] = initParam->auwArgs[3];
taskCB->topOfStack = (UINTPTR)topStack;
taskCB->stackSize = initParam->uwStackSize;
taskCB->topOfStack = (UINTPTR)topStack; //内核态栈顶位置
taskCB->stackSize = initParam->uwStackSize;//
taskCB->priority = initParam->usTaskPrio;
taskCB->taskEntry = initParam->pfnTaskEntry;
taskCB->signal = SIGNAL_NONE;
......@@ -809,14 +809,14 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_TaskCreateOnly(UINT32 *taskID, TSK_INIT_PARAM_S
if (errRet != LOS_OK) {
goto LOS_ERREND_REWIND_TCB;
}
//OsTaskStackAlloc 只在LOS_TaskCreateOnly中被调用,此处是分配任务在内核态栈空间
OsTaskStackAlloc(&topStack, initParam->uwStackSize, pool);//为任务栈分配空间
if (topStack == NULL) {
errRet = LOS_ERRNO_TSK_NO_MEMORY;
goto LOS_ERREND_REWIND_SYNC;
}
stackPtr = OsTaskStackInit(taskCB->taskID, initParam->uwStackSize, topStack, TRUE);//初始化上下文
stackPtr = OsTaskStackInit(taskCB->taskID, initParam->uwStackSize, topStack, TRUE);//初始化任务栈
errRet = OsTaskCBInit(taskCB, initParam, stackPtr, topStack);//初始化TCB,包括绑定进程等操作
if (errRet != LOS_OK) {
goto LOS_ERREND_TCB_INIT;
......
......@@ -314,9 +314,9 @@ STATIC INLINE BOOL OsProcessIsDead(const LosProcessCB *processCB)//查下进程
#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);
}
......
......@@ -695,7 +695,7 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsMemSystemInit(UINTPTR memStart)
return ret;
}
#ifdef LOSCFG_MEM_LEAKCHECK
#ifdef LOSCFG_MEM_LEAKCHECK //内存泄漏开关
STATIC INLINE VOID OsMemLinkRegisterRecord(LosMemDynNode *node)
{
UINT32 count = 0;
......
git add -A
git commit -m '多处理器支持和异常处理部分代码注释
git commit -m '任务的内核态和用户态栈空间注释
搜索 @note_pic 可以查看全部字符图
搜索 @note_why 是注者尚未看明白的地方,如果您看明白了,请告诉注者完善
搜索 @note_thinking 是注者的思考和吐槽的地方
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册