Android5.0 vold-注冊過程(下)

轉(zhuǎn)載請標(biāo)明出處:http://www.reibang.com/users/183339cdc7ae/latest_articles

概述

這篇文章主要講解的是市埋,kernel/drvier是如何通過netlink發(fā)送uevent到userspace的黎泣,以及netlink協(xié)議在kernel中的注冊過程

相關(guān)文章

Android5.0 vold-整體架構(gòu)
Android5.0 vold-啟動過程
Android5.0 vold-注冊過程(上)

NetlinkManager

由之前的文章可以知道,netlinkManager可以接受從kernel/drvier發(fā)送過來的uevent信息缤谎,這里我們來看下它是如何接受消息的

監(jiān)聽

當(dāng)native vold啟動的時候抒倚,會創(chuàng)建NetlinkManager,然后調(diào)用setupSocket方法
這里會使用socket這個接口來創(chuàng)建netlink,然后就可以接聽從kernel發(fā)過來的消息了
先假設(shè)大家都知道什么是netlinke坷澡,以及其使用方法. 不知道什么是netlink以及和socket區(qū)別的可以看這里,socket, netlink

NetlinkHandler *NetlinkManager::setupSocket(int *sock, int netlinkFamily, int groups, int format) {
  ...
  nladdr.nl_family = AF_NETLINK;
  nladdr.nl_pid = getpid();
  nladdr.nl_groups = groups; 
  if ((*sock = socket(PF_NETLINK, SOCK_DGRAM, netlinkFamily)) < 0) {...}
      ...
  if (bind(*sock, (struct sockaddr *) &nladdr,  sizeof (nladdr)) < 0) {...}

用流程圖來表示如下:

_regester_2.jpeg

kernel/driver

無論是socket還是netlink托呕,都有一個服務(wù)端和客服端,上面只是一個客服端,這里我們來看看服務(wù)端是如何啟動的以及如何發(fā)消息的

netlink協(xié)議注冊

這里core_initcall方法项郊,是kernel啟動的時候會首先加載的模塊
netlink_proto_init該方法除了做一些數(shù)據(jù)結(jié)構(gòu)馅扣,對象實例化外,還向socket中進(jìn)行了注冊
這樣着降,當(dāng)userspace使用socket接口傳入netlink協(xié)議的時候就會調(diào)用到af_netlink模塊中

core_initcall(netlink_proto_init);
...
staticint__init netlink_proto_init(void)
{
 ...
 interr = proto_register(&netlink_proto, 0);
 ...
}
FilePath : kernel/net/netlink/af_netlink.c

kobject_uevent封裝

我們一般向用戶空間發(fā)送uevent消息的時候差油,不是直接使用af_netlink模塊中的方法,而是使用kernel中有一個類似的工具類kobject_uevent來發(fā)送
我們來看看kobject_uevent模塊是如何加載的
這里postcore_initcall是在core_initcall方法后加載的模塊
會調(diào)用到ops里面的init方法任洞,該方法會向af_netlink中進(jìn)行注冊
這里重點是netlink_kernel_create方法蓄喇,如果想要自己進(jìn)行封裝,也就是對函數(shù)netlink_kernel_create進(jìn)行封裝

postcore_initcall(kobject_uevent_init);
static int __init kobject_uevent_init(void) {
  return register_pernet_subsys(&uevent_net_ops);
}
static struct pernet_operations uevent_net_ops = {
  .init  = uevent_net_init,
  .exit = uevent_net_exit,
};

static int uevent_net_init(struct net *net) {
  ...
  ue_sk->sk = netlink_kernel_create(net, NETLINK_KOBJECT_UEVENT, &cfg);
  ...
  return 0;
}
FilePath : kernel/lib/kobject_uevent.c

kobject_uevent發(fā)送

當(dāng)我們的驅(qū)動程序檢測到事件,如:sd卡/otg插拔等交掏,會調(diào)用kobject_uevent.c中kobject_uevent方法
其中action就是add或者remove之類的動作
最后kobject_uevent_env方法調(diào)用到af_netlink模塊中妆偏,通知注冊監(jiān)聽了uevent事件的進(jìn)程

int kobject_uevent(struct kobject *kobj,  enum kobject_action action) {
  return kobject_uevent_env(kobj, action, NULL);
}
File : kernel/lib/kobject_uevent.c

用戶socket接口注冊

由之前可以知道,af_netlink啟動的時候耀销,會向socket進(jìn)行注冊
這樣楼眷,當(dāng)用戶空間使用socket這個接口,并且傳入netlink這個協(xié)議的時候熊尉,就可以找到af_netlink模塊
當(dāng)我們使用了socket這個接口后,還會調(diào)用bind方法掌腰,該方法會將pid,gid插入到af_netlink的數(shù)據(jù)結(jié)構(gòu)中狰住,以方便有數(shù)據(jù)的時候好知道通知哪

總結(jié)

用流程圖來看,如下:

_regester_3.jpeg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末齿梁,一起剝皮案震驚了整個濱河市催植,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌勺择,老刑警劉巖创南,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異省核,居然都是意外死亡稿辙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進(jìn)店門气忠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來邻储,“玉大人,你說我怎么就攤上這事旧噪《帜龋” “怎么了?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵淘钟,是天一觀的道長宦赠。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么勾扭? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任缤骨,我火速辦了婚禮,結(jié)果婚禮上尺借,老公的妹妹穿的比我還像新娘绊起。我一直安慰自己,他們只是感情好燎斩,可當(dāng)我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布虱歪。 她就那樣靜靜地躺著,像睡著了一般栅表。 火紅的嫁衣襯著肌膚如雪笋鄙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天怪瓶,我揣著相機(jī)與錄音萧落,去河邊找鬼。 笑死洗贰,一個胖子當(dāng)著我的面吹牛找岖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播敛滋,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼许布,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了绎晃?” 一聲冷哼從身側(cè)響起蜜唾,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎庶艾,沒想到半個月后袁余,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡咱揍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年颖榜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片述召。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡朱转,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出积暖,到底是詐尸還是另有隱情藤为,我是刑警寧澤,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布夺刑,位于F島的核電站缅疟,受9級特大地震影響分别,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜存淫,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一耘斩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧桅咆,春花似錦括授、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至籍茧,卻和暖如春版述,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背寞冯。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工渴析, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吮龄。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓俭茧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親螟蝙。 傳聞我的和親對象是個殘疾皇子恢恼,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1三個相關(guān)數(shù)據(jù)結(jié)構(gòu). 關(guān)于socket的創(chuàng)建,首先需要分析socket這個結(jié)構(gòu)體胰默,這是整個的核心。 104 str...
    ice_camel閱讀 2,824評論 1 8
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,085評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理漓踢,服務(wù)發(fā)現(xiàn)牵署,斷路器,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • 1:InputChannel提供函數(shù)創(chuàng)建底層的Pipe對象 2: 1)客戶端需要新建窗口 2)new ViewRo...
    自由人是工程師閱讀 5,301評論 0 18
  • 從駕校出來的時候喧半,陽光還是暖融融地曬在身上奴迅。下了幾天的滂沱大雨,難得的好天氣挺据,整顆心就像泡在了蜜棗里取具。 路上看見兩...
    思潔大太陽哦閱讀 241評論 0 1