Native Linux的MCE基本原理和處理函數入口(基於kernel 4.2.0+ )__Oracle
來源:互聯網
上載者:User
在老的Intel處理器上,當硬體檢測到錯誤後,就會對系統的每個邏輯CPU廣播MCE. 這樣設計是因為硬體上的缺陷,因為原來的處理器當發現了錯誤(如記憶體錯誤),是會隨著pipeline流到任意的不可預測的CPU上去,導致系統的問題.基於這樣的硬體設計問題,就產生了將MCE廣播到整個系統所有CPU上去的策略,保證所有的CPU在發生錯誤的時候,同時陷入異常處理流程指導異常處理完成.這樣的消耗其實在多socket的情況下是很大的.這在後期的Intel處理器上得意解決,我在後面的部落格裡面再做介紹.
關於MCE請參考我的部落格 << Intel處理器中斷18 - Machine-Check Exception (#MC)介紹 >>
CPU收到MCE後,如果是本CPU產生的異常,那麼就進入到int 18的處理流程;如果不是本CPU產生的異常,那麼CPU進入忙等流程指導這個異常處理完畢.注意,這個異常是同步的,也就是說,當產生異常後,所有的CPU都會馬上進入異常處理,不會有任何的延遲和等待. 這個CPU忙等直到異常處理完畢的過程叫做CPU集合
在Native Linux上,MCE的檔案是arch/x86/kernel/cpu/mcheck/mce.c.
核心處理函數為: do_machine_check, 這個就是int 18的處理函數
在do_machine_check中會調用mce_start來進行CPU的集合
在mce_start中,如果不是本CPU,調用ndelay(SPINUNIT);進入忙等;如果是本CPU則從mce_start返回do_machine_check中進行處理
在do_machine_check後面,會進行錯誤severity等級的分級,如果很緊急,那麼直接在核心調用memory_failure來進行處理;如果不是很緊急,可以delay,那麼就會通過置位一個標誌位,然後通過notify通知.對於delay的,切換到進程上下文後,發現表職位,通過notfiy,處理函數為srao_decode_notifier , 然後調用memory_failure進行處理.