久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

GCC特性之__init修飾解析

 Springtimes_hy 2013-05-23
        做底層驅(qū)動的人都知道,,在driver文件中會經(jīng)??匆姟癬_init“修飾的代碼,,那么__init標(biāo)記有什么意義,?
        下面我們就來看看。

        在GCC拓展的特殊屬性中section時會提及這個__init,,他所修飾的所有代碼都會放到.init.text節(jié)中,,當(dāng)初始化結(jié)束后就可以釋放這部分內(nèi)存,這樣就減少了內(nèi)存的占用空間,。
        那么另外一個問題就來了,,什么時候調(diào)用到該函數(shù)?
        要回答這個問題首先要先講解這個宏:subsys_initcall,,在文件kernel/include/linux/init.h中,。定義方式如下:
        #define subsys_initcall(fn)             __define_initcall("4",fn,4)

        又帶來了一個新的宏__define_initcall,定義方式如下:
        #define __define_initcall(level,fn,id) \
                 static initcall_t __initcall_##fn##id __used \
                 __attribute__((__section__(".initcall" level ".init"))) = fn


       那么 __define_initcall是用來修飾將指定的函數(shù)指針fn存放到".initcall.init"節(jié)中,。因此可以斷定subsys_initcall宏將fn存放到“.initcall.init”節(jié)中的“..initcall4.init”里,。

        我們需要理解一下.initcall.init和.init.text和".initcall4.init"之類的符號的含義,這就需要我們了解和內(nèi)核可執(zhí)行文件的相關(guān)概念。
什么是內(nèi)核可執(zhí)行文件?
        可執(zhí)行文件映像中包含了進(jìn)程執(zhí)行的代碼和數(shù)據(jù),,同時也包含了操作系統(tǒng)用來將映像正確裝入內(nèi)存并執(zhí)行的信息,。具體信息大家可以上網(wǎng)搜索,這里就一筆帶過,。
        這些信息包含了如下文本段,、數(shù)據(jù)段、init數(shù)據(jù)段,、bass段等,。這些數(shù)據(jù)都是由一個稱為“鏈接器腳本”的文件鏈接并裝入的,這個文件的功能時間這些輸入信息的各段裝入到指定的地址處,。vmlinux.lds就是存在"arch/xxx/"目錄中哦你的內(nèi)核連接其腳本,,他負(fù)責(zé)鏈接內(nèi)核的各個段并將他們裝入到內(nèi)存中特定偏移量處。
         下面讓我們看一下這個鏈接器腳本文件,,路徑是"arch/arm/kernel",,名稱為vmlinux.lds.
          找到關(guān)鍵程序:INIT_SETUP(16)--->init_main.c的__setup_start指向的.init.setup節(jié)的開始
                                       INIT_CALLS---->init_main.c的__initcall_start指向的.initcallearly.init節(jié)的開始
                                      CON_INITCALL---->./drivers/char/tty_io.c的__con_initcall_start指向的.con_initcall.init節(jié)的開始。
                                      其他的宏就不講解了,。
其中INIT_CALL是主要的,,分為了九段:
                 INIT_CALLS_LEVEL(0)                                     \
                 INIT_CALLS_LEVEL(1)                                     \
                 INIT_CALLS_LEVEL(2)                                     \
                 INIT_CALLS_LEVEL(3)                                     \
                 INIT_CALLS_LEVEL(4)                                     \
                 INIT_CALLS_LEVEL(5)                                     \
                 INIT_CALLS_LEVEL(rootfs)                                \
                 INIT_CALLS_LEVEL(6)                                     \
                 INIT_CALLS_LEVEL(7)
而INIT_CALL_LEVEL宏定義如下:
#define INIT_CALLS_LEVEL(level)                                         \
                 VMLINUX_SYMBOL(__initcall##level##_start) = .;          \
                 *(.initcall##level##.init)                              \
                 *(.initcall##level##s.init)

實(shí)際就是.initcall0.init~.initcall7.init。那么subsys_initcall將值定的話函數(shù)指針放在了".initcall4.init"子段中,。例如:device_initcall將函數(shù)指針存放到了".initcall6.init"中,;core_initcall將函數(shù)指針存放到了".initcall1.init"子段中。
        各個子段的順序是確定的,,是先調(diào)用".initcall4.init"中的函數(shù)指針再去執(zhí)行“.initcall5.init”中的函數(shù)指針,。

        那么__init修飾的初始化函數(shù)在內(nèi)核初始化過程中調(diào)用的順序和.initcall.init里面的函數(shù)指針的順序有關(guān),因此不同的初始化函數(shù)是被放在不同的子段中,,因此就決定了他們的調(diào)用順序,。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多