C 理解read()的问题

C 理解read()的问题,c,linux,io,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作为缓冲区的地址 如何获取已阅读的

我无法理解这段代码:

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类型和大小页面大小的大数组的内存页面(即
u64内存页面[page\u size]

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

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

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

int i=0; 
puts("Memory dump"): 
for( i=0; i < PAGE_SIZE; i++) 
   printf("[%d] : %lu\n", i,  *(map+i)); 
inti=0;
puts(“内存转储”):
对于(i=0;i

由于内存位置的大小为8字节,因此您可以看到页面被读取为u64类型的大数组,并且大小
page\u size

它没有使用
u64
作为地址。它使用的是
u64*
。学习指针。map指向了您的内容。您可以按照它来发现内存页的内容。您好,听起来很有趣,但出现了一个错误:错误:format–llu–要求参数类型为–long long unsigned int–但参数3的类型为–u64–printf([%d]:%llu\n),i,*(map+i))@user2212190这是
%llu
的问题。u64为长无符号
。顺便说一句,这应该是警告而不是错误。由于使用的是
Werror=format