Как я понял, функция UNIX read()
вызовет прерывание (TRAP) и вызовет системный вызов read
. Я также вспомнил, что он должен переключиться в "режим ядра" перед вызовом системного вызова read
, а переключение стоит дорого ..
Мне было интересно, почему операция read
должна быть делегирована системному вызову в «режиме ядра», а не полностью выполняться в «пользовательском режиме».
Например, если в «режиме пользователя» может быть служба, которая управляет правами доступа к файлам, операция read
может просто запросить эту службу, не нарушая работу ядра ..
А для драйвера диска это сказано в ссылка, что
Драйверы устройств могут работать как в пользовательском режиме, так и в режиме ядра.
Есть у кого-нибудь идеи по этому поводу? Почему read
должен находиться в режиме ядра?
2 ответа
Прежде всего: больше не правда, что вызов ядра стоит очень дорого. Раньше это было, когда вызов исключения / прерывания / сбоя / прерывания был единственным способом переключения из пользовательского режима в режим ядра в системах x86, но все это изменилось с добавлением systenter
/ sysexit
инструкции машинного кода, которые выполняют более легкий переход.
Даже если это будет дорого с точки зрения затраченного времени, системные вызовы, которые имеют дело с символьными и блочными драйверами устройств, должны выполняться в режиме ядра, потому что работа с аппаратными устройствами включает чтение и запись в аппаратные регистры, которые могут быть отображены в память или доступны через Порты ввода / вывода.
Эти регистры должны быть защищены от любого доступа со стороны процессов пользовательского пространства. Невыполнение этого может привести к тому, что любой процесс не будет использовать установленный API для чтения файла и напрямую использовать аппаратные регистры для чтения и записи в устройство. В случае диска с файлом это позволило бы пользовательскому процессу полностью обойти файловую систему и, следовательно, всю систему безопасности и разрешений.
Итак, если нам нужно защитить эти аппаратные регистры, чтобы ни один пользовательский процесс не мог их использовать, код, который их использует, не может работать на том же уровне привилегий, что и любой другой пользовательский процесс. Следовательно, они работают в другом (более привилегированном) режиме, который называется «режимом ядра».
Подумайте, что произойдет, если вы сконфигурируете систему Linux так, чтобы /dev/sda
(обычно основной жесткий диск, на котором находится корневая файловая система) был доступен для чтения и записи всем и каждому:
# chmod 666 /dev/sda
Это более или менее эквивалентно открытию жесткого диска любому пользовательскому процессу. Вы можете эффективно написать программу, которая могла бы открывать, читать и записывать файлы, хранящиеся на этом устройстве, но в то же время вы можете написать программу, которая открывала, читала и записывала ЛЮБЫЕ файлы в разделе, независимо от того, какие файлы разрешений имеют.
Тем не менее, есть случаи, когда система запускает только доверенные приложения. Системе такого типа не требуется уровень защиты, который присутствует в системе общего назначения, и, следовательно, она может получить выгоду от повышенной скорости, которая достигается вне зависимости от уровней API-интерфейсов для изоляции процесса от оборудования. Самый известный пример - система видеоконференцсвязи. Напомню, что раньше Windows CE запускала все свои программы и драйверы устройств с одинаковыми правами.
Операционные системы созданы не так. Определение ОС - управлять аппаратным обеспечением компьютеров и предоставлять ресурсы их пользователям. Операционная система Sysmtes также имеет понятие пользовательского режима и режима ядра (как вы сказали).
Имея эти концепции, ОС определяет конкретную строку того, что пользователь может делать, а что нет. Позволить им управлять оборудованием - это определенно то, чего ОС не хочет, чтобы пользователи делали.
read
обычно включает доступ к оборудованию. Доступ к оборудованию затруднен и подвержен ошибкам и может оставить компьютер в непригодном для использования состоянии. Операционная система использует драйверы для управления оборудованием компьютера.
Выдача read
(при условии ввода-вывода жесткого диска) обычно заставляет драйвер отправлять набор команд контроллеру диска, читать его вывод, передавать его в основную память и т. Д. Это опасные операции, которые не должны выполняться. доверено пользовательскому режиму.
Если была бы служба в пользовательском режиме для обработки этого. По-прежнему потребуется переключение контекста, потому что служба будет работать как другой процесс.
Конечно, это можно сделать с помощью операционной системы, которая позволяет это. Но современные операционные системы не предназначены для выполнения этого поведения.
Существуют и другие подходы к созданию операционных систем, основанных на микроядрах . Микроядро просто делает минимум для запуска ПК, а все остальное оставляет другим модулям. Это означает, что если модуль выйдет из строя, система все равно будет работать. Это относится к конкретным драйверам, файловым системам и т. Д. Я не знаю, позволяют ли микроядра им работать в пользовательском пространстве.
Надеюсь это поможет!
Похожие вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.