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

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

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

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

  • Спасибо!

person Community    schedule 07.09.2010    source источник


Ответы (1)


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

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

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

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

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


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

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

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

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

person paxdiablo    schedule 07.09.2010
comment
Просто дай мне понять это правильно. Существуют регистры специального назначения, для которых требуются привилегированные инструкции, но регистры общего назначения не требуют привилегированных инструкций. Означает ли это, что если вы добавите два адреса, это будет сделано без каких-либо системных вызовов? Как это произошло? - person ; 07.09.2010
comment
Я действительно думал, что должна быть какая-то защита, установленная ядром, скажем, если значение регистра процесса A попытается добавить к значению регистра процесса B. Я предполагаю, что это приведет к ловушке, и рутинный обработчик позаботится об этом? - person ; 07.09.2010
comment
Вы добавляете их. Это действительно так. Вы выполняете инструкцию типа add %eax,%ebx. ЦП берет значение из %eax и добавляет его к %ebx. Защита адресов осуществляется во время разыменования. Если вы используете этот измененный %ebx, чтобы попытаться получить доступ к памяти за пределами вашего адресного пространства, это момент, когда вступит в действие механизм защиты. До тех пор ЦП не знает, что вы собирается использовать %ebx для доступа к памяти. Уточнение в ответ. - person paxdiablo; 07.09.2010
comment
Спасибо, все это имеет смысл. Большое спасибо! - person ; 07.09.2010