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訪問失效異常,也就一般所說的缺頁中斷。該函數的通常處理流程以下所示:code
其中缺頁處理陷阱外殼的創建是經過修改異常上下文的任務入口、入口參數以及堆棧起點實現的,以下所示。陷阱程序的入口函數爲__vmmAbortShell,異常消息做爲函數參數,堆棧直接使用任務的線程堆棧,而異常消息也保存在該堆棧中(API_VmmAbortIsr函數執行時使用的是CPU的中斷堆棧)。接口
#if LW_CFG_VMM_EN > 0 pstkFailShell = archTaskCtxCreate(&ptcb->TCB_archRegCtx, (PTHREAD_START_ROUTINE)__vmmAbortShell, (PVOID)pvmpagefailctx, (PLW_STACK)pucStkNow, 0); /* 創建缺頁處理陷阱外殼環境 */ #else pstkFailShell = 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);
陷阱程序的具體執行過程將在後續介紹。原型