Режим ядра для пользовательской программы

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


person Rahul Patel    schedule 23.05.2020    source источник
comment
Просто запустите на своем компьютере DOS, Windows 95, Windows 98 или Windows ME в течение недели или около того. В этих операционных системах нет разделения на режим ядра и режим пользователя. Просто попробуйте и убедитесь сами.   -  person datenwolf    schedule 24.05.2020


Ответы (2)


Проблема с оборудованием, файлами и другими важными для безопасности частями ОС заключается в том, что с ними следует работать только правильным образом, иначе ОС будет повреждена (или произойдут другие плохие вещи).

Без разделения ядра и пользователя само приложение предоставляет код, который работает с критически важными для ОС частями. Этот код может быть любым. Таким образом, неправильно сформированное приложение потенциально может повредить ОС.

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

Итак, правильно написав код, обрабатывающий системные вызовы, ОС защищает свои критические части от некорректно сформированных приложений.

person Tsyvarev    schedule 24.05.2020

Существует несколько причин разделения адресных пространств.

Во-первых, это безопасность. Каждая программа может обращаться к ядру, но ядро ​​не обязано это делать. Например, вы можете попробовать попросить ядро ​​open("/dev/sda", O_RDWR) от имени непривилегированного пользователя и посмотреть, что произойдет. Ядро не позволит вам испортить систему, которую используют другие пользователи.

Во-вторых, удобство. Во многих встроенных системах действительно нет пользовательского пространства. Итак, давайте представим, что мы пишем нашу программу в ядре. И теперь в нашей программе есть небольшая ошибка, и она вылетает или перезаписывает важную память. В большинстве случаев это портит адресное пространство, и вам нужно новое адресное пространство. Но если у вас только одно адресное пространство, единственный способ туда попасть — перезагрузиться.

Третий — синхронизация. Например, если два процесса хотят использовать память, они должны сотрудничать, чтобы не использовать один и тот же блок памяти. Если в одной программе есть ошибка, это может вызвать проблемы во многих других программах. Принудительное управление памятью через API, которые программы вынуждены соблюдать, означает, что ни одна программа не может вызвать такие проблемы.

person root    schedule 25.05.2020