0

我是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"
4

1 回答 1

0

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

于 2012-08-06T18:33:17.343 回答