用户进程如何访问我的模块加载的字符设备

时间:2011-10-04 20:27:57

标签: linux unix module system-calls ioctl

我试图在内核中动态加载系统调用(不重新启动内核并编译它),试图(一旦在内核模式下)写入用户进程的内存。

(我知道有一种方法可以使用ptrace接口,但它不是一个选项。)

我知道唯一的方法是加载一个模块。为了让用户与之通信,我被告知要使用一个字符设备(应该是/ dev /,对吧?)。我成功装了一个。 我的问题是我不知道用户进程如何在没有系统调用的情况下访问它。 (我被告知使用ioctl) 任何人都可以显示用户进程如何调用ioctl,例如我的模块加载了吗?

谢谢, 晒

1 个答案:

答案 0 :(得分:0)

  

对于下面的答案,我假设您正在开发一个Linux模块。在重读你的问题后,我发现我可能误解了这个问题。


有几种与内核驱动程序通信的机制:

  • /proc条目(又名 procfs
  • ioctl 通过设备界面
  • 直接通过设备界面

最常用的技术是使用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。元数据方法与任何其他设备驱动程序一样易于编码,但它可能会给经验丰富的实施者带来概念上的障碍。