Solaris 动态跟踪指南

指针和地址空间

指针是一个地址,用于将某些虚拟地址空间转换为物理内存块。DTrace 在操作系统内核本身的地址空间中执行 D 程序。整个 Solaris 系统将管理许多地址空间:操作系统内核使用一个地址空间,每个用户进程也使用一个地址空间。因为每个地址空间表现为它可以访问系统上的所有内存,所以同一虚拟地址指针值可在地址空间中重复使用,但会转换为不同的物理内存。因此,在编写使用指针的 D 程序时,必须注意对应于要使用的指针的地址空间。

例如,如果使用 syscall 提供器来检测将指向整数或整数数组的指针作为参数(如 pipe(2))的系统调用入口,则使用 *[] 运算符来对指针或数组取消引用是无效操作,因为要使用的地址是执行系统调用的用户进程地址空间中的地址。在 D 中,对此地址应用 *[] 运算符将导致内核地址空间访问,这又将导致无效地址错误或对 D 程序返回意外数据(取决于地址是否与有效内核地址相匹配)。

要通过 DTrace 探测器访问用户进程内存,必须对用户地址空间指针应用第 10 章中介绍的 copyin()copyinstr()copyinto() 函数之一。要注意的是,为了避免混淆,在编写 D 程序时应对存储用户地址的变量进行相应的命名和注释。还可将用户地址存储为 uintptr_t,这样就不会无意中编译取消引用它们 的 D 代码。第 33 章中介绍了在用户进程中使用 DTrace 的方法。