REP INSB можно прервать? - PullRequest
3 голосов
/ 18 июня 2020

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

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

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

1 Ответ

4 голосов
/ 18 июня 2020

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

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

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

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

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

...