2013-03-19 104 views
2

我是內核和驅動程序編程的新手,所以我希望我的問題不是太簡單。初始化內核模塊變量

我正在使用madwifi驅動程序,以添加我自己的一些功能。在我的代碼中,我添加了一些變量和結構,需要在實際代碼開始之前進行初始化。
在工作時,我遇到了以下問題: 哪裏是放置負責初始化這些變量/結構的函數的最佳位置? 據我所知,有一個特殊的宏* module_init *在將模塊加載到內核時正在執行,但是,我無法在madwifi驅動程序代碼中找到它。我發現的是另一個着名的宏,即* exit_module *。 所以我的問題是:

  1. 它是建議增加一個init_module的,做我所有的初始化呢?
  2. 建議使用exit_module釋放分配的內存嗎?

感謝您的幫助!

歐麥

+0

默認情況下,在加載/卸載時調用'init_module'和'cleanup_module'函數。 'module_init'可以用另一個函數替代它。 – ugoren 2013-03-19 12:06:41

+0

你找過__devinit ... – Anshul 2013-03-19 12:09:49

回答

4

每個模塊(駕駛員)定義了兩個函數,當模塊被裝入內核和一個當所述模塊被移除用於一個被調用。 module_init()module_exit()是兩個特殊內核爲這些角色聲明兩個函數。

我想你的驅動程序有init函數。通常使用init()函數來初始化或註冊您的驅動程序。

另請檢查probe()函數。如果您的驅動程序可以支持多個設備,則一旦註冊驅動程序,內核將爲每個設備調用probe()一次。該探測功能啓動每個設備的初始化:初始化硬件,分配資源並將設備作爲塊或網絡設備註冊到內核或任何設備。

+0

感謝您的答案,但正如我所提到的,我無法在代碼中找到init函數..它似乎只是不存在。 – omer 2013-03-19 12:00:45

+1

模塊將始終具有在'module_init()'和'module_exit()'宏中聲明的函數。但是該模塊可能包含多個源文件,因此您可能沒有查看包含init例程的文件。 – sawdust 2013-03-19 19:02:38

1

正如我在我的評論中說的,初始化代碼可以在init_module函數中。

關於你的問題:

  1. 模塊初始化函數(init_module)是正確的 地方驅動級初始化。建議使用它, ,除非您的需求對C靜態變量 初始化足夠小。
  2. 清理功能(cleanup_module)必須確定驅動程序已釋放已分配的任何資源。 這是在 初始化期間釋放分配的任何東西的正確位置。
+0

我明白了......例如,如果我想創建一個緩衝區數組,我將在整個模塊中使用,你會建議我在init_module中聲明它併爲它分配內存? (與整個代碼中使用的所有其他變量\結構相同) – omer 2013-03-19 12:23:10

+0

通常,應該儘可能少地分配內存,並避免分配大量內存 - 以防等待出現的需求。但是,如果你這樣做 - 那麼是的,在'init_module'中分配,在'cleanup_module'中釋放。 – ugoren 2013-03-19 12:44:38

+0

非常感謝! – omer 2013-03-19 12:48:01