Linux手册页的第2部分包含system calls
。
找到这个链接后,我说“好!我用这个参考来开发每个模块,它已经完成了。”
但似乎我不能使用本节的某些功能(如bind(2)
)。包含必需的标题(如<sys/socket.h>
)后,模块编译失败。
某些功能/宏如printk
未在第2节中列出。许多人使用Linux Apis,我找不到任何官方参考(就像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);
答案 0 :(得分:4)
如你所知,内核是一个相当庞大,大而独立的野兽。这意味着您不能包含在内核源代码树下找不到的任何内容。
当您实施模块时,这意味着您可以链接的唯一内容就是您所拥有的内容:
请注意,只有在导出功能时才能使用这些功能。您可以使用模块的已编译nm
文件上的.ko
实用程序进行检查。如果要导出模块的某些符号,则必须使用macro EXPORT_SYMBOL
。
注意不要混淆用户空间包含,通常在/ usr / include下找到内核模块头文件(你可能想要链接它)。
在您给出的示例中, sys / socket.h 是make headers_install
之后标题的位置。在此位置,它意味着由用户空间应用程序使用。在编写模块时,这是 NOT 你想要的。
我认为你必须更深入地研究内核中套接字的使用。通过谷歌搜索,我在LWN上找到 -> this <- 并检查了我的3.8内核源代码树的 include / linux / net.h 标头。链接中描述的补丁集成在内核中,很可能是您正在寻找的。 p>
memset 示例也说明了我到目前为止所解释的内容:如果要在通用应用程序中使用它,则必须包含 string.h header,它位于 /usr/include/string.h 。它的内核等价于......
/your-kernel-source-tree-dir/include/linux/string.h
Et voila!只要包含正确的标题,您就可以在任何内核代码中使用 memset 和朋友!
因此,当你感到有些沮丧,想到 Man时,我能够通过在我的应用中简单地包含这个标题来使用它... 深入了解内核源代码树(或者有grep
为你做;))。你很有可能找到你想要的东西!
答案 1 :(得分:2)
据我所知,内核模块编程没有这样完整的参考。我建议您为初学者学习LDD3基本部分和http://www.tldp.org/LDP/lkmpg/2.6/html/lkmpg.html#AEN978。