Как ядро ​​узнает, находится ли процессор в режиме пользователя или в режиме кенеля? - PullRequest
14 голосов
/ 07 марта 2011

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

Ответы [ 5 ]

32 голосов
/ 14 марта 2011

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

7 голосов
/ 08 марта 2011

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

3 голосов
/ 18 декабря 2011

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

1 голос
/ 15 марта 2012

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

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

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

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

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

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

0 голосов
/ 23 мая 2012

Это простой вопрос и не требует каких-либо комментариев экспертов, как указано выше.

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...