Linux中__init碘橘、__devinit等內(nèi)核優(yōu)化宏

Linux中__init、__devinit等內(nèi)核優(yōu)化宏【轉(zhuǎn)】

轉(zhuǎn)自:https://blog.csdn.net/qingkongyeyue/article/details/72935439
https://blog.csdn.net/qingkongyeyue/article/details/72935439

內(nèi)核使用了大量不同的宏來標(biāo)記具有不同作用的函數(shù)和數(shù)據(jù)結(jié)構(gòu)叠赦。如宏__init 、__devinit 等革砸。這些宏在include/linux/init.h 頭文件中定義除秀。編譯器通過這些宏可以把代碼優(yōu)化放到合適的內(nèi)存位置,以減少內(nèi)存占用和提高內(nèi)核效率算利。

下面是一些常用的宏:

· __init 册踩,標(biāo)記內(nèi)核啟動時使用的初始化代碼,內(nèi)核啟動完成后不再需要效拭。以此標(biāo)記的代碼位于.init.text 內(nèi)存區(qū)域暂吉。它的宏定義是這樣的:

· #define _ _init _ _attribute_ _ ((_ _section_ _ (".text.init")))

· __exit ,標(biāo)記退出代碼缎患,對于非模塊無效慕的。如果編譯穩(wěn)定的話,exit函數(shù)將永遠(yuǎn)不會被調(diào)用挤渔。

#ifdef MODULE
#define __exit __attribute__ ((__section__(".exit.text")))
#else
#define __exit __attribute_used__ __attribute__((__section__(".exit.text")))
#endif

· __initdata肮街,標(biāo)記內(nèi)核啟動時使用的初始化數(shù)據(jù)結(jié)構(gòu),內(nèi)核啟動完成后不再需要判导。以此標(biāo)記的代碼位于.init.data 內(nèi)存區(qū)域嫉父。

· __devinit,標(biāo)記設(shè)備初始化使用的代碼眼刃。

· __devinitdata绕辖,標(biāo)記初始化設(shè)備數(shù)據(jù)結(jié)構(gòu)的函數(shù)。

· __devexit擂红,標(biāo)記移除設(shè)備時使用的代碼仪际。

· xxx_initcall,一系列的初始化代碼,按降序優(yōu)先級排列弟头。

初始化代碼的特點是:在系統(tǒng)啟動運行,且一旦運行后馬上退出內(nèi)存涉茧,不再占用內(nèi)存赴恨。

  1. 所有標(biāo)識為__init的函數(shù),在鏈接的時候伴栓,都放在.init.text這個區(qū)域中伦连。在這個區(qū)域中,函數(shù)的擺放順序是和鏈接順序有關(guān)的钳垮,是不確定的惑淳。
  2. 所有的__init函數(shù)在區(qū)域.initcall.init中還保存了一份函數(shù)指針。在初始化時饺窿,內(nèi)核會通過這些函數(shù)指針調(diào) 用這些__init函數(shù)歧焦,并在整個初始化完成后,釋放整個init區(qū)域 (包括.init.text, .initcall.init...)

注:這些函數(shù)在內(nèi)核初始化過程中的調(diào)用順序只和這里的函數(shù)指針順序有關(guān)肚医,和1中所述的這些函數(shù)代碼本身在.init.text區(qū)域中的順序無關(guān)绢馍。

對于驅(qū)動程序模塊來說,這些優(yōu)化標(biāo)記使用的情況如下:

· 通過module_init() 和module_exit() 函數(shù)調(diào)用的函數(shù)就需要使用__init__exit宏來標(biāo)記肠套。

· pci_driver 數(shù)據(jù)結(jié)構(gòu)不需標(biāo)記舰涌。

· probe() 和remove() 函數(shù)應(yīng)該使用 __devinit__devexit標(biāo)記,且只能標(biāo)記probe() 和remove()

· 如果remove() 使用 __devexit 標(biāo)記你稚,則在pci_driver 結(jié)構(gòu)中要用 __devexit_p(remove)來引用remove() 函數(shù)瓷耙。

· 如果你不確定需不需要添加優(yōu)化宏則不要添加。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末刁赖,一起剝皮案震驚了整個濱河市搁痛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乾闰,老刑警劉巖落追,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異涯肩,居然都是意外死亡轿钠,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門病苗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疗垛,“玉大人,你說我怎么就攤上這事硫朦〈螅” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長泽裳。 經(jīng)常有香客問我瞒斩,道長,這世上最難降的妖魔是什么涮总? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任胸囱,我火速辦了婚禮,結(jié)果婚禮上瀑梗,老公的妹妹穿的比我還像新娘烹笔。我一直安慰自己,他們只是感情好抛丽,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布谤职。 她就那樣靜靜地躺著,像睡著了一般亿鲜。 火紅的嫁衣襯著肌膚如雪允蜈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天蒿柳,我揣著相機與錄音陷寝,去河邊找鬼。 笑死其馏,一個胖子當(dāng)著我的面吹牛凤跑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播叛复,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼仔引,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了褐奥?” 一聲冷哼從身側(cè)響起咖耘,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎撬码,沒想到半個月后儿倒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡呜笑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年夫否,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叫胁。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡凰慈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出驼鹅,到底是詐尸還是另有隱情微谓,我是刑警寧澤森篷,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站豺型,受9級特大地震影響仲智,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜姻氨,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一坎藐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哼绑,春花似錦、人聲如沸碉咆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疫铜。三九已至茂浮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間壳咕,已是汗流浹背席揽。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谓厘,地道東北人幌羞。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像竟稳,于是被迫代替她去往敵國和親属桦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

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