在 Linux 上用 strace 来理解系统调用


在 Linux 上用 strace 来理解系统调用

文章插图
 
使用 strace 跟踪用户进程和 linux 内核之间的交互 。-- Gaurav Kamathe(作者)
系统调用(system call)是程序从内核请求服务的一种编程方式,而 strace 是一个功能强大的工具,可让你跟踪用户进程与 Linux 内核之间的交互 。
要了解操作系统的工作原理,首先需要了解系统调用的工作原理 。操作系统的主要功能之一是为用户程序提供抽象机制 。
操作系统可以大致分为两种模式:
  • 内核模式:操作系统内核使用的一种强大的特权模式
  • 用户模式:大多数用户应用程序运行的地方 用户大多使用命令行实用程序和图形用户界面(GUI)来执行日常任务 。系统调用在后台静默运行,与内核交互以完成工作 。
系统调用与函数调用非常相似,这意味着它们都接受并处理参数然后返回值 。唯一的区别是系统调用进入内核,而函数调用不进入 。从用户空间切换到内核空间是使用特殊的 trap 机制完成的 。
通过使用系统库(在 Linux 系统上又称为 glibc),大部分系统调用对用户隐藏了 。尽管系统调用本质上是通用的,但是发出系统调用的机制在很大程度上取决于机器(架构) 。
本文通过使用一些常规命令并使用 strace 分析每个命令进行的系统调用来探索一些实际示例 。这些示例使用 Red Hat Enterprise Linux,但是这些命令运行在其他 Linux 发行版上应该也是相同的:
首先,确保在系统上安装了必需的工具 。你可以使用下面的 rpm 命令来验证是否安装了 strace 。如果安装了,则可以使用 -V 选项检查 strace 实用程序的版本号:
如果没有安装,运行命令安装:
出于本示例的目的,在 /tmp 中创建一个测试目录,并使用 touch 命令创建两个文件:
(我使用 /tmp 目录是因为每个人都可以访问它,但是你可以根据需要选择另一个目录 。)
在 testdir 目录下使用 ls 命令验证该文件已经创建:
你可能每天都在使用 ls 命令,而没有意识到系统调用在其下面发挥的作用 。抽象地来说,该命令的工作方式如下:
命令行工具 -> 从系统库(glibc)调用函数 -> 调用系统调用
ls 命令内部从 Linux 上的系统库(即 glibc)调用函数 。这些库去调用完成大部分工作的系统调用 。
如果你想知道从 glibc 库中调用了哪些函数,请使用 ltrace 命令,然后跟上常规的 ls testdir/命令:
如果没有安装 ltrace,键入如下命令安装:
大量的输出会被堆到屏幕上;不必担心,只需继续就行 。ltrace 命令输出中与该示例有关的一些重要库函数包括:
通过查看上面的输出,你或许可以了解正在发生的事情 。opendir 库函数打开一个名为 testdir 的目录,然后调用 readdir 函数,该函数读取目录的内容 。最后,有一个对 closedir 函数的调用,该函数将关闭先前打开的目录 。现在请先忽略其他 strlen 和 memcpy 功能 。
你可以看到正在调用哪些库函数,但是本文将重点介绍由系统库函数调用的系统调用 。
与上述类似,要了解调用了哪些系统调用,只需将 strace 放在 ls testdir 命令之前,如下所示 。再次,一堆乱码丢到了你的屏幕上,你可以按照以下步骤进行操作:
运行 strace 命令后屏幕上的输出就是运行 ls 命令的系统调用 。每个系统调用都为操作系统提供了特定的用途,可以将它们大致分为以下几个部分:
  • 进程管理系统调用
  • 文件管理系统调用
  • 目录和文件系统管理系统调用
  • 其他系统调用
分析显示到屏幕上的信息的一种更简单的方法是使用 strace 方便的 -o 标志将输出记录到文件中 。在 -o 标志后添加一个合适的文件名,然后再次运行命令:
这次,没有任何输出干扰屏幕显示,ls 命令如预期般工作,显示了文件名并将所有输出记录到文件 trace.log 中 。仅仅是一个简单的 ls 命令,该文件就有近 100 行内容:
让我们看一下这个示例的 trace.log 文件的第一行:
  • 该行的第一个单词 execve 是正在执行的系统调用的名称 。
  • 括号内的文本是提供给该系统调用的参数 。
  • 符号 = 后的数字(在这种情况下为 0)是 execve 系统调用的返回值 。
现在的输出似乎还不太吓人,对吧 。你可以应用相同的逻辑来理解其他行 。
现在,将关注点集中在你调用的单个命令上,即 ls testdir 。你知道命令 ls 使用的目录名称,那么为什么不在 trace.log 文件中使用 grep 查找 testdir 并查看得到的结果呢?让我们详细查看一下结果的每一行:


推荐阅读