0

私は 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"
4

1 に答える 1

0

私は、これらがSMP の代替手段であると考えています。つまり、同じバイナリ カーネルが SMP システムと UP システムで異なる命令を実行する方法です。

于 2012-08-06T18:33:17.343 に答える