Solaris 动态跟踪指南

指针和地址

Solaris 操作系统使用称为虚拟内存的技术,在您的系统中为每个用户进程提供独立的内存资源的虚拟视图。内存资源的虚拟视图又称为地址空间,它将一定范围的地址值(用于 32 位地址空间的 [0 ... 0xffffffff] 或者用于 64 位地址空间的 [0 ... 0xffffffffffffffff])与一组转换相关联,操作系统和硬件使用这些转换将每个虚拟地址转换为相应的物理内存位置。D 中的指针是一些数据对象,用于存储整数虚拟地址值并将其与 D 类型(说明存储在相应内存位置中数据的格式)关联。

可通过以下方式将某个 D 变量声明为指针类型:首先指定被引用数据的类型,然后将星号 (*) 附加到类型名称中以指示要声明指针类型。例如,D 编译器在内部使用以下声明:

int *p;

声明了名为 p 的 D 全局变量,它是指向整数的指针。此声明意味着 p 本身是大小为 32 位或 64 位的整数,它的值表示位于内存中某个位置的另一整数的地址。因为编译格式的 D 代码在操作系统内核本身中触发探测器时执行,所以 D 指针通常是与内核的地址空间关联的指针。可使用 isainfo(1) -b 命令来确定活动操作系统内核用于指针的位数。

如果要创建指向内核中某个数据对象的指针,可使用 & 运算符来计算该对象的地址。例如,操作系统内核源代码将声明 int kmem_flags 可调参数。可以通过在 D 中跟踪对该对象的名称应用 & 运算符的结果来跟踪此 int 的地址:

trace(&`kmem_flags);

* 运算符可用于引用通过指针寻址的对象,并且充当 & 运算符的逆向运算符。例如,以下两个 D 代码段在含义上是等效的:

p = &`kmem_flags;				trace(`kmem_flags);
trace(*p);

左边代码段创建 D 全局变量指针 p。因为 kmem_flags 对象属于 int 类型,所以 &`kmem_flags 的结果类型为 int *(即,指向 int 的指针)。左边代码段将跟踪 *p 的值,该值可以跟踪指向数据对象 kmem_flags 的指针。因此,此代码段与右侧代码段相同,后者直接使用名称来跟踪数据对象的值。