tft每日頭條

 > 生活

 > linux内核中文注釋

linux内核中文注釋

生活 更新时间:2024-09-28 04:28:32

linux内核中文注釋?linux内核使用通知鍊的機制在内核各子系統之間進行事件通知(注:無法用于内核态和用戶态之間的事件通知),今天小編就來說說關于linux内核中文注釋?下面更多詳細答案一起來看看吧!

linux内核中文注釋(Linux内核notifier機制)1

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每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved