亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

http://www.linuxidc.com/Linux/2013-07/86999.htm

2019-11-07 23:55:29
字體:
來源:轉載
供稿:網友

內核通知鏈

1.1. 概述

linux內核中各個子系統相互依賴,當其中某個子系統狀態發生改變時,就必須使用一定的機制告知使用其服務的其他子系統,以便其他子系統采取相應的措施。為滿足這樣的需求,內核實現了事件通知鏈機制(notificationchain)。

通知鏈只能用在各個子系統之間,而不能在內核和用戶空間進行事件的通知。組成內核的核心系統代碼均位于kernel目錄下,通知鏈表位于kernel/notifier.c中,對應的頭文件為include/linux/notifier.h。通知鏈表機制并不復雜,實現它的代碼只有區區幾百行。

事件通知鏈表是一個事件處理函數的列表,每個通知鏈都與某個或某些事件有關,當特定的事件發生時,就調用相應的事件通知鏈中的回調函數,進行相應的處理。

推薦閱讀:

Linux內核驅動開發之KGDB原理介紹及kgdboe方式配置 http://www.linuxidc.com/Linux/2013-06/86406.htm

Linux內核中memcpy和memmove函數的區別和實現 http://www.linuxidc.com/Linux/2013-06/85344.htm

 

圖 1 內核通知鏈

1.2.數據結構

如圖 1中所示,Linux的網絡子系統一共有3個通知鏈:表示ipv4地址發生變化時的inetaddr_chain;表示ipv6地址發生變化的inet6addr_chain;還有表示設備注冊、狀態變化的netdev_chain。

在這些鏈中都是一個個notifier_block結構:

struct notifier_block {      int (*notifier_call)(struct notifier_block *, unsigned long, void *);      struct notifier_block *next;      int PRiority;};

其中,

1. notifier_call:當相應事件發生時應該調用的函數,由被通知方提供,如other_subsys_1;

2. notifier_block *next:用于鏈接成鏈表的指針;

3. priority:回調函數的優先級,一般默認為0。

內核代碼中一般把通知鏈命名為xxx_chain, xxx_nofitier_chain這種形式的變量名。圍繞核心數據結構notifier_block,內核定義了四種通知鏈類型:

1. 原子通知鏈( Atomic notifier chains ):通知鏈元素的回調函數(當事件發生時要執行的函數)在中斷或原子操作上下文中運行,不允許阻塞。對應的鏈表頭結構:

struct atomic_notifier_head {        spinlock_t  lock;        struct  notifier_block *head;};

2. 可阻塞通知鏈( Blocking notifier chains ):通知鏈元素的回調函數在進程上下文中運行,允許阻塞。對應的鏈表頭:

struct  blocking_notifier_head {        struct  rw_semaphore  rwsem;        struct  notifier_block  *head;};

3. 原始通知鏈( Raw notifierchains ):對通知鏈元素的回調函數沒有任何限制,所有鎖和保護機制都由調用者維護。對應的鏈表頭:

 

網絡子系統就是該類型,通過以下宏實現head的初始化

static RAW_NOTIFIER_HEAD(netdev_chain);#define RAW_NOTIFIER_INIT(name)    {      /              .head= NULL }#define RAW_NOTIFIER_HEAD(name)        /      //調用他就好了struct raw_notifier_head name =        /                    RAW_NOTIFIER_INIT(name)  即:struct raw_notifier_head netdev_chain = {          .head = NULL;}

而其回調函數的注冊,比如向netdev_chain的注冊函數:register_netdevice_notifier。

struct  raw_notifier_head {        struct  notifier_block  *head;};

4. SRCU 通知鏈( SRCU notifier chains ):可阻塞通知鏈的一種變體。對應的鏈表頭:

struct  srcu_notifier_head {        struct  mutex mutex;        struct  srcu_struct  srcu;        struct  notifier_block  *head;};

1.3. 運行機理

 

被通知一方(other_subsys_x)通過notifier_chain_register向特定的chain注冊回調函數,并且一般而言特定的子系統會用特定的notifier_chain_register包裝函數來注冊,比如路由子系統使用的是網絡子系統的:register_netdevice_notifier來注冊他的notifier_block。

1.3.1. 向事件通知鏈注冊的步驟

1. 申明struct notifier_block結構

2. 編寫notifier_call函數

3. 調用特定的事件通知鏈的注冊函數,將notifier_block注冊到通知鏈中

如果內核組件需要處理夠某個事件通知鏈上發出的事件通知,其就該在初始化時在該通知鏈上注冊回調函數。

1.3.2. 通知子系統有事件發生

inet_subsys是通過notifier_call_chain來通知其他的子系統(other_subsys_x)的。

notifier_call_chain會按照通知鏈上各成員的優先級順序執行回調函數(notifier_call_x);回調函數的執行現場在notifier_call_chain進程地址空間;其返回值是NOTIFY_XXX的形式,在include/linux/notifier.h中:

#define NOTIFY_DONE            0x0000        /* 對事件視而不見 */#define NOTIFY_OK          0x0001        /* 事件正確處理 */#define NOTIFY_STOP_MASK  0x8000        /*由notifier_call_chain檢查,看繼續調用回調函數,還是停止,_BAD和_STOP中包含該標志 */#define NOTIFY_BAD        (NOTIFY_STOP_MASK|0x0002)      /*事件處理出錯,不再繼續調用回調函數 *//* *Clean way to return from the notifier and stop further calls. */#define NOTIFY_STOP            (NOTIFY_OK|NOTIFY_STOP_MASK)    /*  回調出錯,不再繼續調用該事件回調函數 */

notifier_call_chain捕獲并返回最后一個事件處理函數的返回值;注意:notifier_call_chain可能同時被不同的cpu調用,故而調用者必須保證互斥。

1.3.3. 事件列表

對于網絡子系統而言,其事件常以NETDEV_XXX命名;描述了網絡設備狀態(dev->flags)、傳送隊列狀態(dev->state)、設備注冊狀態(dev->reg_state),以及設備的硬件功能特性(dev->features):

include/linux/notifier.h中

/* netdevice notifier chain */#define NETDEV_UP  0x0001  /* 激活一個網絡設備 */#define NETDEV_DOWN  0x0002f /* 停止一個網絡設備,所有對該設備的引用都應釋放 */#define NETDEV_REBOOT      0x0003      /* 檢查到網絡設備接口硬件崩潰,硬件重啟 */#define NETDEV_CHANGE      0x0004  /* 網絡設備的數據包隊列狀態發生改變 */#define NETDEV_REGISTER  0x0005  /*一個網絡設備事例注冊到系統中,但尚未激活 */#define NETDEV_UNREGISTER      0x0006      /*網絡設備驅動已卸載 */#define NETDEV_CHANGEMTU      0x0007  /*MTU發生了改變 */#define NETDEV_CHANGEADDR    0x0008  /*硬件地址發生了改變 */#define NETDEV_GOING_DOWN  0x0009  /*網絡設備即將注銷,有dev->close報告,通知相關子系統處理 */#define NETDEV_CHANGENAME  0x000A  /*網絡設備名改變 */#define NETDEV_FEAT_CHANGE    0x000B  /*feature網絡硬件功能改變 */#define NETDEV_BONDING_FAILOVER 0x000C  /*    */#define NETDEV_PRE_UP        0x000D  /*    */#define NETDEV_BONDING_OLDTYPE  0x000E              /*    */#define NETDEV_BONDING_NEWTYPE  0x000F      /*    */


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
午夜精品一区二区三区视频免费看| 亚洲第一偷拍网| 成人免费看吃奶视频网站| xvideos成人免费中文版| 久久网福利资源网站| 久久精品91久久香蕉加勒比| 另类美女黄大片| 中文字幕日韩欧美| 在线观看视频99| 精品国产区一区二区三区在线观看| 欧美成人免费小视频| 日韩高清有码在线| 97福利一区二区| 日本一区二区三区在线播放| 欧美一区二粉嫩精品国产一线天| 国内精品久久久久影院优| 欧美久久精品一级黑人c片| 91色精品视频在线| 精品国产一区二区三区在线观看| 亚洲欧美激情一区| 日韩亚洲成人av在线| 欧美在线激情网| 日韩免费视频在线观看| 日韩免费视频在线观看| 久久综合伊人77777尤物| 国产欧美精品在线播放| 亚洲美女久久久| 国产伦精品一区二区三区精品视频| 97成人精品区在线播放| 亚洲国产精品免费| 色综合久久久久久中文网| 久久97精品久久久久久久不卡| 91精品国产高清久久久久久| 992tv在线成人免费观看| 在线看日韩av| 成人福利网站在线观看11| 最近2019中文免费高清视频观看www99| 亚洲日本中文字幕免费在线不卡| 国产精品18久久久久久首页狼| 中文字幕亚洲欧美日韩2019| 91av在线播放视频| 中文字幕亚洲欧美日韩2019| 国产精品一区二区性色av| 欧美成人精品激情在线观看| 国产一区二区三区直播精品电影| 国产精品一二三视频| 亚洲自拍高清视频网站| 久久久久久久一| 九九热精品在线| 日韩在线www| 欧美高清自拍一区| 一区二区三区视频观看| 在线观看亚洲视频| 亚洲欧美一区二区激情| 国产精品a久久久久久| 欧美乱妇高清无乱码| 高清一区二区三区日本久| 91视频8mav| 欧美日韩在线视频观看| 国产精品精品国产| 日产精品99久久久久久| 欧美理论在线观看| 国产一区二区日韩| www.日本久久久久com.| 国产亚洲精品久久久优势| 亚洲精品国产精品自产a区红杏吧| 久久久国产一区| 欧美性xxxxhd| 色多多国产成人永久免费网站| 国产精品99一区| 原创国产精品91| 91成人在线播放| 91性高湖久久久久久久久_久久99| 91九色在线视频| 亚洲v日韩v综合v精品v| 中文字幕日韩欧美在线视频| 久久久亚洲影院你懂的| 久久精品久久久久久国产 免费| 欧美精品手机在线| 亚洲国产99精品国自产| 国产综合视频在线观看| 国产欧美久久久久久| 日本韩国欧美精品大片卡二| 久久手机免费视频| 亚洲欧美中文日韩在线v日本| 欧美美最猛性xxxxxx| 国产一区二区成人| 国产在线视频欧美| 亚洲国产欧美一区二区三区同亚洲| 在线视频欧美日韩| 色久欧美在线视频观看| 亚洲欧美一区二区三区在线| 欧美人与物videos| 精品二区三区线观看| 国产精品久久久久久亚洲影视| 成人福利在线观看| 国内精品在线一区| 亚洲精品福利视频| 久久人人97超碰精品888| 主播福利视频一区| 久久精品最新地址| 一道本无吗dⅴd在线播放一区| 亚洲精品国产精品国产自| 欧美视频一区二区三区…| 欧美影院成年免费版| 久久影视电视剧免费网站清宫辞电视| 国产精品99久久久久久久久久久久| 中文字幕一区日韩电影| 欧美一级视频免费在线观看| 精品国产一区久久久| 亚洲综合大片69999| 国产欧美一区二区三区久久| 亚洲www在线观看| 欧美精品福利在线| 疯狂做受xxxx欧美肥白少妇| 一本久久综合亚洲鲁鲁| 日韩在线激情视频| 亚洲美腿欧美激情另类| 午夜精品久久久久久99热软件| 国产欧美最新羞羞视频在线观看| 伊人伊成久久人综合网站| 国产有码在线一区二区视频| 欧美黄色三级网站| 亚洲va久久久噜噜噜久久天堂| 国内精品小视频在线观看| 国产va免费精品高清在线观看| 色婷婷综合久久久久中文字幕1| 在线观看成人黄色| 成人黄色短视频在线观看| 欧美寡妇偷汉性猛交| 在线视频国产日韩| 亚洲第一区中文99精品| 国产精品欧美风情| 性色av一区二区三区红粉影视| 久久久久久中文字幕| 欧美精品在线第一页| 国产美女久久久| 91精品国产综合久久久久久蜜臀| 日韩中文字幕视频在线观看| 91精品国产乱码久久久久久久久| 国产成人精品久久二区二区91| 欧美成人精品一区二区| 欧美高清在线视频观看不卡| 蜜臀久久99精品久久久无需会员| 91精品综合久久久久久五月天| 欧美亚洲国产视频小说| 欧美激情女人20p| 亚洲区中文字幕| 中文在线资源观看视频网站免费不卡| 久久久这里只有精品视频| 欧美精品福利在线| 久久婷婷国产麻豆91天堂| 亚洲欧美精品一区二区| 亚洲男人第一av网站| 国产一区二区av| 中文字幕一区电影| 久久人人看视频| 国产精品高清免费在线观看| 一个色综合导航| 亚洲欧洲日产国码av系列天堂| 国产精品中文字幕久久久| 久久综合88中文色鬼| 在线丨暗呦小u女国产精品| 国产精品第一视频|