Если в сборке x86 есть пауза / сон или события - PullRequest
1 голос
/ 22 марта 2019

Мне интересно, есть ли что-либо на уровне сборки в 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, но о любом событии (о котором я не так уж много знаю).Я видел эту крошечную библиотеку цикла обработки событий в C , не уверенную, можно ли что-то из этого сделать с помощью простой инструкции по сборке.Такие вещи, как события клавиатуры, события сокетов, события файлов, другие события, я не уверен, какими они будут.

Кроме того, это будет запускаться как обычный пользователь в операционной системе.Но знать, как это сделать для привилегированных пользователей, было бы неплохо узнать.А также не имеет отношения к тому, как вы можете сделать это с помощью функций или системных вызовов Linux, пока я понимаю, как это сделать до сих пор.

Ответы [ 2 ]

6 голосов
/ 22 марта 2019

Основная инструкция, чтобы сделать то, что вы хотите, HALT.Он прекращает выполнение инструкций до тех пор, пока не будет получено прерывание.

Более новая команда, похожая на MWAIT.Он ждет как остановка, но также просыпается, когда записывается определенная область памяти (либо другим ядром ЦП, либо устройством ввода-вывода).MWAIT также переводит процессор в состояние пониженного энергопотребления, чем при остановке.Инструкция MONITOR используется для указания области памяти, которая будет вызывать MWAIT.

Другие упомянутые вами типы событий являются программными конструкциями.Инструкции ЦП не знают о клавиатурах, файлах или сетевых устройствах.

MWAIT и HALT являются привилегированными инструкциями.Если приложение хочет перевести процессор в спящий режим, оно обычно должно вызывать ОС, чтобы ОС могла запланировать какой-то другой процесс, если он готов к запуску.

3 голосов
/ 22 марта 2019

Хотя для этого есть инструкции, они бесполезны для процесса, работающего в операционной системе, поскольку вы не можете их использовать. Также у вас нет способа использовать прерывания. Вместо этого используйте системные вызовы и сигналы для достижения желаемой цели. Полезные системные вызовы:

  • nanosleep останавливает ваш процесс на указанное количество наносекунд.
  • sigaction и signal определяют, что происходит при получении сигнала.
  • pause приостанавливает процесс до получения сигнала.

В UNIX-подобных системах, таких как Linux, SIGINT доставляется в ваш процесс, когда пользователь нажимает Ctrl & thinsp; + & thinsp; C . Такое поведение можно использовать для достижения желаемого результата.

Я рекомендую вам сначала попрактиковаться во всех этих понятиях в C, прежде чем погрузиться в реализацию сборки.

...