2015-05-08 15 views
5

Przeczytam kod smphello.s przez allan cruse codeMontaż: czy instrukcja xadd wymaga blokady?

w następnej części próbuje ustawić segment stosu dla każdego procesora.

chodzi o to, że użył xadd bez użycia prefiksu blokującego, będąc w opisie xadd, jak w here. może istnieć przedrostek blokady.

czy to błąd, czy jest to w porządku? i dlaczego ?

# 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 
+0

Tak, należy użyć 'blokady'. Jedyną instrukcją, która sama ustawia blokadę, jest 'xchg'. – Jester

+0

@becks: Czy jest jakiś problem z moją odpowiedzią? – SonOfSun

Odpowiedz

1

Przyszedł mi do głowy inny scenariusz dla tej sprawy.

jeśli realizacja microcode z xadd być tak:

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

mamy problem w tym scenariuszu:

Załóżmy, że newSS jest dzielona między 2 wątkach.

nr 0 wątek (t0 z jego ax równa) ładunku i dodaje newSS z ax i umieścić go w temp register.

Załóżmy, że w tym momencie mamy przełącznik kontekstowy. Następnie t1 z jego wartością ax jest równa próbuje załadować newSS i dodać go do ax i umieścić wynik w temp register. a następnie przełącznik kontekstu z powrotem do t0 ... Oba rejestry segmentu stosu wskażą ten sam adres.

Oczywiście mamy tu problem. O ile realizacja microcode być tak:

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

w jakikolwiek inny sposób, który jest zmienny newSS więcej niż raz lub odczytywane i zapisywane w różnych instrukcji, musimy zablokować.

3

Stan wyścigu nie występuje w "nowymSS". Jako wyjaśnienie instrukcja zakłada,

xadd %ax, newSS oznacza:

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

Więc sytuacja wyścigu jest w rejestrze AX. Ale jeśli uważnie się zastanowimy, wiemy, że każdy wątek ma własny plik rejestru lub kontekst. Więc nie będzie problemu. (wartości rejestru nie zmienią się w momencie przejścia kontekstu od ostatniej znajomości wątku)

W tym przykładzie nie ma potrzeby blokowania xadd.

+1

Z tego, co widzę, myślę, że dodanie/wymiana atomów jest wystarczające do ochrony 'newSS' w tym przypadku i masz rację. Jestem jednak bardziej ekspertem od strony ARM, więc chętnie poprzestanę na innych, jeśli udowodnię, że się mylę. –