SylixOS异常管理
2019獨角獸企業(yè)重金招聘Python工程師標準>>>
異常管理
SylixOS提供了一種平臺無關的異常管理方法。當系統(tǒng)產(chǎn)生了寫時拷貝、缺頁等MMU訪問失效異?;蚱渌N類異常時,SylixOS會在異常中構(gòu)建異常處理線程執(zhí)行陷阱,在異常退出后的任務上下文中進行異常處理,完成所有的頁面操作,如果操作失敗線程將自我銷毀。當為缺頁中斷等一般異常時,陷阱執(zhí)行完畢后,系統(tǒng)將回到剛剛訪問內(nèi)存并產(chǎn)生異常的那條指令。其函數(shù)接口如下所示。
LW_API VOID API_VmmAbortIsr (addr_t ulRetAddr, addr_t ulAbortAddr, PLW_VMM_ABORT pabtInfo, PLW_CLASS_TCB ptcb);函數(shù)API_VmmAbortIsr原型分析:
API_VmmAbortIsr函數(shù)的主要內(nèi)容便是處理MMU訪問失效異常,也就通常所說的缺頁中斷。該函數(shù)的一般處理流程如下所示:
其中缺頁處理陷阱外殼的建立是通過修改異常上下文的任務入口、入口參數(shù)以及堆棧起點實現(xiàn)的,如下所示。陷阱程序的入口函數(shù)為__vmmAbortShell,異常消息作為函數(shù)參數(shù),堆棧直接使用任務的線程堆棧,而異常消息也保存在該堆棧中(API_VmmAbortIsr函數(shù)執(zhí)行時使用的是CPU的中斷堆棧)。
#if LW_CFG_VMM_EN > 0pstkFailShell = archTaskCtxCreate(&ptcb->TCB_archRegCtx,(PTHREAD_START_ROUTINE)__vmmAbortShell,(PVOID)pvmpagefailctx,(PLW_STACK)pucStkNow,0); /* 建立缺頁處理陷阱外殼環(huán)境 */ #elsepstkFailShell = archTaskCtxCreate(&ptcb->TCB_archRegCtx,(PTHREAD_START_ROUTINE)__vmmAbortAccess,(PVOID)pvmpagefailctx,(PLW_STACK)pucStkNow,0); /* 建立訪問異常陷阱外殼環(huán)境 */ #endif由于產(chǎn)生缺頁中斷時,相關線程一定是就緒的,所以不需要進行調(diào)度器處理。當異常返回后,被修改的任務上下文將被直接恢復到CPU中,也就是說此時的CPU將直接運行陷阱函數(shù)。當陷阱函數(shù)執(zhí)行完之后,并不是普通的函數(shù)返回,而是直接從之前保存在錯誤消息中的任務上下文返回,如下所示。此時系統(tǒng)將回到剛剛訪問內(nèi)存產(chǎn)生異常的那條指令開始執(zhí)行。
__KERNEL_SPACE_SET(pvmpagefailctx->PAGEFCTX_iKernelSpace); /* 恢復成進入之前的狀態(tài) */errno = pvmpagefailctx->PAGEFCTX_iLastErrno; /* 恢復之前的 errno */iregInterLevel = KN_INT_DISABLE(); /* 關閉當前 CPU 中斷 */KN_SMP_MB();archSigCtxLoad(&pvmpagefailctx->PAGEFCTX_archRegCtx);/* 從 page fail 上下文中返回 */KN_INT_ENABLE(iregInterLevel);陷阱程序的具體執(zhí)行過程將在后續(xù)介紹。
轉(zhuǎn)載于:https://my.oschina.net/u/3248663/blog/2120700
總結(jié)
以上是生活随笔為你收集整理的SylixOS异常管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qq三国子女怎么获得 PC版官方网站
- 下一篇: 中国农业银行怎么取消短信服务费(《中国》