Я знаю, что режим ядра является привилегированным, так что в режиме ядра доступны все аппаратные возможности и все инструкции в наборе инструкций. Я также знаю, что когда мы делаем вызов процедуры (скажем, read()), она, в свою очередь, вызывает системный вызов. Но перед этим он переходит в режим ядра. Я хотел знать, какая польза от использования режима ядра, если каждая пользовательская программа может работать в режиме ядра, поскольку все вызовы процедур и системные вызовы доступны для пользовательских программ.
Режим ядра для пользовательской программы
Ответы (2)
Проблема с оборудованием, файлами и другими важными для безопасности частями ОС заключается в том, что с ними следует работать только правильным образом, иначе ОС будет повреждена (или произойдут другие плохие вещи).
Без разделения ядра и пользователя само приложение предоставляет код, который работает с критически важными для ОС частями. Этот код может быть любым. Таким образом, неправильно сформированное приложение потенциально может повредить ОС.
При разделении ядра и пользователя единственным способом взаимодействия приложения с оборудованием является системный вызов. Это позволяет запускать только ограниченный код, который работает с важными для безопасности частями ОС. Приложение не имеет способа изменить этот код.
Итак, правильно написав код, обрабатывающий системные вызовы, ОС защищает свои критические части от некорректно сформированных приложений.
Существует несколько причин разделения адресных пространств.
Во-первых, это безопасность. Каждая программа может обращаться к ядру, но ядро не обязано это делать. Например, вы можете попробовать попросить ядро open("/dev/sda", O_RDWR)
от имени непривилегированного пользователя и посмотреть, что произойдет. Ядро не позволит вам испортить систему, которую используют другие пользователи.
Во-вторых, удобство. Во многих встроенных системах действительно нет пользовательского пространства. Итак, давайте представим, что мы пишем нашу программу в ядре. И теперь в нашей программе есть небольшая ошибка, и она вылетает или перезаписывает важную память. В большинстве случаев это портит адресное пространство, и вам нужно новое адресное пространство. Но если у вас только одно адресное пространство, единственный способ туда попасть — перезагрузиться.
Третий — синхронизация. Например, если два процесса хотят использовать память, они должны сотрудничать, чтобы не использовать один и тот же блок памяти. Если в одной программе есть ошибка, это может вызвать проблемы во многих других программах. Принудительное управление памятью через API, которые программы вынуждены соблюдать, означает, что ни одна программа не может вызвать такие проблемы.