內核中_init,_exit中的作用

__init, __initdata等屬性標志,是要把這種屬性的代碼放入目標文件的.init.text節,數據放入.init.data節──這一過程是通過編譯內核時為相關目標平臺提供了xxx.lds鏈接腳本來指導ld完成的。
? ? ? 對編譯成module的代碼和數據來說,當模塊加載時,__init屬性的函數就被執行;
?? 對 靜態編入內核的代碼和數據來說,當內核引導時, do_basic_setup()函數調用do_initcalls()函數,后者負責所有.init節函數的執行
?? 在初始化完成后,用這些關鍵字標識的函數或數據所占的內存會被釋放掉。
1)
所有標識為__init的函數在鏈接的時候都放在.init.text這個區段內,
在這個區段中,函數的擺放順序是和鏈接的順序有關的,是不確定的。

2)
所有的__init函數在區段.initcall.init中還保存了一份函數指針,
在初始化時內核會通過這些函數指針調用這些__init函數指針,
并在整個初始化完成后,釋放整個init區段
(包括.init.text,.initcall.init等),

注意,這些函數在內核初始化過程中的調用順序只和這里的函數指針的順序有關,
和1)中所述的這些函數本身在.init.text區段中的順序無關。

在2.4內核中,這些函數指針的順序也是和鏈接的順序有關的,是不確定的。

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

其他的各個區段的定義方法分別是:
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)則等價于device_initcall(fn)。

各個子區段之間的順序是確定的,即先調用.initcall1.init中的函數指針
再調用.initcall2.init中的函數指針,等等。
而在每個子區段中的函數指針的順序是和鏈接順序相關的,是不確定的。

在內核中,不同的init函數被放在不同的子區段中,因此也就決定了它們的調用順序。
這樣也就解決了一些init函數之間必須保證一定的調用順序的問題。

2. Linux Kernel源代碼中與段有關的重要宏定義

A. 關于__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

對于經常寫驅動模塊或翻閱Kernel源代碼的人,看到熟悉的宏了吧:__init, __initdata, __exit, __exitdata。

__init 宏最常用的地方是驅動模塊初始化函數的定義處,其目的是將驅動模塊的初始化函數放入名叫.init.text的輸入段。當內核啟動完畢后,這個段中的內存會被釋放掉供其他使用。

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

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

?

模塊加載分為動態加載和靜態加載。
所謂靜態加載就是,開機加載系統時將模塊加載上去,這就是編譯進內核。
動態加載就是在開機以后將模塊加載上去,這就是編譯成模塊!

?

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

?

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

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253721.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253721.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253721.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

jQuery筆記總結

來源于:http://blog.poetries.top/2016/10/20/review-jQuery/ http://www.jianshu.com/p/f8e3936b34c9 首先,來了解一下jQuery學習的整體思路 第一節 jQuery初步認知 jQuery概述 JQuery概念 javascript概念 基于Js語言的API和語法組織邏輯,通…

芯片生產流程

每個半導體產品的制造都需要數百個工藝,泛林集團將整個制造過程分為八個步驟:晶圓加工-氧化-光刻-刻蝕-薄膜沉積-互連-測試-封裝。 一、晶圓加工 所有半導體工藝都始于一粒沙子!因為沙子所含的硅是生產晶圓所需要的原材料。晶圓是將硅(Si)或砷…

GRE Sub math 報名

Step1 注冊ETS帳號 Step2 登錄帳號,點擊Register/Find Test Centers, Dates Step3 按照提示查詢考場 如果沒有結果而是出現了如下提示,意味著這個地方沒有考位了,需要選擇其他地方的考位 Step 4 接下來就和GRE general test的過程一樣了&…

????platform_device_系列函數及其設備注冊的作用

platform_device_系列函數,實際上是注冊了一個叫platform的虛擬總線。使用約定是如果一個不屬于任何總線的設備,例如藍牙,串口等設備,都需要掛在這個虛擬總線上。 driver/base/platform.c //platform設備聲明 struct device pla…

示例解讀 Python 2 和 Python 3 之間的主要差異

開發四年只會寫業務代碼,分布式高并發都不會還做程序員? 每門編程語言在發布更新之后,主要版本之間都會發生很大的變化。 在本文中,Vinodh Kumar 通過示例解釋了 Python 2 和 Python 3 之間的一些重大差異,以幫助說明…

數字后端——布局

由于I / O單元和模塊的布放已經在布圖規劃時完成,因此布局的剩余任務主要是對標準單元的布局。布局方案在布圖規劃時就已經做了決定,要么選擇展平式布局,要么就是層次化布局。 一、布局目標 布局的目標也即布局內容實施之后所要達到的預期值…

python基礎 函數 (四)

一 函數基本 def func1():print("hello world")return 1, "hello", ("wo", "ai"), ["ni", "da"], {"you": "xi"} # return 可以返回任意# 結果: (1, hello, (wo, ai), [ni, da…

c#注釋

c#的注釋分為:這里不能不說一下什么是注釋。 注釋本身不會執行,只是說明性文字,只供程序員閱讀。 注釋又分為:單行注釋,多行注釋,文檔注釋。 單行注釋://開始 多行注釋:/*開始&#…

嵌入式linux字符設備驅動

1. 我們需要先調用register_chrdev_region()或 alloc_chrdev_region()來向系統申請設備號int register_chrdev_region( dev_t first, unsigned int count, char *name ); //函數通過已知的設備號first來注冊字符設備區域。 int alloc_chrdev_region( dev_t *dev, unsigned int…

數字后端——時鐘樹綜合

在數字集成電路設計中,時鐘信號是數據傳輸的基準,它對于同步數字系統的功能、性能和穩定性起決定性作用,所以時鐘信號的特性及其分配網絡尤被人們關注。時鐘信號通常是整個芯片中有最大扇出、通過最長距離、以最高速度運行的信號。時鐘信號必…

52次課(mysql用戶管理、常用sql語句、 mysql數據庫備份恢復)

MySQL創建用戶以及授權 默認用戶是root用戶,不可能所有人員都用root用戶,創建用戶防止誤刪除,因為mysql里邊有多個庫每個庫里有很多表,所以需要給單獨的用戶做一些授權我只需要它對某一個數據庫有權限,或者說對某個數據…

線程池的種類,區別和使用場景

newCachedThreadPool: 底層:返回ThreadPoolExecutor實例,corePoolSize為0;maximumPoolSize為Integer.MAX_VALUE;keepAliveTime為60L;unit為TimeUnit.SECONDS;workQueue為SynchronousQueue(同步隊…

20145225 《信息安全系統設計基礎》第14周學習總結

第九章 虛擬存儲器 虛擬存儲器是計算機系統最重要的概念之一,它是對主存的一個抽象 三個重要能力: 它將主存看成是一個存儲在磁盤上的地址空間的高速緩存,在主存中只保存活動區域,并根據需要在磁盤和主存之間來回傳送數據&#xf…

數字后端——布線

布線是繼布局和時鐘樹綜合之后的重要物理實施任務,其內容是將分布在芯片核內的模塊、標準單元和輸入輸出接口單元( I /O pad)按邏輯關系進行互連,其要求是百分之百地完成它們之間的所有邏輯信號的互連,并為滿足各種約束條件進行優…

動態加載和靜態加載及其編譯步驟

在類unix操作系統中,驅動加載方式一般分為:動態加載和靜態加載,下面分別對其詳細論述。 一、動態加載 動態加載是將驅動模塊加載到內核中,而不能放入/lib/modules/下。 在2.4內核中,加載驅動命令為:ins…

streamsets 集成 minio s3測試

具體streamsets crate 集成可以參考 streamsets crate 以下文檔只關注minio 集成的配置 minio 服務 搭建 具體搭建參考: https://www.cnblogs.com/rongfengliang/p/9197315.html 創建bucket (crate 集成使用) 測試的csv 文件從https://www.s…

sqlite性能優化

1、數據庫性能上 1.1 批量事務插入,提升數據插入的性能 由于sqlite默認每次插入都是事務,需要對文件進行讀寫,那么減少事務次數就能簡書磁盤讀寫次數從而獲得性能提升。 1.2 單條sql優于多條sql 實測發現,對于幾十條sql插入當你替…

【codecombat】 試玩全攻略 第十四關 已知敵人

第十四關 已知敵人 在這一關里,我們的英雄獲得了一副可以看見敵人的眼鏡,所以他很強勢的學會了“發現敵人”的技能。 hero.findNearestEnemy()命令,單詞多了,首字母都要大寫了,不然分不出來。玩過wow的小伙伴用過 宏命…

數字后端——信號完整性分析

隨著光刻和集成電路制造工藝的不斷進步,以及芯片的特征尺寸從深亞微米到納米的迅速采用,人們一方面因為芯片的功能極大提高而受益,另一方面,當邏輯門的溝道長度減小時,門的開關時間會減小,這意味著輸出驅動…

新浪前端面試

1、什么是Html語義化? 語義化 div > section,div > nav(語言自己能解釋), input/(關閉符號) br/相對于樣式標記,如 i(樣式)/ em(語義);b(樣式&#xff…