初始化内核模块变量

时间:2013-03-19 10:41:08

标签: linux linux-kernel wifi linux-device-driver

我是内核和驱动程序编程的新手,所以我希望我的问题不是太简单。

我正在使用一个madwifi驱动程序,以便添加我自己的一些功能。在我的代码中,我添加了一些需要在实际代码开始之前初始化的变量和结构 工作时我遇到了以下问题: 在哪里是负责初始化这个变量/结构的函数的最佳位置? 据我所知,有一个特殊的宏* module_init *在将模块加载到内核时执行,但是,我在madwifi驱动程序代码中找不到它。我找到的是另一个着名的宏,* exit_module *虽然。 所以我的问题是:

  1. 是否建议添加init_module并在那里进行所有初始化?
  2. 是否建议使用exit_module释放分配的内存?
  3. 感谢您的帮助!

    欧麦

2 个答案:

答案 0 :(得分:4)

每个模块(驱动程序)都定义了两个函数,一个在模块加载到内核时调用,另一个函数在移除模块时调用。 module_init()module_exit()是两个特殊的内核,用于为这些角色声明两个函数。

我想你的驱动程序有init函数。 init()函数通常用于初始化或注册您的驱动程序。

同时检查probe()功能。如果您的驱动程序可以支持多个设备,则一旦注册了驱动程序,内核将为每个设备调用probe()一次。此探测功能启动每个设备的初始化:初始化硬件,分配资源,以及将内核注册为块或网络设备或其他任何内容。

答案 1 :(得分:1)

正如我在评论中所说,初始化代码可以在init_module函数中。

关于你的问题:

  1. 模块初始化函数(init_module)是正确的 驱动程序级初始化的地方。建议使用它, 除非你的需求对C静态变量足够微不足道 初始化。
  2. 必须进行清理功能(cleanup_module) 确保驱动程序已释放它已分配的任何资源。 这是免费分配任何东西的合适场所 初始化。