c - 理解 read() 的问题

标签 c linux io

我无法理解这段代码:

static int read_mem(int pm, u64 *map)
{

    u64 aux = PAGE_SIZE * sizeof(*map);

    if (read(pm, map, aux) != aux) {
        pr_perror("Can't read pagemap file");
        return -1;
    }

它实际上是从描述符 pm 读取内存页,但我不明白为什么它使用 u64 作为缓冲区地址。

如何获取已阅读的内容? 如何打印或处理?

最佳答案

u64 是 Linux 中使用的一种类型,其大小为 8 个字节。

why it is using a u64 as an address to a buffer.

您的代码正在从文件描述符 pm 中读取内存页,我猜这与进程内存相关联(例如/proc/pid/mem/)。我想,这段代码是在 x86_64 架构中执行的,其中内存位置的大小为 8 字节。因此,使用类型为 u64 的缓冲区指针,因为这种类型匹配内存位置的大小,允许我们处理读取为类型为 u64 和大小为 PAGE_SIZE 的大数组的内存页(即 u64 memory_page[PAGE_SIZE]).

可能的问题,此代码不可移植到 x86_32 架构,因为 u64 在 32 位架构中也是 8 字节,而内存位置的大小为 4 字节。 但是,您不应该依靠指针的大小来确定内存位置的大小,因为即使这种方法有效,标准 C 也不能保证。

How can I get the content which has been read? How can I print it out or process it?

假设 map 指向一个足够大的缓冲区以包含所有读取的数据,您可以按如下方式访问从内存中读取的值:

int i=0; 
puts("Memory dump"): 
for( i=0; i < PAGE_SIZE; i++) 
   printf("[%d] : %lu\n", i,  *(map+i)); 

由于内存位置的大小为 8 个字节,您可以看到页面读取为类型为 u64 且大小为 PAGE_SIZE 的大数组。

关于c - 理解 read() 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20583116/

相关文章:

python - 连续获取输出: rsync info=progress2 call in python script

java - 测量方法调用的 I/O 需求

assembly - 我可以使用 I/O 端口吗(asm : `in, out` ) to transfer data via PCI Express on modern x86_64 CPU?

c - 如何为具有不同条件的程序获取多个输入(整数和字符串)

c - 回文校验的递归方法

c - C 中允许重新声明全局变量?

c++ - 接收所有使用 C 套接字发送的数据

c++ - 在 Linux 平台上构建 C++ 项目(或更具体地说是 : building CLIPS on Ubuntu 9. 10)

linux - 为什么我的 Linux 提示只显示 ">"符号?

ruby-on-rails - 从 Ruby on Rails 中以 sudo 方式读取文件