2013-03-19 102 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