0

我正在 MIPS 机器上调试 NUMACTL。在 numa_police_memory() API 中,我们有:

void numa_police_memory(void *mem, size_t size)
{
        int pagesize = numa_pagesize_int();
        unsigned long i;
        for (i = 0; i < size; i += pagesize)
                asm volatile("" :: "r" (((volatile unsigned char *)mem)[i]));
}

似乎“asm volatile("" :: "r" (((volatile unsigned char *)mem)[i]));" 用于读取 VM,以便将先前 mmap 应用的所有内存分配到某些特定的物理内存上。但是这个 asm 代码是如何工作的呢?我看不懂汇编语言!为什么第一个双引号是空的???

谢谢

4

1 回答 1

0

asm有趣的是,尽管使用了语句,但此代码段中根本没有汇编代码。它包含一个空白的程序集“程序”、一个空的输出列表和一个输入列表。输入规范强制((volatile unsigned char *)mem)[i]在寄存器中。因此,所有这些魔术都会生成每个页面的第一个字节的负载(页面故障前)。

于 2012-06-29T16:32:21.260 回答