External Variables
D uses the backquote character (`) as a special scoping operator for accessing variables
that are defined in the operating system and not in your D program.
For example, the Solaris kernel contains a C declaration of a system tunable
named kmem_flags for enabling memory allocator debugging features. See the Solaris Tunable Parameters Reference Manual for more information
about kmem_flags. This tunable is declared as a C variable in the kernel
source code as follows:
int kmem_flags;
To access the value of this variable in a D program, use
the D notation:
`kmem_flags
DTrace associates each kernel symbol with the type used for the symbol in
the corresponding operating system C code, providing easy source-based access to the native
operating system data structures. In order to use external operating system variables, you
will need access to the corresponding operating system source code.
When you access external variables from a D program, you are accessing the
internal implementation details of another program such as the operating system kernel or
its device drivers. These implementation details do not form a stable interface upon
which you can rely! Any D programs you write that depend on these
details might cease to work when you next upgrade the corresponding piece of
software. For this reason, external variables are typically used by kernel and device
driver developers and service personnel in order to debug performance or functionality problems
using DTrace. To learn more about the stability of your D programs, refer
to Chapter 39, Stability.
Kernel symbol names are kept in a separate namespace from D variable and
function identifiers, so you never need to worry about these names conflicting with
your D variables. When you prefix a variable with a backquote, the
D compiler searches the known kernel symbols in order using the list of
loaded modules in order to find a matching variable definition. Because the Solaris kernel
supports dynamically loaded modules with separate symbol namespaces, the same variable name might
be used more than once in the active operating system kernel. You can
resolve these name conflicts by specifying the name of the kernel module whose
variable should be accessed prior to the backquote in the symbol name. For
example, each loadable kernel module typically provides a _fini(9E) function, so to refer to
the address of the _fini function provided by a kernel module named foo,
you would write:
foo`_fini
You can apply any of the D operators to external variables, except those
that modify values, subject to the usual rules for operand types. When you
launch DTrace, the D compiler loads the set of variable names corresponding to
the active kernel modules, so declarations of these variables are not required. You
may not apply any operator to an external variable that modifies its
value, such as = or +=. For safety reasons, DTrace prevents you from damaging
or corrupting the state of the software you are observing.