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