【问题标题】:Which headers and functions can I use in loadable kernel modules (except external libraries)?我可以在可加载内核模块(外部库除外)中使用哪些头文件和函数?
【发布时间】:2013-06-20 16:46:33
【问题描述】:

Linux 手册页的第 2 部分包含 system calls

http://linux.die.net/man/2/

找到这个链接后,我说“OK!我用这个参考来开发每个模块,它是完整的”。

但是我好像不能使用这部分的一些功能(比如bind(2))。包含所需的标头(如<sys/socket.h>)后,模块编译失败。

printk这样的一些函数/宏没有在第2节中列出。很多人使用Linux API,我找不到任何官方参考(就像printk)。我不知道他们是如何找到这些功能的? (可能是通过阅读内核的整个源代码而不是阅读任何参考)

memset 等一些函数在第 3 节(用户空间库)中进行了描述,但内核模块开发人员可以毫无错误地使用它!

在开发可加载内核模块时,我在哪里可以找到可用标头函数COMPLETE参考? (类似于 MSDN 和 WINDDK 的参考)

#include <linux/init.h>
#include <linux/module.h>

/* A complete list of availabe headers and functions is missing! */

static int my_init(void)
{
    return  0;
}

static void my_exit(void)
{
    return;
}

module_init(my_init);
module_exit(my_exit);

【问题讨论】:

  • 这很简单,只需查看内核源代码树根目录下的 include 目录即可;)
  • Linux 没有对所有可用头文件和函数的完整参考。您的函数参考几乎是在读取内核包含目录中的标头。即使存在引用,它也会很快过时,因为 Linux 内核不关心向后兼容性(在内核接口中)。

标签: c linux-kernel kernel-module


【解决方案1】:

如您所知,Kernel 是一个很大、很大且独立的野兽。这意味着您不能包含在内核源代码树下找不到的任何内容。

当你实现你的模块时,这意味着你唯一可以链接到的就是你得到的东西:

  • 内核源代码树本身
  • 您制作的另一个模块(我建议尽可能避免这种情况......)

请注意,这些函数只有在导出后才能使用。您可以在模块的已编译 .ko 文件上使用 nm 实用程序检查这一点。如果要导出模块的某些符号,则必须使用macro EXPORT_SYMBOL

注意不要混淆用户空间包含,通常在 /usr/include 下找到与内核模块头(您可能想要链接)。

在您给出的示例中,sys/socket.hmake headers_install 之后的标头位置。在此位置,它旨在供用户空间应用程序使用。这不是您在编写模块时想要的。

我认为您必须更深入地了解内核中套接字的使用。通过谷歌搜索,我在 LWN 上找到了 -> this <- ,并检查了我的 3.8 内核源代码树的 include/linux/net.h 标头。链接中描述的补丁集成在内核中,很可能就是您要查找的。​​p>

memset 示例也说明了我到目前为止所解释的内容:如果您想在通用应用程序中使用它,则必须包含 string.h em> 标头,它只是位于 /usr/include/string.h。它的内核等价物位于 ...

/your-kernel-source-tree-dir/include/linux/string.h

Et voila !您可以在任何内核代码中使用 memset 和朋友,只要您包含正确的标头!

因此,当您感到沮丧时,想 伙计,我可以通过在我的应用程序中简单地包含此标头来使用它...深入了解内核源代码树(或grep 为你做这件事 ;) )。你很有可能找到你要找的东西!

【讨论】:

  • 这是不完整的。对于可加载模块,他不能只是在他正在使用的内核树的头文件中找到任何函数。函数/数据必须通过 EXPORT_SYMBOL 宏导出。
  • @AdelQodmani 您可以在内核源代码树的include 目录下找到任何头文件
  • 不一定,系统调用就是一个例子,你可以在/src/include/linux/syscalls.h中找到它们,但是没有一个被导出。
  • @AdelQodmani 无论如何,我编辑了我的答案以包含有关符号导出的额外信息:)
  • 现在看起来更准确 :) -1 已移除
【解决方案2】:

据我所知,没有关于内核模块编程的完整参考。我建议您学习 LDD3 基础部分和 http://www.tldp.org/LDP/lkmpg/2.6/html/lkmpg.html#AEN978 为初学者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 2011-03-03
    • 2022-01-06
    • 1970-01-01
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多