В чем разница между пользовательским пространством и ядром?

В чем разница между пользовательским пространством и ядром?

Я пытаюсь понять, что именно такое userland? Все, кого я спрашиваю, говорят: "Все, что не является ядром". Но для меня это не осязаемо. Когда я читаю, что ядро ​​может запустить этот драйвер в userland или что-то в этом роде; я не могу себе представить, что произойдет!. Поэтому я буду признателен, если кто-нибудь разъяснит мне это.

решение1

На одном концептуальном уровне ядро ​​— это все, что работает на «более привилегированном» уровне аппаратной защиты. Это может быть кольцо 0 на процессорах x86, системный режим на ARM, режим ядра на MIPS, режим супервизора на 68xxx и т. д. Ядро обычно управляется прерываниями, либо программными прерываниями (системные вызовы), либо аппаратными прерываниями (дисководы, сетевые карты, аппаратные таймеры).

На том же концептуальном уровне «пользовательская область» — это то, что работает в наименее привилегированном режиме (кольцо 3 на процессорах x86, пользовательский режим на ARM или MIPS и т. д.). Пользовательская область использует преимущество способа, которым ядро ​​сглаживает незначительные аппаратные различия, предоставляя всем программам один и тот же API. Например, некоторые беспроводные карты могут иметь дополнительные регистры управления по сравнению с другими или содержать больше или меньше встроенного буфера для входящих пакетов. Код драйвера учитывает эти различия (иногда игнорируя расширенные или необычные функции) и предоставляет всем программам один и тот же API сокета.

Некоторые процессоры (например, x86, VAX, Alpha AXP) имеют более двух режимов, но общая архитектура Unix не использует промежуточные режимы.

Программы и процессы, которые вы видите запущенными в Unix, Linux или *BSD, являются пользовательским пространством. Поскольку процессы являются вытесняемыми, вы на самом деле никогда не видите запущенного ядра, вы видите только побочные эффекты, такие как read()возврат системного вызова или запуск функции обработчика сигнала.

Чтобы ответить на ваш конкретный вопрос, в Unix, Linux, *BSD "драйвер" обычно представляет собой некую небольшую часть программного обеспечения, которая имеет дело с определенными особенностями некоторого оборудования: сетевой карты, дисковода, видеокарты. Программное обеспечение драйвера почти всегда должно работать в Ring 0/режиме супервизора/пространстве ядра, чтобы иметь доступ к аппаратным прерываниям или отображенной памяти оборудования или чему-либо еще. Драйвер заботится о конкретных аппаратных функциях и делает это оборудование вписывающимся в стандартизированный или условный вид кода ядра о том, как должно работать оборудование. Поэтому запуск драйвера в пользовательском пространстве требует, чтобы ядро ​​показывало программе пользовательского пространства такие вещи, как отображенная память или регистры устройства или прерывания или другие специальные функции. Это может быть сложно, так как специальные функции, которые могут потребоваться устройству, нелегко вписываются в обычный API в стиле Unix, представленный программам пользовательского пространства. Кроме того, планирование является проблемой, так как программы пользовательского пространства обычно не реагируют на прерывания так быстро.

решение2

Большинство современных процессоров имеютядроили режим супервизора, а также ограниченныйпользовательрежим. Это аппаратная функция ЦП. «Userland» — это еще одно название кода, работающего в пользовательском режиме.

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

MMU позволяет ядру переупорядочивать блоки (или страницы) оперативной памяти таким образом, чтобы они выглядели в коде в ином порядке, чем они физически находятся в оперативной памяти, а также вызывать код пользовательского режималовушкаили "вина"возврат в режим ядра при доступе к определенным страницам. Пользовательский режим не может изменить действия MMU, это может сделать только режим ядра.

Итак, MMU позволяет коду режима ядра делать всевозможные интересные вещи, например:

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

Вы можете видеть, что MMU, наряду с режимом ядра/пользователя, является краеугольным камнем многозадачной операционной системы, и с помощью этих инструментов можно создать систему, которая работает с более высокоуровневыми вещами, такими как идея процессов. Ядро поддерживает таблицы страниц для каждого процесса и в основном перепрограммирует MMU, прежде чем оно переключится в пользовательский режим и передаст управление процессу для его временного среза. Такие вещи, как mallocи все, когда процесс получает память, заставляют ядро ​​изменять таблицы страниц MMU.

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

Из-за этой защиты, которая существует в пользовательском режиме, если программа делает что-то вроде сбоя или выходит из строя и перезаписывает себя, ядро ​​может остановить этот процесс. В режиме ядра эта защита отсутствует, поэтому ядро ​​перестанет работать, и, таким образом, вся ваша система также перестанет работать. Когда неустранимая ошибка, подобная этой, происходит в режиме ядра, это называется паникой ядра. СмотритеЧто такое «паника ядра»?для получения подробной информации.

ядро может запустить этот драйвер в пользовательском пространстве

Режим ядра или супервизора процессоров также не позволяет пользовательскому режиму напрямую обращаться к устройствам ввода-вывода, идея в том, что для этого нужно вызвать ядро. В Linux код, который напрямую взаимодействует с устройствами (он работает в режиме ядра),драйверы устройств(типмодуль ядра, вы можете управлять ими с помощью таких команд, как lsmod, insmod, modprobe, и rmmod).

Что произойдет, если ваш драйвер устройства, который будет работать в режиме ядра при простейшей настройке, имеет ошибку и делает что-то неприятное, например, перезаписывает случайные данные в ОЗУ (а поскольку он находится в режиме ядра, он имеет неограниченный доступ ко всей ОЗУ и может перезаписывать само ядро). Было бы неплохо, если бы мы могли заставить драйвер устройства работать в пользовательском режиме, чтобы он не мог ничего сделать с самим ядром или другими процессами.

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

Ядра, которые пытаются сделать как можно больше в пользовательском режиме, называютсямикроядра, а Linux - это его противоположность, которая называетсямонолитный. Драйверы пользовательского режима существуют для Linux (например, FUSE), и есть дажерамкичто позволяет это.

решение3

Основываясь на том, что сказал Брюс, весь код, который предоставляется ядру, должен быть доверенным. Если есть какой-то способ, которым вредоносный код может быть выполнен ядром, игра окончена. Вот где в игру вступает разделение привилегий кода, выполняемого пользователем, и кода, выполняемого ядром. Код, который выполняется пользователем, не обязательно должен быть на 100% свободен от зла. Он не выполняется напрямую ядром.

Программы пользовательского пространства просто взаимодействуют с открытыми частями ядра, такими как API и загруженные модули. Примером может служить iptables. Существует несколько модулей ядра (.ko) или «драйверов», которые фактически выполняют работу iptables, они являются частьюфреймворк netfilter. Когда вы выполняете команды с помощью, /sbin/iptablesвы используете компонент userland, который в свою очередь взаимодействует с модулями netfilter, загруженными в ядро. Это позволяет разделить, чтобы пользовательский код не мог быть непреднамеренно выполнен ядром.

решение4

В операционных системах Unix/Linux мы различаемпространство пользователяипространство ядра. Это всего лишь синонимы для пользовательского пространства и того, к чему относится ядро.

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

Пространство ядра — это место, где работает само ядро. Это ограниченная область, к которой даже root не имеет доступа. Но пользователь root может манипулировать некоторыми параметрами ядра с помощью интерфейса, предоставляемого ядром (procfs, sysfs).

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

Что именно представляет собой пользовательское пространство?

Итак, пользовательское пространство — это то, что демон делает (или может делать) при взаимодействии с ресурсами операционной системы (ввод-вывод, сеть, память, процессорное время). Эти ресурсы скрыты от процесса в пространстве ядра.

Короткий ответ:

Это то же самое, что кабина самолета для пилота.

Связанный контент