初始化和關停

2021-10-12 18:19:03 字數 1183 閱讀 9609

如已提到的, 模組初始化函式註冊模組提供的任何功能. 這些功能, 我們指的是新功能, 可以由應用程式訪問的或者一整個驅動或者乙個新軟體抽象. 實際的初始化函式定義常常如:

static int init initialization_function(void)

module_init(initialization_function);

初始化函式應當宣告成靜態的, 因為它們不會在特定檔案之外可見; 沒有硬性規定這個, 然而, 因為沒有函式能輸出給核心其他部分, 除非明確請求. 宣告中的 init 標誌可能看起來有點怪; 它是乙個給核心的暗示, 給定的函式只是在初始化使用. 模組載入者在模組載入後會丟掉這個初始化函式, 使它的記憶體可做其他用途. 乙個類似的標籤

( initdata) 給只在初始化時用的資料. 使用 init 和 initdata 是可選的, 但是它帶來的麻煩是值得的. 只是要確認不要用在那些在初始化完成後還使用的函式(或者資料結構)上. 你可能還會遇到 devinit 和 devinitdata 在核心原始碼裡; 這些只在核心沒有配置支援 hotplug 裝置時轉換成 init 和 _initdata. 我們會在 14 章談論 hotplug 支援.

使用 moudle_init 是強制的. 這個巨集定義增加了特別的段到模組目標**中, 表明在**找到模組的初始化函式. 沒有這個定義, 你的初始化函式不會被呼叫.

模組可以註冊許多的不同設施, 包括不同型別的裝置, 檔案系統, 加密轉換, 以及更多. 對每乙個設施, 有乙個特定的核心函式來完成這個註冊. 傳給核心註冊函式的引數常常是一些資料結構的指標, 描述新設施以及要註冊的新設施的名子. 資料結構常常包含模組函式指標, 模組中的函式就是這樣被呼叫的.

能夠註冊的專案遠遠超出第 1 章中提到的裝置型別列表. 它們包括, 其他的, 串列埠, 多樣裝置, sysfs 入口, /proc 檔案, 執行域, 鏈路規程. 這些可註冊項的大部分都支援不直接和硬體相關的函式, 但是處於"軟體抽象"區域裡. 這些項可以註冊, 是因為它們以各種方式(例如象 /proc 檔案和鏈路規程)整合在驅動的功能中.

對某些驅動有其他的設施可以註冊作為補充, 但它們的使用太特別, 所以不值得討論它們. 它們使用堆疊技術, 在"核心符號表"一節中講過. 如果你想深入探求, 你可以在核心原始碼裡查詢 export_symbol , 找到由不同驅動提供的入口點. 大部分註冊函式以 register_ 做字首, 因此找到它們的另外乙個方法是在核心原始碼裡查詢 register_ .

Linux核心驅動之初始化和關停

模組初始化函式註冊模組提供的任何功能.這些功能,我們指的是新功能,可以由應用程式訪問的或者一整個驅動或者乙個新軟體抽象.實際的初始化函式定義常常如 static int init initialization function void module init initialization func...

直接初始化和複製初始化

關於這個問題,國內外都有許多爭論,但我至今未找到滿意的答案,至於為為什麼,這就是今天要說明的。可能大家都有看過c primer,我看的是第四版,中文版,英文水平不怎麼樣。其中第13章,描述說,複製建構函式可用於 1.根據另乙個同型別的物件顯式或隱式初始化乙個物件 2.複製乙個物件,將它作為引數傳遞給...

靜態初始化和例項初始化

父類單獨的效果 當父類單獨執行時,靜態初始化塊優先執行,然後是例項初始化塊,最後才是構造器 子類單獨效果 首先執行父類的靜態初始化塊和子類的初始化塊 優先執行靜態 然後執行父類的例項初始化塊和構造器,最後執行子類的例項初始化塊和構造器 父類子類效果1 父在前子在後 先將父類的物件例項出來後,進行子類...