Пеpехват вызовов фyнкций на x86
- From
- Gennady Mayko ()
- To
- Konstantin Mashukov
- Date
- 2002-10-10T10:22:24Z
- Area
- SU.WINDOWS.NT.PROG
From: "Gennady Mayko" <gennady.mayko@broadcom.com>
Добрый день!
VI>> Рассматpивалось, в общем-то, одна идея yстpанения пpоблемы:
VI>> обеспечить непpеpываемость опеpации патча.
VI>> Это можно сделать c помощью команды пpоцессоpа CMPXCHG8B (Gennady
VI>> Mayko) -- навеpное самое кpасивое pешение -- но комманда
VI>> поддеpживается не всеми пpоцессоpами.
KM> А стpоковые инстpyкции? rep movs(b,w,d)? Разве они могyт пpеpваться ?
--
Строковая инструкция rep movs(b,w,d) может прерваться прерыванием (или
exception) в процессе пересылки. Перед каждой элементарной пересылкой
процессор проверят запрос на прерывание и переходит к процедуре обработки
этого прерывания; по окончании прерывания он автоматически продолжит (в данном
случае) следующую элементарную пересылку.
Если используется инструкция movs(b,w,d) (без префикса rep), то она, конечно
же, не прервется внешним прерыванием. Но она может переслать максимально 4
байта.
На мой взгляд, эту инструкцию не стоит использовать для изменения общих данных
в памяти (даже если нам нужно переслать не более 4х байт). Дело в том, что она
(даже без префикса rep) не всегда является гарантировано "атомарной" с точки
зрения доступа к данным в памяти, и с ней нельзя использовать префикс LOCK,
который такую атомарность гарантирует (как в случае, например, с инструкцией
CMPXCHG8B). Поэтому вполне возможна ситуация, когда на одном CPU "конкурентно"
выполняется инструкция movsd и что-то записывается в память, а на другом CPU
читается из памяти по этому же адресу. При этом операция записи/чтения может
состоять из 2 обращений к памяти. Понятно, что данные, прочитанные вторым
процессором, могут быть не верными.
С уважением,
Геннадий Майко.
--- ifmail v.2.15dev5
* Origin: FidoNet Online - http://www.fido-online.com (2:5020/400)