【问题标题】:Problems understanding read()理解 read() 的问题
【发布时间】:2013-12-14 12:11:03
【问题描述】:

我无法理解这段代码:

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 作为地址。它使用的是u64 *
  • 学习指针。地图指向您的内容。
  • 你可以关注linux/include/linux/mm_types.h来发现内存页的内容。

标签: c linux io


【解决方案1】:

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

为什么它使用 u64 作为缓冲区的地址。

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

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

如何获取已阅读的内容?我怎样才能打印出来 还是处理它?

假设 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

【讨论】:

  • 嗨,听起来很有趣,但出现了一个错误:错误:格式 â%lluâ 需要 âlong long unsigned intâ 类型的参数,但参数 3 的类型为 âu64â [-Werror=format=] printf(" [%d] : %llu\n", i, *(map+i));
  • @user2212190 %llu 有问题。 u64 是long unsigned。顺便说一句,这应该是警告而不是错误。您收到错误是因为您使用的是Werror=format
猜你喜欢
  • 2014-05-30
  • 1970-01-01
  • 1970-01-01
  • 2011-10-22
  • 2011-08-21
  • 1970-01-01
  • 2015-11-21
  • 2011-10-11
  • 2011-09-26
相关资源
最近更新 更多