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