私は Linux カーネルを初めて使用し、それについてあまり知りません。何らかの理由で、Linux ホスト カーネルと kvm ゲスト カーネルのレイテンシの問題も追跡する必要があります。ここで、native_apic_msr_write (これはLinux ホスト カーネルで使用されます) とnaitve_apic_mem_write ( kvm guset カーネルで使用されます) を比較する必要があります。
私の限られた知識に基づいて、これら 2 つの関数呼び出しのソース コードを読み取ろうとしましたが、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"