Как я понял, функция UNIX read() вызовет прерывание (TRAP) и вызовет системный вызов read. Я также вспомнил, что он должен переключиться в "режим ядра" перед вызовом системного вызова read, а переключение стоит дорого ..

Мне было интересно, почему операция read должна быть делегирована системному вызову в «режиме ядра», а не полностью выполняться в «пользовательском режиме».

Например, если в «режиме пользователя» может быть служба, которая управляет правами доступа к файлам, операция read может просто запросить эту службу, не нарушая работу ядра ..

А для драйвера диска это сказано в ссылка, что

Драйверы устройств могут работать как в пользовательском режиме, так и в режиме ядра.

Есть у кого-нибудь идеи по этому поводу? Почему read должен находиться в режиме ядра?

1
Hanfei Sun 7 Янв 2014 в 18:52

2 ответа

Лучший ответ

Прежде всего: больше не правда, что вызов ядра стоит очень дорого. Раньше это было, когда вызов исключения / прерывания / сбоя / прерывания был единственным способом переключения из пользовательского режима в режим ядра в системах x86, но все это изменилось с добавлением systenter / sysexit инструкции машинного кода, которые выполняют более легкий переход.

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

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

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

Подумайте, что произойдет, если вы сконфигурируете систему Linux так, чтобы /dev/sda (обычно основной жесткий диск, на котором находится корневая файловая система) был доступен для чтения и записи всем и каждому:

# chmod 666 /dev/sda

Это более или менее эквивалентно открытию жесткого диска любому пользовательскому процессу. Вы можете эффективно написать программу, которая могла бы открывать, читать и записывать файлы, хранящиеся на этом устройстве, но в то же время вы можете написать программу, которая открывала, читала и записывала ЛЮБЫЕ файлы в разделе, независимо от того, какие файлы разрешений имеют.

Тем не менее, есть случаи, когда система запускает только доверенные приложения. Системе такого типа не требуется уровень защиты, который присутствует в системе общего назначения, и, следовательно, она может получить выгоду от повышенной скорости, которая достигается вне зависимости от уровней API-интерфейсов для изоляции процесса от оборудования. Самый известный пример - система видеоконференцсвязи. Напомню, что раньше Windows CE запускала все свои программы и драйверы устройств с одинаковыми правами.

3
mcleod_ideafix 7 Янв 2014 в 22:15

Операционные системы созданы не так. Определение ОС - управлять аппаратным обеспечением компьютеров и предоставлять ресурсы их пользователям. Операционная система Sysmtes также имеет понятие пользовательского режима и режима ядра (как вы сказали).

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

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

Выдача read (при условии ввода-вывода жесткого диска) обычно заставляет драйвер отправлять набор команд контроллеру диска, читать его вывод, передавать его в основную память и т. Д. Это опасные операции, которые не должны выполняться. доверено пользовательскому режиму.

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

Конечно, это можно сделать с помощью операционной системы, которая позволяет это. Но современные операционные системы не предназначены для выполнения этого поведения.

Существуют и другие подходы к созданию операционных систем, основанных на микроядрах . Микроядро просто делает минимум для запуска ПК, а все остальное оставляет другим модулям. Это означает, что если модуль выйдет из строя, система все равно будет работать. Это относится к конкретным драйверам, файловым системам и т. Д. Я не знаю, позволяют ли микроядра им работать в пользовательском пространстве.

Надеюсь это поможет!

6
Paulo Bu 7 Янв 2014 в 15:21