Linux kernel 哪个司机在处理我的IOCTL

Linux kernel 哪个司机在处理我的IOCTL,linux-kernel,driver,linux-device-driver,embedded-linux,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以查找哪个驱动程序注册了该主要编号。 这里一定有类似的情况 鱼 您正在对表示套接字的filedescriptor调用ioctl。如果检查net/

我正在打开一个插座,如下所示:
skfd=socket(AF_INET,SOCK_DGRAM,0)
然后在skfd上执行ioctl,如:
ioctl(skfd、SIOCETHTOOL和ifr)

我想知道哪个驱动程序在我的内核中处理这个IOCTL。
我知道如果它是一个字符驱动程序,我可以查找我正在打开的文件的主要编号,然后执行
cat/proc/devices
以查找哪个驱动程序注册了该主要编号。
这里一定有类似的情况

鱼 您正在对表示套接字的filedescriptor调用ioctl。如果检查
net/socket.c
文件,您会发现
socket\u file\u ops
结构将
sock\u ioctl
定义为ioctl回调。对于
SIOCETHTOOL
,此函数将调用
sock\u do\u ioctl
,然后(在检查此特定套接字类型(AF\u INET-AF\u INET.c,INET\u ioctl函数)本身不处理此ioctl)将调用
dev\u ioctl
,它可以通过调用
dev\u ethtool
处理
siocetool
。如果驱动程序定义了
ethtool\u ops
,则应支持此操作

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

因此,我的以太网卡由模块
e1000e
驱动

钓竿 现在我通过阅读代码发现了这一点。我确实知道一些内核代码,所以我知道我应该去哪里找。但是,如果我不这样做,还有其他方法可以找到这种追踪。现在我不确定这一切是否都能在2.6.32上运行,但至少我在内核3.2上测试了这一点(它没有太大的不同)。我不会详细介绍如何将内核配置为具有所有这些功能。Ubuntu 12.04提供了所需的一切,如果您对谷歌的
ftrace
感兴趣:

您需要装入
debugfs
并使用如下脚本:

#!/bin/sh
DEBUGFS=`/sys/kernel/debug/`
echo $$ > $DEBUGFS/tracing/set_ftrace_pid
echo function > $DEBUGFS/tracing/current_tracer
exec $*
此脚本将
ftrace
设置为只关心当前PID,启用函数跟踪程序并执行指定为参数的命令(不分叉,因为那样会更改PID)

现在,如果使用此ioctl的应用程序是
/tmp/a.out
,则可以调用:

~/bin/ftraceme.sh /tmp/a.out
echo -n "" > /sys/kernel/debug/tracing/current_tracer
grep ioctl /sys/kernel/debug/tracing/trace
就我而言,我有:

<...>-11009 [007] 596251.750675: sys_ioctl <-system_call_fastpath    (1)
<...>-11009 [007] 596251.750675: fget_light <-sys_ioctl
<...>-11009 [007] 596251.750675: security_file_ioctl <-sys_ioctl
<...>-11009 [007] 596251.750676: cap_file_ioctl <-security_file_ioctl
<...>-11009 [007] 596251.750676: do_vfs_ioctl <-sys_ioctl
<...>-11009 [007] 596251.750676: sock_ioctl <-do_vfs_ioctl           (2)
<...>-11009 [007] 596251.750677: sock_do_ioctl <-sock_ioctl          (3)
<...>-11009 [007] 596251.750677: inet_ioctl <-sock_do_ioctl          (4)
<...>-11009 [007] 596251.750677: udp_ioctl <-inet_ioctl
<...>-11009 [007] 596251.750678: dev_ioctl <-sock_do_ioctl           (5)
<...>-11009 [007] 596251.750678: _cond_resched <-dev_ioctl
<...>-11009 [007] 596251.750679: dev_load <-dev_ioctl
<...>-11009 [007] 596251.750680: rtnl_lock <-dev_ioctl
<...>-11009 [007] 596251.750680: dev_ethtool <-dev_ioctl             (6)
<...>-11009 [007] 596251.750684: rtnl_unlock <-dev_ioctl
<...>-11009 [007] 596251.750685: _cond_resched <-dev_ioctl

-11009[007]596251.750675:sys\u ioctl我建议对内核进行grep。grep上显示在drivers文件夹中的文件(当然,在其他文件夹中没有麻烦执行grep)是我的配置没有使用的文件,例如,我没有使用的设备的驱动程序,我怎么知道?我发现这些文件还没有被编译。我使用的是内核2.6.32,实际上这是一个已经在这个系统中使用了好几年的内核。那么这是否意味着在这个内核中我将无法使用ethtool呢。能给我一些补丁吗。我从哪里得到它?只需通过命令“find/sys | grep drivers.*”列出系统中使用的所有驱动程序,并尝试猜测可能使用的以太网或其他设备。您的答案非常有说服力,只是它(尚未)对我起作用。我安装了sysfs,并运行命令
readlink/sys/class/net/eth0/device/driver/module
。输出一点也没有。实际上,文件夹
readlink/sys/class/net/eth0/device/driver/
的内容是一个文件
bind
,然后
uevent
unbind
和3个符号链接
e0082200.ucc->../../../../../../devices/e008000.qe/e082200.ucc
e083400.ucc->../../../../../devices/e080000.qe/e083400.ucc
e0083600.ucc->../../../../../../../devices/e0080000.qe/e0083600.ucc
因此那边没有名为
模块的文件。这是不同的场景还是什么,同样的东西在我的ubuntu 12.04系统上对我有效。我正在深入研究
ftrace
。Thnx。@mdsingh:也许您的驱动程序不是作为模块编译的,而是在中编译的。它似乎是一个PCI卡,请尝试使用
lspci-v
查找驱动程序。您还可以返回一步,查看链接到的
/sys/class/net/eth0/device/driver
是什么。
lspci-v
的输出是
00:00.0 class 0604:Unknown device 1957:0061(rev 21)标志:总线主设备、快速devsel、延迟0内存(32位、不可预取)总线:primary=00、secondary=01、subsible=01,秒延迟=0桥后I/O:00000000-00000桥后FFF内存:80000000-8fffffff功能:[44]电源管理版本2功能:[4c]快速根端口(插槽-)IRQ 0功能:[100]高级错误报告
ls-l/sys/class/net/eth0/device的输出
is
driver->../../../bus/of_platform/drivers/ucc_geth
,以及其他长列表。你从中得到了什么
<...>-11009 [007] 596251.750675: sys_ioctl <-system_call_fastpath    (1)
<...>-11009 [007] 596251.750675: fget_light <-sys_ioctl
<...>-11009 [007] 596251.750675: security_file_ioctl <-sys_ioctl
<...>-11009 [007] 596251.750676: cap_file_ioctl <-security_file_ioctl
<...>-11009 [007] 596251.750676: do_vfs_ioctl <-sys_ioctl
<...>-11009 [007] 596251.750676: sock_ioctl <-do_vfs_ioctl           (2)
<...>-11009 [007] 596251.750677: sock_do_ioctl <-sock_ioctl          (3)
<...>-11009 [007] 596251.750677: inet_ioctl <-sock_do_ioctl          (4)
<...>-11009 [007] 596251.750677: udp_ioctl <-inet_ioctl
<...>-11009 [007] 596251.750678: dev_ioctl <-sock_do_ioctl           (5)
<...>-11009 [007] 596251.750678: _cond_resched <-dev_ioctl
<...>-11009 [007] 596251.750679: dev_load <-dev_ioctl
<...>-11009 [007] 596251.750680: rtnl_lock <-dev_ioctl
<...>-11009 [007] 596251.750680: dev_ethtool <-dev_ioctl             (6)
<...>-11009 [007] 596251.750684: rtnl_unlock <-dev_ioctl
<...>-11009 [007] 596251.750685: _cond_resched <-dev_ioctl