当前位置: 首页 > 面试题库 >

从内核空间执行用户空间功能

长孙雅志
2023-03-14
问题内容

我在Linux中编写了一个自定义设备驱动程序,该驱动程序必须能够非常快速地响应中断。用户空间实现中已经存在处理此问题的代码,但是它太慢了,因为它依赖于软件不断检查中断线的状态。经过研究,我发现您可以从内核模块注册这些中断线,并执行由函数指针提供的功能。但是我们要执行的代码是在用户空间中,是否有一种方法可以从内核空间模块调用用户空间中的函数?


问题答案:

从内核调用用户空间功能很不走运,因为内核不知道,也不应该知道用户空间应用程序的各个功能和逻辑,更不用说每个用户空间应用程序都有自己的内存了。布局,不允许其他进程或内核以这种方式入侵(共享对象在这里是例外,但仍然不能从内核空间利用该对象)。关于安全模型,您不应该首先在内核上下文中运行用户空间代码(在内核上下文中自动被认为是不安全的代码),因为这将破坏内核中的安全模型。那一瞬间。现在考虑上述所有内容,以及许多其他动机,您可能需要重新考虑您的方法并专注于内核<->IPC和接口,文件系统或用户模式帮助程序API(阅读下面)。

不过,您可以使用usermode-helper API从内核调用用户空间应用程序。以下IBM
DeveloperWorks文章应该使您开始使用usermode-helper Linux内核API:

内核API,第1部分:从内核调用用户空间应用程序



 类似资料:
  • 问题内容: 我正在尝试打电话 直接,但获得EFAULT错误代码。出现此错误是因为 buf 指向内核空间中的内存。 那么,是否有可能从内核分配用户空间内存? 与 内核内存相似并返回指向内核内存的指针。 问题答案: 您可以使用以下方法临时禁用内存地址有效性检查:

  • 问题内容: Linux内核内部用户内存和内核内存的区别是什么 (就给内核空间提供安全性而言)? 我可以从用户空间在内核地址空间中写入什么不同的方式? 我知道的一种方法是通过系统调用 。我们可以使用多个系统调用,但最后它们都是系统调用。即使在系统调用中,我们也将数据发送到内核空间,在此它(驱动程序或相应的模块)调用诸如copy_from_user()之类的函数将数据从用户空间复制到内核空间。在这里,

  • 问题内容: 我知道udev在linux系统上运行,并且它通过netlink套接字接收从内核发送的uevent。 但是,我的问题是: 内核如何发出事件?它必须是通过添加/删除设备触发的,然后将事件发送给udev。内核如何做到这一点?(是否可以找到任何代码示例?) udev仅通过netlink套接字接收这些uevent。这是udev做到这一点的唯一方法。它是否正确? 当uevent从内核发出时,我知道

  • 问题内容: 我的问题是关于将数据从内核传递到用户空间程序。我想实现一个系统调用“ get_data(size,char * buff,char ** meta_buf)”。在此调用中,buff由用户空间程序分配,并且其长度在size参数中传递。但是,meta_buf是可变长度的缓冲区,已分配(在用户空间程序的vm页面中)并由内核填充。用户空间程序将释放该区域。 (我无法在用户空间中分配数据,因为用

  • 内核命名空间 Docker 容器和 LXC 容器很相似,所提供的安全特性也差不多。当用 docker run 启动一个容器时,在后台 Docker 为容器创建了一个独立的命名空间和控制组集合。 命名空间提供了最基础也是最直接的隔离,在容器中运行的进程不会被运行在主机上的进程和其它容器发现和作用。 每个容器都有自己独有的网络栈,意味着它们不能访问其他容器的 sockets 或接口。不过,如果主机系统

  • 问题内容: 似乎在Windows 32位上,内核将从全部4G用户虚拟内存空间中保留1G虚拟内存,并将 某些 内核空间映射到此1G空间中。 所以我的问题是: 在32位Linux上是否有类似情况? 如果是这样,我们如何看到整个内存布局? 我认为 只能看到某些过程的用户空间布局。 谢谢! 问题答案: 实际上,在32位Windows上,如果没有引导选项,内核将映射到线性地址空间的前2GB,剩下2GB的空间