Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在用户空间从程序调用内核模块函数_Linux_User Interface_Module_Linux Kernel_Kernel - Fatal编程技术网

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

Linux 在用户空间从程序调用内核模块函数,linux,user-interface,module,linux-kernel,kernel,Linux,User Interface,Module,Linux Kernel,Kernel,我开发了一个内核模块和一些函数。现在我需要在用户空间开发一个程序,并调用内核模块中的一些函数 我还需要在用户空间访问程序内核模块中的一些全局变量。有Ariane Keller的linux内核模块和用户空间程序交互“内核空间,用户空间接口”的完整概述(它是从2008-09-28开始的,但大约有2.6个内核;唯一主要的新方法是) 没有列出从用户空间到内核空间的普通函数调用,只有syscall(添加新的syscall并不容易)和upcall(反向调用) 最简单的接口之一是ioctl;但在创建procf

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


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

有Ariane Keller的linux内核模块和用户空间程序交互“内核空间,用户空间接口”的完整概述(它是从2008-09-28开始的,但大约有2.6个内核;唯一主要的新方法是)

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

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


另一个是sysctl;但sysctl更有资格读取/写入全局变量。(很难通过sysctl接口传递多个参数)

您似乎忽略了内核和用户区分离的要点。如果您的用户程序可以直接修改内核中的数据,那么很快就会导致灾难

对于用户程序来说,只有一种传统的方法可以显式地从内核请求服务


还有陷阱和一些特定于Linux的userland内核通信机制,但它们在这里并不相关。

您需要安装一个新内核来利用新调用,除非您已经有一些机制来更新内核

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


是的,ioctl,系统调用是可行的替代方案,它们在传递任意信息方面不如netlink套接字灵活。

您可以从其他空间调用任何函数。您可以调用syscall函数,或者通过procfs进行交互,或者与某些设备文件进行交互,这些文件由您的模块处理。你能说说这个模块是什么吗?这个模块有一些网络管理功能。如果我想发送一些以太网数据,如果可能的话,我需要使用内核模块开发的函数向某人请求。例如,在发送数据包之前,我需要访问该函数。这个函数还有一些我需要插入的参数。但是-module不能添加系统调用,但是它可以实现一个现有的调用,比如
ioctl(2)
。严格来说,这不是真的。有多种方法可以修改系统调用表(至少在x86体系结构上)。它涉及将指针从IDTR寄存器更改为指向内存中存在新的被劫持sys_调用表(任意长度)的新部分。请参阅以了解攻击的一般概念。是的,同意,而不是心脏虚弱:)只需注意:代码需要以下细微更改才能在较新的内核上运行:更改gnKernel中的以下行。c:rc=genlmsg_unicast(skb,info->snd_pid);到rc=genlmsg_单播(genl_info_net(info),skb,info->snd_pid);我测试这个的内核是2.6.35-22-generic,我恐怕这个链接已经死了,尽管它仍然可以访问,谢谢。同样在这里,Ariane Keller的“内核空间,用户空间界面”,2008-10-04