我无法理解这段代码:
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 memory_page[PAGE_SIZE]
)。
可能的问题是,此代码不可移植到x86_32体系结构,因为u64在32位体系结构中也是8字节,而内存位置的大小是4字节。
但是,您不应该依赖指针的大小来确定内存位置的大小,因为即使此方法有效,标准C也不能保证它有效。
我怎样才能得到已经读过的内容?我怎么打印出来
还是处理?
假设映射指向的缓冲区足够大,可以包含所有读取的数据,则可以按如下方式访问从内存读取的值:
int i=0;
puts("Memory dump"):
for( i=0; i < PAGE_SIZE; i++)
printf("[%d] : %lu\n", i, *(map+i));
由于内存位置的大小为8个字节,因此可以看到页面读取为u64类型的大数组,并且大小
PAGE_SIZE
。