理解read()的问题

我无法理解这段代码:

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字节。

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

你的代码是从文件描述符pm读取一个内存页面,我猜,这个内存页面是与一个进程内存相关的(例如/ proc / pid / mem /)。 我想,这个代码是在x86_64体系结构中执行的,其中一个内存位置的大小是8个字节。 因此,使用类型为u64的缓冲区指针,因为此类型与内存位置的大小相匹配,因此我们可以将内存页读取为u64类型的大数组和PAGE_SIZE大小(即u64 memory_page[PAGE_SIZE] )。

可能的问题是,此代码不可移植到x86_32体系结构,因为u64在8位体系结构中也是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