2015-05-08 3 views
5

Я читаю код smphello.s от allan cruse codeСборка: нужна ли инструкция xadd?

В следующей части он пытается установить сегмент стека для каждого процессора.

Дело в том, что он использовал xadd без использования префикса блокировки во время описания xadd, как в here. может быть префикс блокировки.

это ошибка или все в порядке? и почему ?

# 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

Да, он должен использовать 'lock'. Единственная инструкция, которая устанавливает блокировку сама по себе, - 'xchg'. – Jester

+0

@becks: Есть ли проблема с моим ответом? – SonOfSun

ответ

1

После другой мысли к этому, мне пришла в голову другая сценария для этого случая.

если реализация микрокода из xadd быть так:

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

мы имеем проблему в этом сценарии:

Предположим, что newSS распределяется между 2 нитями.

No.0 Thread (t0 с его ax равна) нагрузок и добавляет newSS с ax и поместить его в temp register.

Предположим, что на данный момент мы имеем контекстный переключатель. Затем t1 с его ax равно пытается загрузить newSS и добавить его в ax и поместить результат в temp register. а затем переключение контекста на t0 ... Оба регистра сегмента сегмента указывают на один и тот же адрес.

Очевидно, что у нас есть проблема. Если реализация микрокода не будет так:

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

любым другим способом, что переменная newSS считывается более одного раза или для чтения и записи в различных инструкциях, нам нужно зафиксировать.

3

Состояние гонки не указано на «newSS». Как инструкция объяснение предполагает,

xadd %ax, newSS означает:

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

Так состояние гонки на Топор регистре. Но если мы тщательно подумаем, мы знаем, что каждый поток имеет свой собственный файл реестра или контекст. Так что проблем не будет. (значения регистра не будут меняться при переключении контекста из последних знаний об их потоке)

Таким образом, в этом примере нет необходимости блокировки для xadd.

+1

Из того, что я вижу, я думаю, что атомного добавления/обмена достаточно для защиты 'newSS' в этом случае, и вы правы. Я, скорее, эксперт в области ARM, поэтому я с удовольствием буду откладывать другие, если я ошибаюсь. –