Привилегированные инструкции, добавление значений регистра?

Я закончил домашнюю работу для аспирантуры по операционным системам. Я получил отличный результат и пропустил только один крошечный вопрос. Он спросил, какие инструкции были привилегированными, а какие нет. Я ответил правильно все, кроме одного: добавление одного значения регистра в другое

Я ответил, что это привилегировано, но, видимо, это не так! Как это может быть?

Я полагал, что пользователь взаимодействует с регистрами / памятью с помощью системных вызовов, которые в некотором смысле переходят от системных вызовов пользовательского режима к процедурам режима ядра. Поэтому добавление одного значения регистра к другому может быть вызвано непривилегированным пользователем, но в конце концов ядро ​​выполняет работу и находится в привилегированном режиме ядра. Поэтому это привилегировано? Пользователь не может сделать это самостоятельно. Я ошибся? Зачем?!

  • Спасибо!

1 ответ

Решение

Я не уверен, почему вы думаете, что изменение регистра потребует вмешательства ядра. Некоторые специальные регистры могут быть привилегированными (те, которые управляют такими вещами, как таблицы дескрипторов или уровни защиты, с помощью которых код пользовательского режима может обходить защиту в системном режиме), но регистры общего назначения могут свободно изменяться без участия ядра.

Когда ваш код выполняется, подавляющее большинство инструкций будет выглядеть так:

inc  %eax
movl $7,%ebx
addl %eax,%ebx

Кроме того, я просто представляю, насколько медленным будет мой код, если он требует системного вызова ядра каждый раз, когда я увеличиваю счетчик или вызываю функцию:-)

Единственное, о чем я могу думать, - это если вы считаете, что вашему потоку выполнения не разрешено произвольно изменять регистры, поскольку это может повлиять на эти регистры для других потоков. Но ядро ​​позаботится об этом при переключении потоков - все ваши регистры будут упакованы где-то на потом, а в них будут загружены регистры для следующего потока.


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

Однако, если вы используете его в качестве адреса для доступа к памяти, и эта память каким-то образом недопустима (за пределами вашего адресного пространства или перенесена на диск), ядро ​​вмешается в этот момент, чтобы исправить ситуацию (выбросить ваше приложение на ухо, или внесите в выгруженную память).

Однако даже это не привилегированная инструкция, это просто ошибки обработки страниц ЦП.

Привилегированная инструкция - это то, что вам вообще запрещено делать, например, изменять регистры расположения таблицы дескрипторов прерываний или деактивировать прерывания.

Другие вопросы по тегам