native_apic_mem_write和native_apic_msr_write之间的区别?

时间:2012-08-06 18:21:14

标签: linux-kernel kvm

我是linux内核的新手,对此并不了解。出于某种原因,我必须跟踪linux主机内核和kvm来宾内核的延迟问题。现在我只需要将 native_apic_msr_write (这在 linux主机内核中使用)与 naitve_apic_mem_write 进行比较(用于 kvm guset内核)。

基于我的有限知识,我试图读取这两个函数调用的源代码,我相信native_apic_msr_write用于向msr寄存器写入一个值(希望这是正确的)。 我的问题是我不明白native_apic_mem_write的作用,因为它调用了一些名为ALTERNATIVE的内联汇编,我也不熟悉它。

我附上了以下代码。 有人可以解释一下里面发生了什么?它不必非常详细。任何信息都会有所帮助,谢谢。

#define ALTERNATIVE(oldinstr, newinstr, feature)                        \
80                                                                         \
81       "661:\n\t" oldinstr "\n662:\n"                                    \
82       ".section .altinstructions,\"a\"\n"                               \
83       "  .long 661b - .\n"                      /* label           */   \
84       "  .long 663f - .\n"                      /* new instruction */   \
85       "  .word " __stringify(feature) "\n"      /* feature bit     */   \
86       "  .byte 662b-661b\n"                     /* sourcelen       */   \
87       "  .byte 664f-663f\n"                     /* replacementlen  */   \
88       ".previous\n"                                                     \
89       ".section .discard,\"aw\",@progbits\n"                            \
90       "  .byte 0xff + (664f-663f) - (662b-661b)\n" /* rlen <= slen */   \
91       ".previous\n"                                                     \
92       ".section .altinstr_replacement, \"ax\"\n"                        \
93       "663:\n\t" newinstr "\n664:\n"            /* replacement     */   \
94       ".previous"

1 个答案:

答案 0 :(得分:0)

我相信这些是SMP alternatives - 这是同一个二进制内核在SMP和UP系统上运行不同指令的一种方法。