syscall 提供器可在系统中每个系统调用的入口和返回位置提供探测器。因为系统调用是用户级应用程序和操作系统内核之间的主要接口,所以 syscall 提供器可以对系统相关的应用程序行为提供全面监测。
syscall 为每个系统调用都提供一对探测器:在进入系统调用之前触发的 entry 探测器,和在系统调用完成后,但在将控制传送回用户级之前触发的 return 探测器。对于所有 syscall 探测器,函数名称将设置为受检测的系统调用的名称,但对模块名称未定义。
可以在 /etc/name_to_sysnum 文件中找到 syscall 提供器提供的系统调用的名称。通常,syscall 提供的系统调用名称对应于手册页的第 2 节中的名称。但是,syscall 提供器提供的一些探测器不直接与任何记录的系统调用对应。本节中对此差异的一般原因作了说明。
在一些情况下,syscall 提供器提供的系统调用的名称实际上是旧的实现详细信息的反映。例如,因为一些追溯到 UNIXTM 的过去的原因,/etc/name_to_sysnum 中 exit(2) 的名称为 rexit。类似地,time(2) 的名称为 gtime,execle(2) 和 execve(2) 的名称为 exece。
第 2 节中说明的一些系统调用实现为未记录的系统调用的子操作。例如,与 System V 信号(semctl(2)、semget(2)、semids(2)、semop(2) 和 semtimedop(2))相关的系统调用实现为单个系统调用 semsys 的子操作。semsys 系统调用将特定于实现的子代码作为其第一个参数,该子代码表示所需的特定系统调用:SEMCTL、SEMGET、SEMIDS、SEMOP 或 SEMTIMEDOP。由于过载一个系统调用以实现多个系统调用,所以对于 System V 信号仅有一对 syscall 探测器:syscall::semsys:entry 和 syscall::semsys:return。
支持大小超过 4GB 的大文件的 32 位程序必须能够处理 64 位文件偏移。因为大文件需要使用大偏移,所以通过一组并行的系统接口处理大文件,如 lf64(5) 中所述。lf64 中记录了这些接口,但这些接口没有单独的手册页。如表 21–1 中所示,每一个大文件系统调用接口都显示为各自的 syscall 探测器。
表 21–1 sycall 大文件探测器
大文件 syscall 探测器 |
系统调用 |
---|---|
creat64 | |
fstat64 | |
fstatvfs64 | |
getdents64 | |
getrlimit64 | |
lstat64 | |
mmap64 | |
open64 | |
pread64 | |
pwrite64 | |
setrlimit64 | |
stat64 | |
statvfs64 |
一些系统调用为跨越用户内核边界的 Solaris 子系统的专用实现详细信息。同样地,这些系统调用在第 2 节中没有手册页。此类别中的系统调用示例包括 signotify 系统调用(用作实 现 POSIX.4 消息队列的一部分)和 utssys 系统调用(用于实现 fuser(1M))。
对于 entry 探测器,参数 (arg0 .. argn) 是系统调用的参数。对于 return 探测器,arg0 和 arg1 包含返回值。D 变量 errno 中的非零值指示系统调用失败。
syscall 提供器使用 DTrace 的稳定性机制描述其稳定性,如下表所示。有关稳定性机制的更多信息,请参阅第 39 章。
元素 |
名称稳定性 |
数据稳定性 |
相关性类 |
---|---|---|---|
提供器 |
发展中 |
发展中 |
公用 |
模块 |
专用 |
专用 |
未知 |
功能 |
不稳定 |
不稳定 |
ISA |
名称 |
发展中 |
发展中 |
公用 |
参数 |
不稳定 |
不稳定 |
ISA |