Как ядро ​​знает, находится ли процессор в пользовательском режиме или режиме кенеля?

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

Ответы

Ответ 1

Вы можете узнать, находитесь ли вы в режиме пользователя или в режиме ядра с уровня привилегий, установленного в регистре сегмента кода (CS). Каждая инструкция, загруженная в CPU из памяти, на которую указывает регистр RIP или EIP (регистр указателя команд в зависимости от того, является ли вы x86 или x86_64), будет считывать из сегмента, описанного в таблице глобальных дескрипторов (GDT), текущим кодом- сегментный дескриптор. Нижние два бита дескриптора сегмента кода будут определять текущий уровень привилегий, в котором выполняется код. Когда выполняется syscall, который обычно выполняется с помощью программного прерывания, CPU проверяет текущий уровень привилегий, и если он в пользовательском режиме будет обмениваться текущим дескриптором сегмента кода для уровня ядра, как определено дескриптор прерывания программного обеспечения syscall, а также сделать переключатель стека и сохранить текущие флаги, значение CS уровня пользователя и значение RIP в этом новом стеке уровня ядра. Когда syscall завершается, значение CS-значения, флаги и указателя команды (EIP или RIP) пользовательского режима восстанавливаются из стека ядра, а коммутатор стека возвращается в стек текущего процесса выполнения.

Ответ 2

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

Ответ 3

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

Ответ 4

Термин называется "Режим Superviser", который применяется к x86/ARM и многим другим процессорам.

Прочтите это (относится только к процессору x86):

http://en.wikipedia.org/wiki/Ring_ (computer_security)

Кольцо от 0 до 3 - это разные уровни привилегий процессора x86. Обычно используются только Ring0 и 3 (ядро и пользователь), но в настоящее время Ring 1 находит использование (например, VMWare использовал его для эмуляции гостевого исполнения кольца 0). Только Ring 0 имеет полную привилегию запуска некоторых привилегированных инструкций (например, lgdt или lidt), поэтому хороший тест на уровне сборки, конечно, должен выполнить эту инструкцию и посмотреть, не вызывает ли ваша программа какое-либо исключение или нет.

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

http://duartes.org/gustavo/blog/post/cpu-rings-privilege-and-protection

Ответ 5

Это простой вопрос и не нуждается в комментариях экспертов, как указано выше.

Вопрос в том, как процессор узнает, является ли он режимом ядра или его пользовательским режимом. Ответ - "бит режима"....

Немного в регистре статуса регистров набора cpu. Когда "бит режима = 0", он рассматривается как режим ядра (также называемый режимом мониторинга, привилегированным режимом, защищенным режимом... и многими другими...) Когда "бит режима = 1", он считается режимом пользователя... и теперь пользователь может выполнять свои личные приложения без какого-либо специального прерывания ядра.

так просто... не так ли?