当宏将值存储在他自己的参数中时,这意味着什么?

What does it mean when a macro store the values inside his own arguments?

rdtsc用于将Linux内核(TSC)中的64位计数器寄存器自动读入两个32位变量。我读了 Linux Device Drivers 3 并且它说这个宏将值(low32high32)存储到他自己的参数中,但是正如你所看到的 rdtsc 需要 void

#define DECLARE_ARGS(val, low, high)    unsigned long low, high

static __always_inline unsigned long long rdtsc(void)
{
    DECLARE_ARGS(val, low, high);

    // ...

    return EAX_EDX_VAL(val, low, high);
}

我知道这没有道理,但我照着书上说的做

long long x, y;
rdtsc(x, y); // store the values into his arguments

在您发布的示例中 rdtsc 是一个函数,而不是宏。 DECLARE_ARGS 是一个宏,它只定义了两个 unsigned long 类型的变量(lowhigh)。该函数将 return TSC 值。您没有包含 EAX_EDX_VAL 宏,所以这里是:

#define EAX_EDX_VAL(val, low, high) ((low) | (high) << 32)

所以函数rdtsc会将TSC的低位和高位读入局部变量lowhigh并且return一个64位的值由两个 32 位值组成。

可以像这样使用函数

unsigned long tsc = rdtsc();

您可以通过查看 Referenced section here.

了解它在 Linux 内核中的使用方式