【问题标题】:Initializing kernel module variables初始化内核模块变量
【发布时间】:2013-03-20 02:58:27
【问题描述】:

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

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

  1. 是否建议添加一个 init_module 并在那里进行我的所有初始化?
  2. 是否建议使用 exit_module 来释放分配的内存?

感谢您的帮助!

奥马尔

【问题讨论】:

  • 默认情况下,init_modulecleanup_module 函数在加载/卸载时被调用。 module_init 可以用另一个函数替换它。
  • 你找过__devinit吗...

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


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回答,但正如我所提到的,我在代码中找不到 init 函数..它似乎不存在。
  • 一个模块总是有在module_init()module_exit() 宏中声明的函数。但是该模块可能包含多个源文件,因此您可能没有查看具有 init 例程的文件。
【解决方案2】:

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

关于您的问题:

  1. 模块初始化函数(init_module)是对的 驱动级初始化的地方。推荐使用, 除非您的需求对于 C 静态变量来说是微不足道的 初始化。
  2. 清理功能 (cleanup_module) 必须使 确保驱动程序已释放它分配的任何资源。 这是释放期间分配的任何东西的正确地方 初始化。

【讨论】:

  • 我明白了...因此,例如,如果我想创建一个缓冲区数组,我将在整个模块中使用它,你会建议我声明它并为其分配内存在 init_module 中? (与整个代码中使用的所有其他 vars\structures 相同)
  • 一般来说,你应该尽可能少地分配内存,避免分配大量内存以防万一——最好等待出现的需要。但如果你这样做 - 那么是的,在init_module 中分配,在cleanup_module 中免费。
  • @omer,感谢您说“谢谢”,但正确的做法是投票或接受答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-05
  • 2019-07-21
相关资源
最近更新 更多