Как использовать инструкции monitor / mwait в сборке x86-64 на Mac или baremetal - PullRequest
0 голосов
/ 22 марта 2019

Изначально я спрашивал об umonitor и umwait, но, как подсказал @harold, оказалось, что вы даже не можете купить процессор, в котором есть эти инструкции.Так что этот вопрос касается монитора и mwait, потому что мне интересно, как использовать их на baremetal.


Я только что узнал о monitor / mwait .

Я бы подумал, что при вызове 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

Мне интересно, как выглядит пример использования для (а) временного интервала, например, задержки в 100 мс, и / или (б) «события» написанияк определенной части памяти, чтобы вызвать обратный вызов, и / или (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

Несколько ресурсов, которые яобнаружили:

...