Хотя архитектура мультипроцессорных систем может сильно отличаться, в целом все они нуждаются в надежной связи с памятью. Процессор в процессе, например, обновления бита Доступа в дескрипторе сегмента должен исключить аналогичные попытки всех прочих процессоров, до тех пор, пока операция не завершится.
Также требуется надежная связь с прочими процессорами. Хозяева шины должны иметь возможность надежного обмена данными. Например, бит в памяти может разделяться несколькими хозяевами шины и использоваться как сигнал того, что некоторые ресурсы, такие как переферийное устройство, находятся в состоянии ожидания. Хозяин шины может проверить этот бит, увидеть, что ресурс свободен, и изменить состояние бита. Это состояние будет указывать другим потенциальным хозяевам шины, что ресурс используется. Проблема может возникнуть в том случае, когда другой хозяин шины прочитывает этот бит в промежутке времени между тем, как первый хозяин шины прочитал бит, и моментом изменения состояния этого бита. В этом случае оба потенциальных хозяина шины будут считать, что ресурс свободен. При одновременной попытке использовать ресурс они могут повлиять друг на друга недопустимым образом. Процессор предотвращает такие ситуации, поддерживая циклы шины с захватом; во время таких циклов запросы на управление шиной игнорируются.
Процессор i486 защищает целостность некоторых критических операций с памятью, воздействуя на выходной сигнал LOCK#. Чтения и записи 64-разрядных операндов и (128-разрядные) предварительные выборки команд защищаются выходом, который называется PLOCK#. За использование этих сигналов для управления доступом к памяти среди процессоров отвечает разработчик аппаратного обеспечения.
Процессор автоматически устанавливает один из этих сигналов во время некоторых критических операций с памятью. Программное обеспечение может задавать дополнительные операции с памятью, для которых требуется сигнал LOCK#.
В число средств интерфейса мультипроцессорной обработки общего назначения входят:
Сигнал LOCK#, появляющийся на штырьке процессора.
Сигнал PLOCK#, появляющийся на штырьке процессора.
Префикс команд LOCK, позволяющий установку сигнала LOCK# программным обеспечением.
Автоматическая установка сигнала LOCK# для некоторых видов операций с памятью.
Автоматическая установка сигнала PLOCK# для некоторых других видов операций с памятью.
13.1.1 Префикс LOCK и сигнал LOCK#
Префикс LOCK и соответствующий ему сигнал следует использовать только для исключения прерывания прочими хозяевами шины операции пересылки данных. Префикс LOCK может использоваться со следующими командами процессора i486, когда они модифицируют оперативную память. При использовании префикса LOCK с любыми другими командами, либо с этими же командами, но когда они не выполняют записи в память (т.е. когда операнд назначения это регистр) генерируется исключение неверного кода операции.
Проверка и изменение бита: команды BTS, BTR и BTC.
Обмен данными: команды XCHG, XADD и CMPXCHG (команде XCHG префикс LOCK не требуется).
Арифметические и логические операции с одним операндом: команды INC, DEC, NOT, NEG.
Арифметические и логические операции с двумя операндами: команды ADD, ADC, SUB, SBB, AND, OR или XOR.
Команда с захватом гарантированно захватывает только область памяти, определяемую операндом назначения, но может захватить и большую область памяти. Например, типовые конфигурации 8086 и 80286 захватывают все физическое адресное пространство.
Доступ к семафорам (разделяемой памяти, используемой для сигнализации между несколькими процессорами) должен выполняться с использованием идентичного адреса и длины. Например, если один процессор обращается к семафору в формате доступа слова, прочие процессоры не должны при доступе использовать байтовый формат.
Целостность захвата не зависит от выравнивания поля памяти. Сигнал LOCK# устанавливается для стольких циклов шины, сколько нужно для обновления всего операнда целиком.