SylixOS異常管理

異常管理

  SylixOS提供了一種平臺無關的異常管理方法。當系統產生了寫時拷貝、缺頁等MMU訪問失效異常或其餘種類異常時,SylixOS會在異常中構建異常處理線程執行陷阱,在異常退出後的任務上下文中進行異常處理,完成全部的頁面操做,若是操做失敗線程將自我銷燬。當爲缺頁中斷等通常異常時,陷阱執行完畢後,系統將回到剛剛訪問內存併產生異常的那條指令。其函數接口以下所示。函數

LW_API 
VOID  API_VmmAbortIsr (addr_t           ulRetAddr, 
                           addr_t           ulAbortAddr, 
                           PLW_VMM_ABORT   pabtInfo, 
                           PLW_CLASS_TCB   ptcb);

函數API_VmmAbortIsr原型分析:線程

  1. 此函數無返回;
  2. 參數ulRetAddr是異常返回地址;
  3. 參數ulAbortAddr是異常地址;
  4. 參數pabtInfo是異常類型;
  5. 參數ptcb是出現異常的線程控制塊;

  API_VmmAbortIsr函數的主要內容即是處理MMU訪問失效異常,也就一般所說的缺頁中斷。該函數的通常處理流程以下所示:code

  1. 致命錯誤探測;
  2. 推展溢出檢查;
  3. 異常信息構建和現場保存,包括異常時的上下文;
  4. 缺頁處理陷阱外殼環境創建;
  5. FP保存;
  6. FPU、DSP上下文保存。

  其中缺頁處理陷阱外殼的創建是經過修改異常上下文的任務入口、入口參數以及堆棧起點實現的,以下所示。陷阱程序的入口函數爲__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);

  陷阱程序的具體執行過程將在後續介紹。原型

相關文章
相關標籤/搜索