То, что вы видите, это забор памяти . То, что делает эта инструкция, гарантирует, что все предшествующие инструкции загрузки и сохранения станут глобально видимыми для любых последующих инструкций загрузки или хранения.
Ограждение действует как барьер с эффектом очистки буферов ЦП (примечание: буферы, не кеш, это другое дело) потому что данные, которые ожидали записи, должны быть сразу доступны глобально, прежде чем продолжить, чтобы гарантировать, что последовательные инструкции будут извлекать правильные данные.
Эта функция была введена для Обойти проблему с оборудованием в старом семействе процессоров Intel, а именно в Pentium Pro (1995-98), из-за которого операции доступа к памяти при определенных условиях c выполнялись в неправильном порядке.
В настоящее время каноническим способом применения ограждения в x86 является использование mfence
, lfence
или sfence
инструкции (в зависимости от типа необходимого забора), но они были добавлены только позже (с SSE и SSE2). На Pentium Pro таких инструкций не было.
Инструкция lock
на самом деле является просто префиксом инструкции, так что:
lock
addl $0,0(%esp)
На самом деле "заблокирован add
" .
Префикс lock
используется для кодов операций, которые выполняют операцию чтения-изменения-записи, чтобы сделать их атомами c. При применении lock add $0, 0(%esp)
для того, чтобы инструкция была атомарной c и, следовательно, чтобы результат был сразу виден глобально, неявно применяется ограничение load + store. Верхняя часть стека всегда читаема и доступна для записи, а добавление 0 - это запрет, поэтому нет необходимости передавать действительный адрес функции. Следовательно, этот обходной путь позволяет правильно сериализовать доступ к памяти, и это самый быстрый тип инструкций для достижения sh цели на Intel Pentium Pro.
См. Также эти другие сообщения: