我无法理解这段代码:
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作为缓冲区的地址。
如何获取已阅读的内容? 如何将其打印出来或进行处理?
答案 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
的大数组。