fstream to read MSR

fstream to read MSR

本文关键字:MSR read to fstream      更新时间:2023-10-16

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

使用fopen/fsek/fread阅读效果很好。

有人知道为什么吗?以下是MSR的权限。

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

C++缓冲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。EINVAL背后的答案由MSR(4)提供:

寄存器访问是通过打开文件并查找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);