理解read()的问题

时间:2013-12-14 12:11:04

标签: 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作为缓冲区的地址。

如何获取已阅读的内容? 如何将其打印出来或进行处理?

1 个答案:

答案 0 :(得分: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也不能保证它。

  

如何获取已阅读的内容?我怎么打印出来   或处理它?<​​/ p>

假设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的大数组。