哪个驱动程序正在处理我的IOCTL

时间:2015-07-29 11:09:33

标签: linux-kernel driver linux-device-driver embedded-linux

我打开这样的套接字: skfd = socket( AF_INET, SOCK_DGRAM, 0 ); 然后在skfd上做一个ioctl,如:ioctl(skfd, SIOCETHTOOL, &ifr)
我想知道哪个驱动程序正在我的内核中处理这个IOCTL 我知道如果它是一个字符驱动程序,我可以查找我打开的文件的主要编号,然后执行cat /proc/devices查找哪个驱动程序已注册该主要编号。
这里必须有类似的方式。

1 个答案:

答案 0 :(得分:5)

您正在代表套接字的filedescriptor上调用ioctl。如果检查net/socket.c文件,您会发现socket_file_ops结构将sock_ioctl定义为ioctl回调。对于SIOCETHTOOL,此函数将依次调用sock_do_ioctl(在检查此特定套接字类型(AF_INET - af_inet.c,inet_ioctl函数)本身不处理此ioctl之后)将调用{{1通过调用dev_ioctl可以处理SIOCETHTOOL。如果您的驱动程序定义了dev_ethtool,则应该支持此功能。

现在找到哪个设备驱动程序支持您的网络接口是另一回事,但这并不困难。一种方法是使用sysfs,只需检查指向的符号链接是什么(用您的接口名称替换ethtool_ops):

eth0

所以我的以太网卡由模块readlink /sys/class/net/eth0/device/driver/module ../../../../module/e1000e 驱动。

钓竿

现在我通过阅读代码找到了这个。我对内核代码知之甚少,所以我知道应该在哪里看。但是,如果我不这样做,还有另外一种方法可以找到它 - 追踪。现在我不确定这一切是否都适用于2.6.32,但至少我在内核3.2上测试了这一点(并没有那么多不同)。我不会详细介绍如何配置内核以获得所有这些功能。 Ubuntu 12.04已经满足了所有需要,如果您对谷歌感兴趣e1000e

你需要安装ftrace和这样的脚本:

debugfs

此脚本将#!/bin/sh DEBUGFS=`/sys/kernel/debug/` echo $$ > $DEBUGFS/tracing/set_ftrace_pid echo function > $DEBUGFS/tracing/current_tracer exec $* 设置为仅关注当前PID,启用函数跟踪器并执行指定为参数的命令(不会因为这会改变PID)。

现在,如果使用此ioctl的应用程序是ftrace,您可以致电:

/tmp/a.out

就我而言,我有:

~/bin/ftraceme.sh /tmp/a.out
echo -n "" > /sys/kernel/debug/tracing/current_tracer
grep ioctl /sys/kernel/debug/tracing/trace

这证明了我上面写的内容。