我无法使用fstream读取MSRs(模型特定寄存器)。为什么会这样?
使用fopen/fseek/fread进行读取却能正常工作。
有人知道原因吗?下面是MSRs的权限。
# 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文件进行简单的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)
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);
msr
伪文件是一个特殊的文件,不支持文件上的许多常规操作(例如,许多fstat
值)。此外,无论权限如何,读取或写入可能会在文件中的任何位置失败,这取决于特定 MSR 的语义。显然,更高级别的fstream
功能依赖于一些不可用的功能,或者尝试缓冲一些不可读的文件。你得到的实际错误消息是什么? - BeeOnRope