REP INSB можно прервать?

Предположим, я долго REP INSBчтение регистра устройства PCI из пользовательского режима в потоке с нормальным приоритетом. Что из следующего может и чего не может произойти во время его выполнения:

  1. Прерывания (другие ядра)
  2. Прерывания (то же ядро)
  3. Доступ к PCI (другие ядра)
  4. Доступ к PCI (одно и то же ядро ​​- прерывания и / или разные потоки)
  5. Контекст переключается на том же ядре

Предположим, что это достаточно современный процессор, если все зависит от него. Интересны Atoms и Core i3.

1 ответ

Решение

REP INSB может прерываться между границами каждой выполняемой инструкции INSB. Состояние сохраняется в регистрах RCX и RDI, поэтому после обработки прерывания инструкция может быть возобновлена ​​с того места, где она была прервана.

Отдельные инструкции INSB, выполняемые REP INSB, не прерываются, являются атомарными и выполняются строго в порядке инструкций относительно других инструкций, выполняемых на том же ядре. Эта атомарность означает, что другое ядро ​​или устройство PCI не может выполнять чтение или запись ввода-вывода по тому же адресу ввода-вывода во время выполнения инструкции INSB. Однако другое ядро ​​или устройство PCI может считывать или записывать тот же адрес ввода-вывода между каждым последовательным выполнением инструкции INSB.

Прерывания на других ядрах не влияют на инструкцию REP INSB, за исключением того, что они могут вызвать выполнение кода, который в конечном итоге обращается к одному и тому же адресу ввода-вывода в одно и то же время. Переключение контекста может происходить только при прерываниях и исключениях, поэтому переключение контекста возможно между границами каждой инструкции INSB.

Другими словами, вам нужно гарантировать, с помощью мьютексов или какого-либо другого механизма, что никакой другой поток, независимо от того, на каком ядре он запущен, не может получить доступ к тому же адресу ввода-вывода, который используется инструкцией REP INSB. Отключение прерываний предотвратит выполнение других потоков, работающих на одном ядре, но не предотвратит выполнение других потоков на других ядрах.

Фактически, вам, вероятно, придется гарантировать, что никакой другой поток не получит доступ к устройству, которое вы используете, на протяжении всей выполняемой вами операции, поскольку другое устройство, изменяющее поток, регистрируется на том же устройстве, пока выполняется ваша инструкция REP INSB, вероятно, вызовет проблемы.

Другие вопросы по тегам