1

Linux 手册页的第 2 节包含system calls.

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

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

但似乎我不能使用本节的某些功能(如bind(2))。包含所需的标头(如<sys/socket.h>)后,模块编译失败。

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

一些功能,如memset第 3 节(用户空间库)中描述的,但内核模块开发人员可以使用它而不会出现任何错误!

在开发可加载内核模块时,我在哪里可以找到可用头文件函数的完整参考?(类似于 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);
4

2 回答 2

4

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

当您实现模块时,这意味着您可以链接到的唯一内容就是您获得的内容:

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

请注意,只有在导出函数时,您才能使用它们。您可以使用该nm实用程序对模块的已编译.ko文件进行检查。如果要导出模块的某些符号,则必须使用EXPORT_SYMBOL.

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

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

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

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

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

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

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

于 2013-06-24T08:59:40.873 回答
2

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

于 2013-06-24T11:05:08.370 回答