我开发了一个内核模块和一些函数。现在我需要在用户空间中开发一个程序并调用内核模块中的一些函数。
我还需要在用户空间的程序中访问内核模块中的一些全局变量。
答案 0 :(得分:24)
完整概述了Linux内核模块和用户空间程序交互http://wiki.tldp.org/kernel_user_space_howto“内核空间,用户空间接口”作者:Ariane Keller(来自2008-09-28) ,但大约2.6内核;只有主要的新方法是relayfs)
没有列出从用户空间到内核空间的普通函数调用,只有syscall(添加新的系统调用并不容易)和upcall(反向调用)。
最简单的界面之一是ioctl;但是在创建procfs,sysfs或类似文件之前,你无法开始使用ioctl。
其他是sysctl;但是sysctl更有资格读/写全局变量。 (很难通过sysctl接口传递几个参数)。
答案 1 :(得分:6)
您似乎忽略了内核和用户空间分离的重点。如果您的用户程序可以直接修改内核中的数据,那很快就会导致灾难。
用户程序只有一种传统方式可以明确地从内核请求服务 - make a system call
。
还有陷阱和一些特定于Linux的用户空间 - 内核通信机制,但这些与此无关。
答案 2 :(得分:5)
正如其他海报所提到的,内核和用户空间之间存在明显的区别。所以没有你不能直接从用户空间调用内核函数。我认为在用户空间和内核空间之间发送消息的最简单方法是通过netlink套接字。 netlink套接字允许您轻松地在用户级别和内核级别之间传递任意数据结构。
是的ioctl,系统调用是可行的替代方案,它们不像传递任意信息的netlink套接字那样灵活。
示例代码: http://people.ee.ethz.ch/~arkeller/linux/multi/kernel_user_space_howto-3.html
答案 3 :(得分:1)
除非你已经有一些更新内核的机制,否则你需要安装一个新内核才能使用新的调用... http://www.cyberciti.biz/tips/how-to-patch-running-linux-kernel.html