我无法理解这段代码:
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 个字节。
why it is using a u64 as an address to a buffer.
您的代码正在从文件描述符 pm
中读取内存页,我猜这与进程内存相关联(例如/proc/pid/mem/)。我想,这段代码是在 x86_64 架构中执行的,其中内存位置的大小为 8 字节。因此,使用类型为 u64 的缓冲区指针,因为这种类型匹配内存位置的大小,允许我们处理读取为类型为 u64 和大小为 PAGE_SIZE 的大数组的内存页(即 u64 memory_page[PAGE_SIZE]
).
可能的问题,此代码不可移植到 x86_32 架构,因为 u64 在 32 位架构中也是 8 字节,而内存位置的大小为 4 字节。 但是,您不应该依靠指针的大小来确定内存位置的大小,因为即使这种方法有效,标准 C 也不能保证。
How can I get the content which has been read? How can I print it out or process it?
假设 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
的大数组。
关于c - 理解 read() 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20583116/