最初,我询问了有关umonitor和umwait的问题,但事实证明,如@harold所言,您甚至无法购买具有这些说明的处理器。所以这个问题是关于监视和等待的,因为我很感兴趣如何在裸机上使用它们。
我本以为一旦调用mwait
就不会对任何指令进行评估,因此我不知道如何将内存的其他部分写入。除非这可能是一些带有某种共享内存的多线程的东西,我不完全理解我的理解。
想知道是否可以启动一个快速的hello world程序来演示如何使用这些说明。我的尝试是这样。
global _main
section .text
_main:
call print1
; watch when address 1000
; (randomly chosen)
; is written to.
mov eax, 1000
monitor eax
; wait for 100 ms, not sure
; or some interrupt
mov eax, 100
mwait eax
call print2
call exit
print2:
mov rdx, msg2.len
mov rsi, msg2
mov rdi, 1
mov rax, 0x2000004
syscall
ret
print1:
mov rdx, msg1.len
mov rsi, msg1
mov rdi, 1
mov rax, 0x2000004
syscall
ret
exit:
mov rdi, 0 ; exit status
mov rax, 0x2000001 ;: exit
syscall
section .data
msg1: db "start", 0xa, 0
.len: equ $ - msg1
msg2: db "end", 0xa, 0
.len: equ $ - msg2
我想知道的是(a)像100ms那样的时间跨度,和/或(b)写入内存的特定部分以触发回调的“事件”,和/ (c)外部事件,例如键盘中断或ctrl + c中断(如果有)。也许计时工作是由tpause
完成的。
使用tpause
尝试以下操作,我得到error: invalid combination of opcode and operands
:
mov eax, 1000
mov edx, 1000
mov rdi, 0
tpause rdi, edx, eax
我发现的一些资源: