linux内核中文注釋?linux内核使用通知鍊的機制在内核各子系統之間進行事件通知(注:無法用于内核态和用戶态之間的事件通知),今天小編就來說說關于linux内核中文注釋?下面更多詳細答案一起來看看吧!
linux内核使用通知鍊的機制在内核各子系統之間進行事件通知(注:無法用于内核态和用戶态之間的事件通知)。
一、通知鍊介紹在文件include/Linux/notifier.h中,可以查看Linux内核定義的四種通知鍊類型:
通知鍊類型 |
初始化 |
注冊函數 |
通知函數 |
Atomic notifier chains(原子通知鍊) |
ATOMIC_NOTIFIER_HEAD() |
atomic_notifier_chain_register()/ atomic_notifier_chain_unregister() |
atomic_notifier_call_chain() |
Blocking notifier chains(可阻塞通知鍊) |
BLOCKING_NOTIFIER_HEAD() |
blocking_notifier_chain_register()/ blocking_notifier_chain_unregister |
blocking_notifier_call_chain() |
Raw notifier chains(原始通知鍊) |
RAW_NOTIFIER_HEAD() |
raw_notifier_chain_register()/ raw_notifier_chain_unregister() |
raw_notifier_call_chain() |
SRCU notifier chains(SRCU通知鍊) |
srcu_init_notifier_head() |
srcu_notifier_chain_register()/ srcu_notifier_chain_unregister |
srcu_notifier_call_chain() |
說明:
1、原子通知鍊:通知鍊的回調函數在中斷或原子上下文中運行,不允許阻塞。
2、可阻塞通知鍊:通知鍊的回調函數在進程上下文中運行,允許堵塞。
3、原始通知鍊:對通知鍊的回調函數沒有限制,調用者維護鎖和保護。
4、SRCU通知鍊:阻塞通知鍊的一個變體。
二、通知鍊應用以系統睡眠喚醒為例,介紹可阻塞通知鍊的使用。
## kernel/power/main.c
## 1.初始化通知鍊pm_chain_head
static BLOCKING_NOTIFIER_HEAD(pm_chain_head);
## kernel/power/wakeup_reason.c
## 2.注冊通知鍊
## 2.1通知鍊回調函數實現
static int wakeup_reason_pm_event(struct notifier_block *notifier,
unsigned long pm_event, void *unused)
{
switch (pm_event) {
case PM_SUSPEND_PREPARE:
...
}
}
static struct notifier_block wakeup_reason_pm_notifier_block = {
.notifier_call = wakeup_reason_pm_event,
};
## 2.2注冊通知鍊
int __init wakeup_reason_init(void)
{
...
retval = register_pm_notifier(&wakeup_reason_pm_notifier_block);
....
}
int register_pm_notifier(struct notifier_block *nb)
{
return blocking_notifier_chain_register(&pm_chain_head, nb);
}
## kernel/power/suspend.c
## 3.通知
static int suspend_prepare(suspend_state_t state)
{
...
## 3.1 發送PM_SUSPEND_PREPARE通知時,調用.notifier_call()對應的wakeup_reason_pm_event()函數處理。
error = __pm_notifier_call_chain(PM_SUSPEND_PREPARE, -1, &nr_calls);
...
}
int __pm_notifier_call_chain(unsigned long val, int nr_to_call, int *nr_calls)
{
...
ret = __blocking_notifier_call_chain(&pm_chain_head, val, NULL,
nr_to_call, nr_calls);
...
}
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!