13

allan cruse コードで smphello.s コードを読んでいます

次の部分で、彼は各プロセッサのスタック セグメントをセットアップしようとしています。

要点は、ここの xadd の説明の中で、ロック プレフィックスを使用せずに xadd を使用したことです。ロックプレフィックスがある場合があります。

これはバグですか、それとも大丈夫ですか?なぜ ?

# setup an exclusive stack-area for this processor
mov  $0x1000, %ax   # paragraphs in segment
xadd %ax, newSS     # 'atomic' xchg-and-add
mov  %ax, %ss       # segment-address in SS
xor  %esp, %esp     # top-of-stack into ESP
4

3 に答える 3

3

考え直した後、この場合の別のシナリオが頭に浮かびました。

のマイクロコード実装が次のxaddようになっている場合:

temp = ax + newSS
newSS = ax 
ax = temp ; the last 2 are actual xchg

次に、このシナリオで問題があります。

newSSが 2 つのスレッド間で共有されているとします。

スレッド No.0 (t0これは5axに等しい) をロードして追加し、 a に入れます。newSSaxtemp register

この時点で、コンテキスト スイッチがあるとします。次にt1、それが5axに等しい場合、ロードして追加し、結果を に入れようとします。その後、コンテキスト スイッチが... 両方のスタック セグメント レジスタが同じアドレスを指します。newSSaxtemp registert0

明らかに、ここに問題があります。マイクロコードの実装が次のようでない限り:

tmp register = ax
xchg ax, newSS
ax = ax + tmpRegister

変数newSSが複数回読み取られるか、異なる命令で読み取られて書き込まれる他の方法では、ロックが必要です。

于 2015-05-08T18:52:15.837 に答える