Привилегированные инструкции, добавление значений регистра? - PullRequest
1 голос
/ 07 сентября 2010

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

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

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

  • Спасибо!

1 Ответ

3 голосов
/ 07 сентября 2010

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

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

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

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

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


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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...