我使用这两种方法从寄存器中获取位字段信息.我需要提取的位字段的位置由Intel Manual提供.就像下面的代码一样.但是我得到的结果与这两种方法不同.
我找不到这两种方法的任何问题.但根据我的理解,maximum_power字段不应该是'0'作为第一种方法(这是英特尔已经在寄存器中定义的值.)
方法1:
typedef struct rapl_parameters_msr_t {
uint64_t thermal_spec_power : 15;
uint64_t : 1;
uint64_t minimum_power : 15;
uint64_t : 1;
uint64_t maximum_power : 15;
uint64_t : 1;
uint64_t maximum_limit_time_window : 6;
uint64_t : 10;
} rapl_parameters_msr_t;
uint64_t msr;
read_msr(cpu, 0x614, &msr);
rapl_parameters_msr_t domain_msr = *(rapl_parameters_msr_t *)&msr;
printf("%ld\n", domain_msr.thermal_spec_power); //print: 280
printf("%ld\n", domain_msr.minimum_power); //print: 192
printf("%ld\n", domain_msr.maximum_power); //print: 0
printf("%ld\n", domain_msr.maximum_limit_time_window); //print: 16
Run Code Online (Sandbox Code Playgroud)
方法2:
uint64_t
extractBitField(uint64_t inField, uint64_t width, uint64_t offset)
{
uint64_t bitMask;
uint64_t outField;
if ((offset+width) == …Run Code Online (Sandbox Code Playgroud)