Ответ 1
Это опечатка, представленная в 8-м издании и сохранившаяся в 9-м. В седьмом издании, стр. 19, он говорит вместо этого:
"Команда переключения в пользовательский режим является примером привилегированного инструкция".
Что явно имеет смысл.
В моем классе операционных систем меня спрашивают, является ли переход от режима пользователя к режиму ядра привилегированным. Это не зависит от ОС. Сначала я подумал, что да, но это похоже на большой Catch 22. Я сослался на свой учебник:
Аппаратное обеспечение позволяет выполнять привилегированные инструкции только в режим ядра....
Инструкция переключиться в режим ядра - пример привилегированного инструкция.
Гай, Грег; Авраам Сильбершац; Питер Б. Галвин (2010-01-26). Концепции операционной системы (стр. 22). Wiley Higher Ed. Kindle Edition.
Итак, мы начинаем в пользовательском режиме. Для переключения в режим ядра требуется привилегированная инструкция. Привилегированная инструкция должна выполняться в режиме ядра, поэтому мы должны перейти в режим ядра, чтобы включить режим ядра.
Я думаю, что система не позволяет пользователю напрямую переключиться на режим ядра, но это делается ядром, когда пользователь пытается выполнить другую привилегированную инструкцию. Это правильно?
Это опечатка, представленная в 8-м издании и сохранившаяся в 9-м. В седьмом издании, стр. 19, он говорит вместо этого:
"Команда переключения в пользовательский режим является примером привилегированного инструкция".
Что явно имеет смысл.
В пользовательском режиме вы не можете просто переключиться в режим ядра. Взаимодействие между пользователем и ядром осуществляется через системные вызовы. Каждый системный вызов предоставляет одну определенную услугу. Пользователь отправляет имя службы (обычно число) и требуемые параметры. Вот пример реального мира, как это делается. Это ассемблер 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 - это хороший момент, чтобы узнать больше об этом.
Поэтому вы не просто переключаетесь на ядро, но можете попросить ядро сделать что-то для вас. И тогда ядро говорит вам, было ли это сделано или нет.
Как правило, как набор инструкций, которые на самом деле не переходят в режим ядра общим способом, а для запроса системных служб. Таким образом, они переключаются в режим ядра, но только в контексте вызова некоторой части функциональности, которая была настроена операционной системой с целью вызова кода пользователя.
В большинстве современных систем даже это скрыто уровнем API, который реализует определенную функциональную часть, из которой может выполняться вызов операционной системы, как указано выше.
Но в целом верно, что пользовательский код не может сделать эквивалент выражения "с этого момента, я хочу работать в режиме ядра".
В зоне пользователя вы запрашиваете привилегированные операции с помощью системных вызовов ядра, которые при необходимости переключаются в режим ядра. Пользователь использует API, ядро выполняет привилегированные операции.