Как инструкция узнает, работает ли она в привилегированном или пользовательском режиме?
В классе профессор сказал: "Инструкция [ассемблера] знает, выполняется ли она в привилегированном или пользовательском режиме, потому что, если ловушка создается, то это пользовательский режим".
Прежде всего я предполагаю, что это может быть не какая-то ловушка, а конкретная ловушка, говорящая о том, что команда не может быть запущена в пользовательском режиме.
Во-вторых, это кажется ужасно неэффективным: запустите всю команду и проверьте, была ли ловушка. Почему там не установлен флаг или что-то? Разве это не значит сказать, что если это не сработало, тогда мы знаем, что есть проблема? Значит, действительно нет возможности проверить?
1 ответ
Это зависит от вашей платформы (например, ARM, x86 и т. Д.). Я работаю в основном с ARM, поэтому мой ответ может быть специфичным для ARM, но я сохранил его как можно более общим.
Обычно ЦП отслеживает, в каком режиме он находится, и каждая инструкция проверяется во время выполнения. Это делается аппаратно, а не программно, поэтому вам не нужно беспокоиться о его эффективности (оставьте это разработчикам аппаратного обеспечения).
Если инструкция перехвачена аппаратным обеспечением из-за недостаточных привилегий, ЦП обычно начинает выполнять в заданном месте в привилегированном режиме. Этот набор местоположений является обработчиком ловушек, который обычно находится в ядре. Затем обработчик ловушек собирает некоторую информацию о том, что вызвало ловушку, и обрабатывает ее соответствующим образом.