当宏将值存储在他自己的参数中时,这意味着什么?
What does it mean when a macro store the values inside his own arguments?
rdtsc
用于将Linux内核(TSC)中的64位计数器寄存器自动读入两个32位变量。我读了 Linux Device Drivers 3 并且它说这个宏将值(low32
和 high32
)存储到他自己的参数中,但是正如你所看到的 rdtsc
需要 void
“macro store the value into his arguments”是什么意思,我怎样才能得到这些变量?
DECLARE_ARGS
是做什么的?
#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
类型的变量(low
和 high
)。该函数将 return TSC 值。您没有包含 EAX_EDX_VAL
宏,所以这里是:
#define EAX_EDX_VAL(val, low, high) ((low) | (high) << 32)
所以函数rdtsc
会将TSC的低位和高位读入局部变量low
和high
并且return一个64位的值由两个 32 位值组成。
可以像这样使用函数
unsigned long tsc = rdtsc();
您可以通过查看 Referenced section here.
了解它在 Linux 内核中的使用方式
rdtsc
用于将Linux内核(TSC)中的64位计数器寄存器自动读入两个32位变量。我读了 Linux Device Drivers 3 并且它说这个宏将值(low32
和 high32
)存储到他自己的参数中,但是正如你所看到的 rdtsc
需要 void
“macro store the value into his arguments”是什么意思,我怎样才能得到这些变量?
DECLARE_ARGS
是做什么的?
#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
类型的变量(low
和 high
)。该函数将 return TSC 值。您没有包含 EAX_EDX_VAL
宏,所以这里是:
#define EAX_EDX_VAL(val, low, high) ((low) | (high) << 32)
所以函数rdtsc
会将TSC的低位和高位读入局部变量low
和high
并且return一个64位的值由两个 32 位值组成。
可以像这样使用函数
unsigned long tsc = rdtsc();
您可以通过查看 Referenced section here.
了解它在 Linux 内核中的使用方式