天天看點

當panic或者die被執行時,或者發生未定義指令時,如何被回調到

    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函數相關實作

繼續閱讀