REP INSB может прерываться между границами каждой выполняемой инструкции INSB. Состояние сохраняется в регистрах RCX и RDI, поэтому после обработки прерывания инструкция может быть возобновлена с той точки, в которой она была прервана.
Отдельные инструкции INSB, выполняемые REP INSB, не прерываемы, являются atomi c и выполняются строго в порядке инструкций по отношению к другим инструкциям, выполняемым на том же ядре. Эта атомарность означает, что другое ядро или устройство PCI не может выполнять чтение или запись ввода-вывода по тому же адресу ввода-вывода во время выполнения инструкции INSB. Однако другое ядро или устройство PCI может читать или записывать тот же адрес ввода-вывода между каждым последовательным выполнением инструкции INSB.
Прерывания на других ядрах не влияют на инструкцию REP INSB, за исключением того, что они может вызвать выполнение кода, который в конечном итоге получит доступ к одному и тому же адресу ввода-вывода одновременно. Переключение контекста может происходить только при прерываниях и исключениях, поэтому переключение контекста возможно между границами каждой инструкции INSB.
Другими словами, вам нужно гарантировать, с помощью мьютексов или какого-либо другого механизма, что нет другой поток, независимо от того, на каком ядре он запущен, может получить доступ к тому же адресу ввода-вывода, что и инструкция REP INSB. Отключение прерываний предотвратит выполнение других потоков, работающих на том же ядре, но не предотвратит выполнение других потоков на других ядрах.
На самом деле вам, вероятно, придется гарантировать, что никакой другой поток не получит доступ к устройству, которое вы используете, на протяжении всей выполняемой вами операции, поскольку другое устройство смены потока регистрируется на том же устройстве, пока выполняется ваша инструкция REP INSB. вероятно вызовет проблемы.