linux - 列出从用户空间到内核空间的 ioctl 调用

标签 linux linux-kernel ioctl

可能是我的问题听起来更天真。

但我想知道是否可以列出 Linux 中从用户空间到内核空间的 ioctl 调用。

最佳答案

使用LTTng .如果您使用的是 Ubuntu、Fedora、Arch Linux、Debian 或 openSUSE,这是一个现代 Linux 内核跟踪器(也适用于用户领域),可在几秒钟内安装(作为软件包提供)。不然还是容易getting the tarballs并遵循安装程序。

追踪

您创建这样的跟踪:

$ sudo lttng create mySession
Session mySession created.
Traces will be written in /home/user/lttng-traces/mySession-20120619-103600
$ sudo lttng enable-event -k -a --syscall
All kernel system calls are enabled in channel channel0
$ sudo lttng start
Tracing started for session mySession

然后做你平常的事情。所有系统调用,包括 ioctl,都由 LTTng 使用有趣的参数记录/捕获。正在将跟踪写入 /home/user/lttng-traces/mySession-20120619-103600 目录。完成录制后,请执行以下操作:

$ sudo lttng stop
Tracing stopped for session mySession
$ sudo lttng destroy
Session mySession destroyed at /home/ephipro

虽然 destroy 在这里听起来不太好,但它实际上并没有destroy 跟踪文件;它只是刷新所有内容并释放所有指向文件的链接。

sudo 在任何地方都需要,因为您正在跟踪内核事件。出于明显的安全原因,您不希望任何用户看到所有系统调用及其参数。

查看轨迹

现在有两个主要查看器可用。 Babeltrace 将为您提供所有捕获事件的文本输出。您应该能够使用 apt-get (babeltrace) 获取它,否则只需获取 latest tarball .然后只需使用 grep 从巨大的转储 Babeltrace 输出中提取 ioctl 调用:

$ sudo babeltrace /home/user/lttng-traces/mySession-20120619-103600 | grep ioctl
[10:36:41.795425690] (+0.000001403) sys_ioctl: { 1 }, { fd = 18, cmd = 62981, arg = 0 }
[10:36:41.795435996] (+0.000000610) sys_ioctl: { 1 }, { fd = 18, cmd = 2148070920, arg = 139928632507464 }
[10:36:41.795573431] (+0.000008840) sys_ioctl: { 1 }, { fd = 18, cmd = 62982, arg = 4096 }
[10:36:41.795591089] (+0.000000854) sys_ioctl: { 1 }, { fd = 18, cmd = 62981, arg = 38520960 }
[10:36:41.795595956] (+0.000000434) sys_ioctl: { 1 }, { fd = 18, cmd = 2148070920, arg = 139928632507464 }
[10:36:41.796125261] (+0.000006110) sys_ioctl: { 1 }, { fd = 18, cmd = 62982, arg = 0 }
[10:36:41.796185722] (+0.000000947) sys_ioctl: { 1 }, { fd = 18, cmd = 62981, arg = 38530304 }
[10:36:41.796192688] (+0.000000628) sys_ioctl: { 1 }, { fd = 18, cmd = 2148070920, arg = 139928632507464 }
[10:36:41.797155511] (+0.000003280) sys_ioctl: { 0 }, { fd = 18, cmd = 62982, arg = 0 }
[10:36:41.797202362] (+0.000001995) sys_ioctl: { 0 }, { fd = 18, cmd = 62981, arg = 38529760 }
...

您在这里看到的是事件发生的时间、事件名称及其所有参数和值。

Eclipse 还在 Linux 工具插件项目中提供了一个完整的 LTTng 查看器。简单的步骤是:

  1. 转到 eclipse.org's download page
  2. 进入 Developer Builds(直到 Eclipse Juno 几天后发布),获取 Eclipse IDE for C/C++ Developers
  3. 解压并启动

从 Eclipse Juno 开始,Linux Tools 被嵌入到 Eclipse IDE 中,供 C/C++ 开发人员使用。

然后您可以创建一个新的Tracing 项目 并导入跟踪。如果您打开 Tracing 透视图,您将可以访问有用的 View 来可视化事件。以下是直方图事件 View 的示例:

Eclipse LTTng viewer

在这里,我使用事件 View 只保留 ioctl 调用,您可以清楚地看到内容和时间戳与 Babeltrace 输出匹配。

关于linux - 列出从用户空间到内核空间的 ioctl 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11097628/

相关文章:

swift - 在 Swift 中获取 ioctl 数字

c - 如何使用 C 获取 OS X 上所有接口(interface)的 IP 地址

linux - 如何使用命令行删除文件夹中特定文件类型的所有文件

linux - 在 Linux 内核 3.8.13-rt16 中启用外设

linux - shell 的 Ubuntu 16.04 汇编代码

gcc - "js 2f\n\t"中的 f 是什么意思?

linux - 如何在启动时将值传递给内置的 Linux 内核模块?

c - 存储大小未知

linux - 鼠标和键盘在带有最新埃图像的 beagleboard 的 qemu 仿真中不起作用

linux - chroot 中的基本库集(fedora linux)