我试图在内核中动态加载系统调用(不重新启动内核并编译它),试图(一旦在内核模式下)写入用户进程的内存。
(我知道有一种方法可以使用ptrace接口,但它不是一个选项。)
我知道唯一的方法是加载一个模块。为了让用户与之通信,我被告知要使用一个字符设备(应该是/ dev /,对吧?)。我成功装了一个。 我的问题是我不知道用户进程如何在没有系统调用的情况下访问它。 (我被告知使用ioctl) 任何人都可以显示用户进程如何调用ioctl,例如我的模块加载了吗?
谢谢, 晒
答案 0 :(得分:0)
对于下面的答案,我假设您正在开发一个Linux模块。在重读你的问题后,我发现我可能误解了这个问题。
有几种与内核驱动程序通信的机制:
最常用的技术是使用read()
和/或write()
系统调用来引发驱动程序操作的最后一种技术。虽然这些系统调用通常会传递纯数据,但没有什么能阻止特定驱动程序通过I / O接口传递metadata。
另一方面,如果驱动程序已经有一个有用的纯数据规则,read()
和write()
对元数据不利,那么ioctl()
系统调用就是一种通用瑞士军刀,用于处理与文件相关的各种事物,例如装载或卸载磁带,弹出DVD,查找网卡的以太网地址,或查找发生了多少磁盘驱动器错误。已经定义了很多 ioctl 操作代码,您可以找到一个合理的操作代码来重复使用。 ioctl
接口的一大缺点是它最适合自定义程序使用,因此通过连接到标准程序管道的ioctl
传输数据会很困难或很困难。 / p>
/proc
接口结合了前两种技术中最好的一种:它可以在标准实用程序中使用stdin
/ stdout
约定,但它也提供了一个设备接口通过常规驱动程序机制独立于任何i / o的驱动程序。例如,在Linux系统上尝试cat /proc/net/tcp
。它显示了所有TCP
个连接的状态。
有关实施 procfs 功能的好文章位于create_proc_entry()
。实现ioctl得到了很好的覆盖here。元数据方法与任何其他设备驱动程序一样易于编码,但它可能会给经验丰富的实施者带来概念上的障碍。