numa_police_memory

问题描述:

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

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挥发性(” “:: ”R“(((挥发性无符号字符*)MEM)[1]));”用于读取VM,以便将先前mmap应用的所有内存分配到某个特定的物理内存。但是,这个asm代码是如何工作的?我无法读取汇编语言!为什么第一个双引号是空的?

感谢

+0

有趣的是,你有一个MIPS计算机具有多个内存域? –

有趣的是,没有汇编代码在这个片段中所有,但使用asm声明。它包含一个空白程序集“程序”,一个空的输出列表和一个输入列表。输入规范强制((volatile unsigned char *)mem)[i]在寄存器中。因此,所有这一切都会产生每个页面第一个字节的负载(在页面错误之前)。

+0

“r”是什么意思?注册还是阅读? – user1491604

+0

注册。有关更多信息,请参见[GCC手册](http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Simple-Constraints.html)。这里发生的事情是'asm'声明告诉GCC,在内联汇编执行之前,这个值需要在寄存器中。 GCC不关心汇编代码实际上是空白的,并且仍然产生一个负载。 –

+0

很酷......谢谢! – user1491604