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