Переход из режима пользователя в режим ядра

В моем классе операционных систем меня спрашивают, является ли переход от режима пользователя к режиму ядра привилегированным. Это не зависит от ОС. Сначала я подумал, что да, но это похоже на большой Catch 22. Я сослался на свой учебник:

Аппаратное обеспечение позволяет выполнять привилегированные инструкции только в режим ядра....

Инструкция переключиться в режим ядра - пример привилегированного инструкция.

Гай, Грег; Авраам Сильбершац; Питер Б. Галвин (2010-01-26). Концепции операционной системы (стр. 22). Wiley Higher Ed. Kindle Edition.

Итак, мы начинаем в пользовательском режиме. Для переключения в режим ядра требуется привилегированная инструкция. Привилегированная инструкция должна выполняться в режиме ядра, поэтому мы должны перейти в режим ядра, чтобы включить режим ядра.

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

Ответы

Ответ 1

Это опечатка, представленная в 8-м издании и сохранившаяся в 9-м. В седьмом издании, стр. 19, он говорит вместо этого:

"Команда переключения в пользовательский режим является примером привилегированного инструкция".

Что явно имеет смысл.

Ответ 2

В пользовательском режиме вы не можете просто переключиться в режим ядра. Взаимодействие между пользователем и ядром осуществляется через системные вызовы. Каждый системный вызов предоставляет одну определенную услугу. Пользователь отправляет имя службы (обычно число) и требуемые параметры. Вот пример реального мира, как это делается. Это ассемблер x86 AT & T.

Он перемещает имя системного вызова в регистр EAX, указатель на параметры в регистр EBX процессора и затем выдает номер прерывания программного обеспечения 42. Обработка прерываний будет выполнять переход в режим ядра. Номер прерывания просматривается в таблице дескрипторов прерываний (IDT) и вызывает функцию, зарегистрированную там, обработчик syscall. Этот обработчик выполняется в режиме ядра. При возврате в пользовательский режим код будет перемещать содержимое EAX в переменную ret.

pok_ret_t pok_do_syscall (pok_syscall_id_t syscall_id, pok_syscall_args_t* args)
{
  pok_ret_t ret;
  uint32_t  args_addr;
  uint32_t  id;

  args_addr = (uint32_t) args;
  id        = (uint32_t) syscall_id;

  asm volatile ( "movl %1,%%eax  \n\t"
                 "movl %2,%%ebx  \n\t"
                 "int $42        \n\t"
                 "movl %%eax, %0 \n\t"
                 :"=g"(ret)
                 :"g"(id), "g"(args_addr)
                 : "%eax" , "%ebx"
               );
  return ret;
}

ОС Dev wiki - это хороший момент, чтобы узнать больше об этом.

Поэтому вы не просто переключаетесь на ядро, но можете попросить ядро ​​сделать что-то для вас. И тогда ядро ​​говорит вам, было ли это сделано или нет.

Ответ 3

Как правило, как набор инструкций, которые на самом деле не переходят в режим ядра общим способом, а для запроса системных служб. Таким образом, они переключаются в режим ядра, но только в контексте вызова некоторой части функциональности, которая была настроена операционной системой с целью вызова кода пользователя.

В большинстве современных систем даже это скрыто уровнем API, который реализует определенную функциональную часть, из которой может выполняться вызов операционной системы, как указано выше.

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

Ответ 4

В зоне пользователя вы запрашиваете привилегированные операции с помощью системных вызовов ядра, которые при необходимости переключаются в режим ядра. Пользователь использует API, ядро ​​выполняет привилегированные операции.