我无法使用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
答案 0 :(得分:2)
C ++ buffers I / O读取和写入。例如,在简单的GCC应用程序中,此缓冲区设置为8192字节。您当然可以更改该大小。
如setbuf上的Wiki页面所述:
GCC 4.6 libstdc ++
使用用户提供的缓冲区,从文件读取一次读取n-1个字节。
Clang ++ 3.0 libc ++
使用用户提供的缓冲区,从文件读取将读取以下内容的最大倍数: 缓冲区中可以容纳4096。
这是将GCC编译程序中的MSR文件上的简单open
,seek
,read
转换为以下原因的原因:
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);