Linux 中是否可以从内核空间调用用户空间回调函数(ioctl)?

2023-11-21

是否可以扩展Linux中的ioctl接口,以便用户空间应用程序可以将指向函数的指针发送到内核空间驱动程序?

我特别考虑以用户可控的方式处理流但在内核中进行的方法。这些操作可以附加到内核模块,但这将使开发变得更加容易,因为我不需要在开发过程中弄乱内核。

更具体地说,这将是一个过程:

  1. 数据由驱动程序读取到缓冲区。
  2. 数据由这些用户定义的函数就地处理。
  3. 还进行了更多处理,可能使用一些硬件块。
  4. 数据由用户空间应用程序使用。

我认为您可以通过让驱动程序提供用户空间应用程序打开的一个或多个字符设备(或块设备)来实现您想要的目的。

然后你可以使用inotify (Linux 期刊文章) 用于内核->用户空间事件通信。 Ioctl 或写入设备以进行用户空间->内核事件通信。数据交换也可以通过读/写一个或多个设备文件来实现。

或者,您可以提供 /proc 或 /sys 文件系统条目或使用 netlink。

您也可以考虑ksocket:

Ksocket是linux 2.6内核模块 提供bsd风格的socket 接口(即套接字、绑定、 倾听、联系、接受……) 内核开发人员以方便他们 Linux内核中的网络编程 空间。 ksocket 提供的接口与其等效接口非常相似 在 glibc 中,所以即使是新开发人员 内核空间将没有障碍 开发内核网络相关 程序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux 中是否可以从内核空间调用用户空间回调函数(ioctl)? 的相关文章

  • 读取文件而不从操作系统页面缓存中逐出

    这主要适用于 Linux 或者理想情况下适用于任何 POSIX 系统 当我阅读以下页面时 我正在寻找一种读取大量文件 其中任何一个文件本身可能高达 1GB 的方法 具有以下特征 如果相关磁盘页面已在文件系统缓存中 则使用该页面 如果相关页面
  • 编译内核进行页表遍历时出现错误

    我正在执行页表遍历 当我准备更新内核时出现错误 kernel sys c In function do sys get page info kernel sys c 2745 23 error passing argument 1 of p
  • 这些工作队列标志意味着什么?

    在研究工作队列时 我遇到了内核中定义的工作队列标志和常量 我有以下我无法理解的疑问 这里的排水和救援到底是什么意思 WQ DRAINING 1 lt lt 6 internal workqueue is draining WQ RESCUE
  • 在用户程序中使用 或在驱动程序模块代码中使用 ...这有关系吗?

    我正在开发一个设备驱动程序模块和关联的用户库来处理ioctl 来电 该库获取相关信息并将其放入一个结构中 该结构被传递到驱动程序模块中并在那里解压 然后进行处理 我省略了很多步骤 但这就是总体思路 一些数据通过结构体传递ioctl is u
  • Linux 上的“软/硬 nofile”是什么意思

    当我尝试在RedHat EL5上安装软件时 我得到了错误 软 硬nofile的期望值是4096 而默认值是1024 我设法增加了这个数字 但我不知道参数是什么 他们指的是软链接和硬链接吗 我改变的方法是 a 修改 etc security
  • ftrace 是否允许捕获 Linux 内核的系统调用参数,或者仅捕获函数名称?

    目标是检查任何进程传递给特定系统调用 例如 exec open 等 的参数 来自官方文档 https www kernel org doc Documentation trace ftrace txt 没有描述记录函数参数的功能 主要查看
  • 未找到 DEADLINE 调度策略

    我想在 C 中实现 DEADLINE 调度策略 我知道该功能已实现Linux 3 14 10我正在使用 Ubuntu 14 04Linux 3 17 0 031700 lowlatency 201410060605 SMP PREEMPT这
  • Windows 内核中可能的最大文件名长度

    我想知道 什么是longestWindows 内核允许的可能名称长度 例如 我知道内核使用UNICODE STRING结构来保存所有对象路径 并且由于宽字符字符串的字节长度存储在USHORT 允许最大路径长度为 2 15 1 个字符 有没有
  • 已编译 LKM 的互换性

    是否可以使用可加载内核模块 编译为3 0 8 mod unload ARMv5 我自制的内核 在具有版本的内核中3 0 31 gd5a18e0 SMP preempt mod unload ARMv7 安卓股票内核 该模块本身几乎不包含任何
  • Linux 内核运行稀疏失败 - /bin/sh: 1:稀疏: 未找到

    我在 Linux 内核上运行稀疏 但它会抛出以下错误 在 Linux 上运行稀疏 lovegcy knltest VirtualBox git root linux make C 2make 1 不对 all 执行任何操作 HOSTCC a
  • 如何使用 ioread64() 和 iowrite64() 访问 IO 内存?

    背景 我目前正在编写一个设备驱动程序教育设备 https github com qemu qemu blob master hw misc edu c在 qemu RISC V 中 由此question https stackoverflo
  • 在内核中创建一个简单的只写过程条目

    include
  • linux新手关于嵌入式linux设备驱动的问题

    最近在研究linux驱动 正如我读过的那些文章所说 设备驱动程序模块很可能会根据内核的需要自动加载 因此我想知道内核如何确定为特定设备 声卡 I2C spi 设备 等 我也无法彻底想象内核如何在启动时检测每个硬件设备 与嵌入式linux相关
  • 简单内核无法在 GRUB 中启动

    我正在学习一些操作系统开发的知识OSDev org http osdev org 我有一个内核 我正在尝试使用 qemu 在 GRUB Legacy 0 97 中启动 但是 当我输入kernel 200 9 我收到消息 Multiboot
  • 在 Google Colab 中重新启动内核

    我正在尝试通过单元重新启动 Google Colab Jupyter Notebook 中的内核 前面给出的选项 import os os exit 00 没问题 但在我看来 这不是一种非常 Pythonic 的重新启动内核的方式 另一种选
  • 内核的panic()函数是否完全冻结所有其他进程?

    我想确认内核的panic 功能和其他类似kernel halt and machine halt 一旦触发 保证机器完全冻结 那么 所有的内核和用户进程都被冻结了吗 是panic 可以被调度程序中断吗 中断处理程序仍然可以执行吗 用例 如果
  • Linux 内核模块中的文件 I/O

    我正在编写一个需要打开和读取文件的 Linux 内核模块 实现这一目标的最佳方法是什么 我能问一下你为什么要打开文件吗 我喜欢关注Linux开发 出于好奇 我不是内核开发人员 我是做Java的 而且我以前看过关于这个问题的讨论 我找到了一个
  • 尽管 EXPORT_SYMBOL 模块插入时出现“模块中的未知符号”

    我正在尝试编译并插入 r8169 realtek 以太网驱动程序 我的内核版本是 ebin sony uname r 4 2 0 rc3 custom 我的本地磁盘中有相同的完整源代码 用于安装当前的内核 当我运行时该模块编译成功make
  • Linux 内核 - 如何停止等待信号量的 kthread?

    在编写 Linux 内核模块时 我遇到了一个 kthread 问题 在等待信号量解锁时无法唤醒该 kthread 这会导致线程不可停止并且rmmod尝试卸载模块时冻结 请注意 该模块在 3 10 内核上运行 我无法将其更新到较新的版本 客户
  • 跟踪数据包通过内核 (linux)

    我有两台机器设置为使用 Ip Security 机器 A 我们称它们为 A 和 B 有一个套接字 该套接字绑定到本地机器上的特定 UDP 端口 并且它经常轮询它以查看是否收到任何内容在上面 当我禁用 IP 安全性时 两台机器之间的数据可以正

随机推荐