fstream读取MSR

时间:2017-01-27 23:02:43

标签: c++ std intel fstream clang++

我无法使用fstream读取MSR(模型特定寄存器)。为什么会这样?

使用fopen / fseek / fread阅读工作正常。

有谁知道为什么?以下是MSR的特权。

# ll /dev/cpu/0/msr
crw------- 1 root root 202, 0 Jan 26 22:29 /dev/cpu/0/msr

1 个答案:

答案 0 :(得分:2)

C ++ buffers I / O读取和写入。例如,在简单的GCC应用程序中,此缓冲区设置为8192字节。您当然可以更改该大小。

setbuf上的Wiki页面所述:

  
      
  • GCC 4.6 libstdc ++

         

    使用用户提供的缓冲区,从文件读取一次读取n-1个字节。

  •   
  • Clang ++ 3.0 libc ++

         

    使用用户提供的缓冲区,从文件读取将读取以下内容的最大倍数:   缓冲区中可以容纳4096。

  •   

这是将GCC编译程序中的MSR文件上的简单openseekread转换为以下原因的原因:

openat(AT_FDCWD, "/dev/cpu/0/msr", O_RDONLY) = 3
lseek(3, 408, SEEK_SET)                 = 408
read(3, 0x113a0a0, 8191)                = -1 EINVAL (Invalid argument)

请注意值8191。MSR(4)提供了EINVAL后面的答案:

  

通过打开文件并寻求对寄存器的访问   MSR号作为文件中的偏移量,然后读取或写入   8个字节的块。

最简单的解决方法是更改​​缓冲区的大小。在GCC中,您可以这样操作:

char buf[8 + 1];
std::ifstream file;
file.rdbuf()->pubsetbuf(buf, sizeof(buf));
file.open("/dev/cpu/0/msr", std::ifstream::binary);