【发布时间】:2021-03-30 20:33:09
【问题描述】:
我想在 Arm Linux 中编写简单而简短的汇编代码,永远等待。
label:
b label
这可行,但会占用大量 CPU 时间。
我考虑过使用nanosleep 并每隔X 秒跳转到标签,但是我如何在汇编中使用它?
pause syscall(在 cmets 中建议)不好,因为该进程有一个信号处理程序。
有简单的方法吗?
【问题讨论】:
-
是的,你需要一个系统调用,是的,如果没有字符出现在 TTY 上,从 TTY 读取是可以工作的。如果 ARM Linux 有 64 位
time_t,那么 nanosleep 可以等待 2^64-1 秒,这应该足够长了。否则你会想要真正阻塞的东西。至于如何调用系统调用,搜索堆栈溢出(例如 google 与site:stackoverflow.com)以获得 ARM 系统调用,或者只是一般的 google。鉴于手册页和将 C args 映射到寄存器的通用方法(调用约定),您可以调用任何内容。 -
还有一个pause 系统调用。
-
@Jester:谢谢,我记得我记得 Linux 有一个这样的系统调用,但马上想不起名字了。当我看到您的评论时正在搜索第 2 节手册页:P
-
sleep(3) 和 nanosleep 手册页另有说明: sleep() 导致调用线程休眠,直到经过以秒为单位的实时秒数,或者直到一个信号到达,不被忽略。。 libc 包装器可能会在 EINTR 上自动重试/重新启动它?
-
@yfr24493AzzrggAcom 通常你可以通过在无限循环中调用
pause来解决这个问题。这样,该过程仅在信号到达时短暂运行,然后立即进入睡眠状态。您也可以使用信号掩码或sigsuspend来暂停并避免传递信号。