我无法使用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发布于 2019-04-15 21:26:03
C++ buffers I/O读取和写入。例如,在一个简单的GCC应用程序中,此缓冲区设置为8192字节。当然,您可以更改该大小。
正如setbuf上的维基页面所说:
使用用户提供的缓冲区,从文件读取以time.
使用用户提供的缓冲区,从文件读取可以读取缓冲区大小的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);https://stackoverflow.com/questions/41904423
复制相似问题