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