首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >要读取MSR的fstream

要读取MSR的fstream
EN

Stack Overflow用户
提问于 2017-01-28 07:02:43
回答 1查看 537关注 0票数 3

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

使用fopen/fseek/fread读取可以很好地工作。

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

代码语言:javascript
复制
# ll /dev/cpu/0/msr
crw------- 1 root root 202, 0 Jan 26 22:29 /dev/cpu/0/msr
EN

回答 1

Stack Overflow用户

发布于 2019-04-15 21:26:03

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

正如setbuf上的维基页面所说:

  • GCC 4.6 libstdc++

使用用户提供的缓冲区,从文件读取以time.

  • Clang++3.0 libc++读取n-1个字节

使用用户提供的缓冲区,从文件读取可以读取缓冲区大小的4096的最大倍数。

这就是为什么在一个由GCC编译的程序中,MSR文件上的一个简单的openseekread转换为:

代码语言:javascript
复制
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中,你可以这样做:

代码语言:javascript
复制
char buf[8 + 1];
std::ifstream file;
file.rdbuf()->pubsetbuf(buf, sizeof(buf));
file.open("/dev/cpu/0/msr", std::ifstream::binary);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41904423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档