4

假设我REP INSB在普通优先级线程中从用户模式读取 PCI 设备寄存器。在执行期间,以下哪些可以发生,哪些不能发生:

  1. 中断(其他内核)
  2. 中断(相同内核)
  3. PCI 访问(其他内核)
  4. PCI 访问(相同的核心 - 中断和/或不同的线程)
  5. 上下文切换在同一个核心上

如果答案取决于它,请假设一个相当现代的处理器。感兴趣的是 Atoms 和 Core i3。

4

1 回答 1

5

REP INSB 在每条正在执行的 INSB 指令的边界之间是可中断的。状态保存在 RCX 和 RDI 寄存器中,因此在处理中断后,指令可以在中断点恢复。

REP INSB 执行的单个 INSB 指令是不可中断的,是原子的,并且相对于在同一内核上执行的其他指令严格按照指令顺序执行。这种原子性意味着在执行 INSB 指令时,另一个内核或 PCI 设备不能对同一 I/O 地址执行 I/O 读取或写入操作。但是,另一个内核或 PCI 设备可以在每次连续执行 INSB 指令之间读取或写入相同的 I/O 地址。

其他内核上的中断对 REP INSB 指令没有影响,除了它们可能会导致代码执行,最终导致同时访问相同的 I/O 地址。上下文切换只能发生在中断和异常上,因此可以在每条 INSB 指令的边界之间进行上下文切换。

因此,换句话说,您需要通过互斥锁或其他机制确保没有其他线程,无论它们在哪个内核上运行,都可以访问与 REP INSB 指令使用的相同的 I/O 地址。禁用中断将阻止在同一内核上运行的其他线程执行,但不会阻止其他线程在其他内核上运行。

事实上,您可能必须确保在您执行的整个操作过程中没有其他线程访问您正在使用的设备,因为当您的 REP INSB 指令执行时,另一个线程更改设备在同一设备上注册可能会导致问题。

于 2020-06-18T19:22:18.987 回答