Я портирую расширение ядра на 32/64 битную AIX на многопроцессорном PowerPC, написанном на C. Мне не нужно больше, чем атомарное чтение и атомарная запись (я не использую для извлечения и извлечения).добавить, сравнить-и-поменять и т.д.) Просто чтобы уточнить: для меня «атомарность» означает не только «отсутствие чередования», но и «видимость через несколько ядер».Операции работают с указателями, поэтому операции с переменными 'int' для меня бесполезны.
Если я объявлю переменную "volatile", стандарт C говорит, что переменная может быть изменена неизвестными факторами и поэтому не подлежитна оптимизацию.
Из того, что я читал, кажется, что обычные операции чтения и записи должны выполняться без чередования, и ядра ядра Linux *1006*, похоже, согласны.он говорит:
__asm__ __volatile__("stw%U0%X0 %1,%0" : "=m"(v->counter) : "r"(i));
stw
- это «слово магазина», которое предположительно атомарно, но я не знаю, что означает «% U0% X0».Я не понимаю, как эта инструкция по сборке навязывает видимость.Когда я компилирую свое расширение ядра, для желаемого назначения используется «std», но оно также должно быть атомарным для 64-битной машины, из того, что я прочитал.У меня очень мало понимания специфики PowerPC и его набора инструкций, однако я не нашел в списке сборок скомпилированного файла каких-либо инструкций барьера памяти («sync» или «eieio»).
Ядропредоставляет сервис fetch_and_addlp (), который можно использовать для реализации атомарного чтения (например, v = fetch_and_addlp(&x, 0)
).
Итак, мои вопросы:
достаточно ли этого дляобъявить переменную «volatile» для достижения атомарности чтения и записи в смысле видимости и отсутствия чередования?
, если ответ на 1 - «нет», как достигается такая атомарность?
что означает "% U0% X0" в атомарной реализации Linux PowerPC?