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