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