Привилегированные инструкции, добавление значений регистра?
Я закончил домашнюю работу для аспирантуры по операционным системам. Я получил отличный результат и пропустил только один крошечный вопрос. Он спросил, какие инструкции были привилегированными, а какие нет. Я ответил правильно все, кроме одного: добавление одного значения регистра в другое
Я ответил, что это привилегировано, но, видимо, это не так! Как это может быть?
Я полагал, что пользователь взаимодействует с регистрами / памятью с помощью системных вызовов, которые в некотором смысле переходят от системных вызовов пользовательского режима к процедурам режима ядра. Поэтому добавление одного значения регистра к другому может быть вызвано непривилегированным пользователем, но в конце концов ядро выполняет работу и находится в привилегированном режиме ядра. Поэтому это привилегировано? Пользователь не может сделать это самостоятельно. Я ошибся? Зачем?!
- Спасибо!
1 ответ
Я не уверен, почему вы думаете, что изменение регистра потребует вмешательства ядра. Некоторые специальные регистры могут быть привилегированными (те, которые управляют такими вещами, как таблицы дескрипторов или уровни защиты, с помощью которых код пользовательского режима может обходить защиту в системном режиме), но регистры общего назначения могут свободно изменяться без участия ядра.
Когда ваш код выполняется, подавляющее большинство инструкций будет выглядеть так:
inc %eax
movl $7,%ebx
addl %eax,%ebx
Кроме того, я просто представляю, насколько медленным будет мой код, если он требует системного вызова ядра каждый раз, когда я увеличиваю счетчик или вызываю функцию:-)
Единственное, о чем я могу думать, - это если вы считаете, что вашему потоку выполнения не разрешено произвольно изменять регистры, поскольку это может повлиять на эти регистры для других потоков. Но ядро позаботится об этом при переключении потоков - все ваши регистры будут упакованы где-то на потом, а в них будут загружены регистры для следующего потока.
Основываясь на ваших комментариях, вы, кажется, думаете, что время добавления - это когда механизм защиты процессора должен вступить в действие. На самом деле, он не может в этот момент, потому что он не знает, для чего вы собираетесь использовать регистр. Вы можете просто использовать его в качестве счетчика.
Однако, если вы используете его в качестве адреса для доступа к памяти, и эта память каким-то образом недопустима (за пределами вашего адресного пространства или перенесена на диск), ядро вмешается в этот момент, чтобы исправить ситуацию (выбросить ваше приложение на ухо, или внесите в выгруженную память).
Однако даже это не привилегированная инструкция, это просто ошибки обработки страниц ЦП.
Привилегированная инструкция - это то, что вам вообще запрещено делать, например, изменять регистры расположения таблицы дескрипторов прерываний или деактивировать прерывания.