从用户空间的程序调用内核模块函数

Ric*_*rdo 23 linux user-interface kernel module linux-kernel

我开发了一个内核模块和一些函数.现在我需要在用户空间中开发一个程序并调用内核模块中的一些函数.

我还需要访问我的程序在用户空间的内核模块中的一些全局变量.

osg*_*sgx 24

完整概述了Linux内核模块和用户空间程序交互http://riiki.tldp.org/kernel_user_space_howto " 内核空间,用户空间接口 ",作者是Ariane Keller(来自2008-09-28,但约2.6)内核;只有主要的新方法是relayfs)

没有列出从用户空间到内核空间的普通函数调用,只有syscall(添加新的系统调用并不容易)和upcall(反向调用).

最简单的接口之一是ioctl; 但是在创建procfs,sysfs或类似文件之前,你无法开始使用ioctl.

其他是sysctl; 但是sysctl更有资格读/写全局变量.(很难通过sysctl接口传递几个参数).

  • 我担心这个链接会死掉,虽然它仍然可以访问[通过web.archive.org](https://web.archive.org/web/20160214015410/http://people.ee.ethz.ch/~arkeller/ LINUX/kernel_user_space_howto.html) (2认同)

Nik*_*sov 6

你似乎错过了内核和用户空间分离的观点.如果您的用户程序可以直接修改内核中的数据,那很快就会导致灾难.

用户程序只有一种传统方式可以明确地从内核请求服务 - make a system call.

还有一些陷阱和一些特定于Linux的用户区内核通信机制,但这些并不重要.

  • 但它可以实现现有的,如`ioctl(2)`. (5认同)

ajp*_*les 5

正如其他海报所提到的,内核和用户空间之间存在明显的区别.所以没有你不能直接从用户空间调用内核函数.我认为在用户空间和内核空间之间发送消息的最简单方法是通过netlink套接字.netlink套接字允许您轻松地在用户级别和内核级别之间传递任意数据结构.

是的ioctl,系统调用是可行的替代方案,它们不像传递任意信息的netlink套接字那样灵活.

示例代码:http: //people.ee.ethz.ch/~arkeller/linux/multi/kernel_user_space_howto-3.html