fstream to read MSR
fstream to read MSR
我无法使用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文件上的简单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。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);
相关文章:
- 使用 ImageIO.read() 生成的图像是否仍然使用传递给它的相同内存?
- std::ifstream::read 不会读取所有 512 字节,并设置 EOF 和失败位
- write() 和 read() 中几乎没有混淆
- C++ TCP 套接字通信 - 连接按预期工作,几秒钟后失败,没有收到新数据,read() 和 recv() 块
- 为什么调试器引发"read access violation. this was nullptr"异常?
- 对同一文件使用 .read 的次数是否有限制?
- Win32 API - HWND "{unused = ???} Unable to read memory"错误
- 为什么我会"Invalid read of size 8"?(瓦尔格林德)
- QDataStream read to QVector
- asio::read() 需要很长时间,使用 asio::write 没有问题
- Read OpenCV Mat 16bit to QImage 8bit Greyscale
- 如果 I/O read() 处于阻塞阶段,如何使用 Ctrl+C 退出 C++ 程序?
- 如何将 (serverClients[i].read() 传递给 ESP8266 上的字节数组
- 将 Lora.read() 转储到数组
- 无法通过 FUSE 文件系统"read"任何内容
- 指向 std::unrodered_map 中元素的指针返回'Read access violation'
- 封送指向结构异常"cannot Read or Write protected memory"的指针数组的指针数组
- C++HTTP客户端在GET请求后挂起read()调用
- 从带有 std::ifstream::read() 的文件中读取 int 遍历 char * 二进制数据
- fstream to read MSR