Panic是Linux kernel提供的一種複位機制,核心開發者在開發過程中,可以在異常流程中主動調用。
另外,還有一部分子產品或者子系統,希望系統在panic時,能主動通知一下本子產品,以便做一些複位前的準備動作,相應的kernel也提供了該機制,就是讓大家注冊回調。每次panic在執行過程中,會周遊注冊的回調函數并回調之。
實作機制:
1、在panic.c代碼中,有一個連結清單的定義,
ATOMIC_NOTIFIER_HEAD(panic_notifier_list);
EXPORT_SYMBOL(panic_notifier_list);
該連結清單存儲各個子產品注冊的panic回調函數,以便panic在發生時回調對應回調函數。
2、有了連結清單頭,那麼注冊就簡單了。
1)首先定義自己的回調函數
int my_panic_ notify(struct notifier_block *nb,
unsigned long event, void *buf)
{
………
return 0;
}
static struct notifier_block my_panic_block = {
.notifier_call = my_panic_ notify,
.priority = INT_MAX,
};
然後,在合适的地方,注冊到panic連結清單中(通常是在本子產品初始化)
………….
atomic_notifier_chain_register(&panic_notifier_list, & my_panic_block);
…………
3、注冊完成後,當系統中有調用panic函數時,panic在執行過程中就會回調注冊的函數。
…………..
atomic_notifier_call_chain(&panic_notifier_list, 0, buf);
…………….
附:同樣,在die函數被調用時,也有類似的機制,不做詳細介紹,大家可以看一下register_die_notifier/ unregister_die_notifier的相關實作。
未定義指令異常,參考register_undef_hook函數相關實作