【问题标题】:If there is any pausing/sleeping or events in x86 assembly如果 x86 程序集中有任何暂停/睡眠或事件
【发布时间】:2019-03-22 08:33:20
【问题描述】:

我想知道 x86-64 中的汇编级别是否有任何东西可以让您休眠/wait,这样在等待完成之前不会运行任何指令。我看过 WAIT 和 PAUSE 说明,但我不确定它们是否相关。

我会这样想:

start:
  wait 123, oninterrupt ; 123 milliseconds
  ; then it will go here after that time
oninterrupt:
  ; ctrl-c pressed, now exit

同样,我想知道 x86 中是否有事件挂钩/处理程序。因此,如果有人按下 CTRL+C,就会有一个中断事件发送到某处的程序集,您可以在其上运行“退出”代码。我想一个事件处理程序可以像这样用汇编 x86 编写:

start:
  int 10, onctrlc ; register handler for made up event
  ; ... more instructions evaluate right after
onctrlc:
  ; control+c pressed, now exit

但我不只是考虑 CTRL+C,而是考虑任何事件(我不太了解)。我看到了这个tiny event loop lib in C,不确定是否可以通过简单的汇编指令来完成。诸如键盘事件、套接字事件、文件事件、其他事件之类的事情我不确定它们会是什么。

此外,这将在操作系统上以普通用户身份运行。但是知道如何为特权用户做这件事会很高兴。而且也不关心如何使用 linux C 函数或系统调用来做到这一点,到目前为止,我了解如何做到这一点。

【问题讨论】:

  • 该 C 将编译为进行系统调用的 asm(通过 libc 中的包装函数,但如果需要,您可以内联它们)。如果您的代码应该在操作系统下运行,“睡眠”是与进程调度程序/操作系统的交互,而不是直接与 CPU 硬件交互。 \@fuz 的答案是您真正想要的,尽管 \@prl 的答案确实正确回答了您根据 XY 问题提出的字面问题。

标签: assembly x86-64 sleep event-loop instructions


【解决方案1】:

做你想做的事情的基本指令是HALT。它停止执行指令,直到收到中断。

类似的新指令是 MWAIT。它像停止一样等待,但它也会在写入特定内存位置时唤醒(通过不同的 CPU 内核或 I/O 设备)。 MWAIT 还将 CPU 置于比停止更低的功耗状态。 MONITOR 指令用于指定将导致 MWAIT 唤醒的内存位置。

您提到的其他类型的事件是软件构造。 CPU 指令不了解键盘、文件或网络设备。

MWAIT 和 HALT 是特权指令。如果一个应用程序想要让 CPU 进入睡眠状态,它通常需要调用 OS,如果有一个准备好运行的话,OS 可以调度一些其他的进程。

【讨论】:

  • 有趣的事实:WAITPKG CPU 功能将添加一个定时暂停 tpause 直到给定的 TSC 计数,以及 umonitor / umwait 从用户空间监视/mwait(超线程友好的替代方案我猜是旋转等待,但大概 deep 像 mwait 这样的睡眠不是一种选择)。我认为这些仅适用于 Tremont(下一代 goldmont 低功耗)en.wikichip.org/wiki/intel/microarchitectures/…
【解决方案2】:

虽然有执行此操作的说明,但它们对于在操作系统下运行的进程没有用处,因为您不允许使用它们。你也没有办法利用中断。 相反,使用系统调用和信号来实现预期目标。有用的系统调用是:

  • nanosleep 将您的进程停止指定的纳秒数。
  • sigactionsignal 配置收到信号时会发生什么。
  • pause 暂停进程直到收到信号。

在类似 UNIX 的系统(如 Linux)上,当用户按下 Ctrl + C 时,SIGINT 会传递给您的进程。此行为可用于实现所需的结果。

我建议您在深入研究汇编实现之前先在 C 中练习所有这些概念。

【讨论】:

  • 我很惊讶。你说它停止/暂停一个进程? CPU不知道进程。我想你想说它停止/暂停一个线程?
  • @Elmue CPU 也不知道线程。这个问题与线程无关,我不想通过深入研究多线程的细节来使我的答案复杂化。请注意,虽然我给出的方法在技术上适用于线程,但确实有可能在给定时间内暂停整个进程。
猜你喜欢
  • 2010-12-04
  • 2011-11-22
  • 1970-01-01
  • 2019-07-18
  • 2010-12-23
  • 1970-01-01
相关资源
最近更新 更多