日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

内核中_init,_exit中的作用

發(fā)布時(shí)間:2023/12/10 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 内核中_init,_exit中的作用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
__init, __initdata等屬性標(biāo)志,是要把這種屬性的代碼放入目標(biāo)文件的.init.text節(jié),數(shù)據(jù)放入.init.data節(jié)──這一過(guò)程是通過(guò)編譯內(nèi)核時(shí)為相關(guān)目標(biāo)平臺(tái)提供了xxx.lds鏈接腳本來(lái)指導(dǎo)ld完成的。
? ? ? 對(duì)編譯成module的代碼和數(shù)據(jù)來(lái)說(shuō),當(dāng)模塊加載時(shí),__init屬性的函數(shù)就被執(zhí)行;
?? 對(duì) 靜態(tài)編入內(nèi)核的代碼和數(shù)據(jù)來(lái)說(shuō),當(dāng)內(nèi)核引導(dǎo)時(shí), do_basic_setup()函數(shù)調(diào)用do_initcalls()函數(shù),后者負(fù)責(zé)所有.init節(jié)函數(shù)的執(zhí)行。 ?? 在初始化完成后,用這些關(guān)鍵字標(biāo)識(shí)的函數(shù)或數(shù)據(jù)所占的內(nèi)存會(huì)被釋放掉。 1)
所有標(biāo)識(shí)為__init的函數(shù)在鏈接的時(shí)候都放在.init.text這個(gè)區(qū)段內(nèi),
在這個(gè)區(qū)段中,函數(shù)的擺放順序是和鏈接的順序有關(guān)的,是不確定的。

2)
所有的__init函數(shù)在區(qū)段.initcall.init中還保存了一份函數(shù)指針,
在初始化時(shí)內(nèi)核會(huì)通過(guò)這些函數(shù)指針調(diào)用這些__init函數(shù)指針,
并在整個(gè)初始化完成后,釋放整個(gè)init區(qū)段
(包括.init.text,.initcall.init等),

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

在2.4內(nèi)核中,這些函數(shù)指針的順序也是和鏈接的順序有關(guān)的,是不確定的。

在2.6內(nèi)核中,initcall.init區(qū)段又分成7個(gè)子區(qū)段,分別是
.initcall1.init
.initcall2.init
.initcall3.init
.initcall4.init
.initcall5.init
.initcall6.init
.initcall7.init
(參見include/linux/init.h和vmlinux.lds )
當(dāng)需要把函數(shù)fn放到.initcall1.init區(qū)段時(shí),只要聲明
core_initcall(fn);
即可。

其他的各個(gè)區(qū)段的定義方法分別是:
core_initcall(fn) --->.initcall1.init
postcore_initcall(fn) --->.initcall2.init
arch_initcall(fn) --->.initcall3.init
subsys_initcall(fn) --->.initcall4.init
fs_initcall(fn) --->.initcall5.init
device_initcall(fn) --->.initcall6.init
late_initcall(fn) --->.initcall7.init

而與2.4兼容的initcall(fn)則等價(jià)于device_initcall(fn)。

各個(gè)子區(qū)段之間的順序是確定的,即先調(diào)用.initcall1.init中的函數(shù)指針
再調(diào)用.initcall2.init中的函數(shù)指針,等等。
而在每個(gè)子區(qū)段中的函數(shù)指針的順序是和鏈接順序相關(guān)的,是不確定的。

在內(nèi)核中,不同的init函數(shù)被放在不同的子區(qū)段中,因此也就決定了它們的調(diào)用順序。
這樣也就解決了一些init函數(shù)之間必須保證一定的調(diào)用順序的問(wèn)題。

2. Linux Kernel源代碼中與段有關(guān)的重要宏定義

A. 關(guān)于__init、__initdata、__exit、__exitdata及類似的宏

打開Linux Kernel源代碼樹中的文件:include/init.h,可以看到有下面的宏定議:

#define __init? __attribute__ ((__section__ (".init.text")))? __cold

#define __initdata??? __attribute__ (( __section__ (".init.data")))

#define __exitdata?? __attribute__ (( __section__ (".exit.data")))

#define __exit_call? __attribute_used__ __attribute__ (( __section__ (".exitcall.exit")))

#define __init_refok? oninline __attribute__ ((__section__ (".text.init.refok")))

#define __initdata_refok __attribute__ ((__section__ (".data.init.refok")))

#define __exit_refok noinline __attribute__ ((__section__ (".exit.text.refok")))

.........

#ifdef MODULE

#define __exit? __attribute__ (( __section__ (".exit.text"))) __cold

#else

#define __exit __attribute_used__ __attribute__ ((__section__ (".exit.text"))) __cold

#endif

對(duì)于經(jīng)常寫驅(qū)動(dòng)模塊或翻閱Kernel源代碼的人,看到熟悉的宏了吧:__init, __initdata, __exit, __exitdata。

__init 宏最常用的地方是驅(qū)動(dòng)模塊初始化函數(shù)的定義處,其目的是將驅(qū)動(dòng)模塊的初始化函數(shù)放入名叫.init.text的輸入段。當(dāng)內(nèi)核啟動(dòng)完畢后,這個(gè)段中的內(nèi)存會(huì)被釋放掉供其他使用。

__initdata宏用于數(shù)據(jù)定義,目的是將數(shù)據(jù)放入名叫.init.data的輸入段。其它幾個(gè)宏也類似。

另外需要注意的是,在以上定意中,用__section__代替了section。還有其它一些類似的宏定義,這里不一一列出,其作用都是類似的。

?

模塊加載分為動(dòng)態(tài)加載和靜態(tài)加載。
所謂靜態(tài)加載就是,開機(jī)加載系統(tǒng)時(shí)將模塊加載上去,這就是編譯進(jìn)內(nèi)核。
動(dòng)態(tài)加載就是在開機(jī)以后將模塊加載上去,這就是編譯成模塊!

?

init_module是默認(rèn)的模塊的入口,如果你想指定其他的函數(shù)作為模塊的入口就需要
module_init函數(shù)來(lái)指定,比如
module_init ? (your_func);
其中your_func是你編寫的一個(gè)函數(shù)的名稱.

?

init_module()是真正的入口,module_init是宏,如果在模塊中使用,最終還是要轉(zhuǎn)換到init_module()上。

如果不是在模塊中使用,module_init可以說(shuō)沒(méi)有什么作用。總之,使用module_init方便代碼在模塊和非模塊間移植。

總結(jié)

以上是生活随笔為你收集整理的内核中_init,_exit中的作用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。