Виртуальное адресное пространство linux делится

Русские Блоги

Пространство ядра Linux и пространство пользователя

Пространство ядра и пространство пользователя

Для 32-разрядной операционной системы ее адресное пространство (виртуальное адресное пространство или линейное адресное пространство) составляет 4G (2 в 32-й степени). Другими словами, максимальное адресное пространство процесса составляет 4G. Ядром операционной системы является ядро, которое не зависит от обычных приложений и может обращаться к защищенному пространству памяти, а также ко всем разрешениям на доступ к базовым аппаратным устройствам. Чтобы обеспечить безопасность ядра, современные операционные системы обычно вынуждают пользовательские процессы не работать с ядром напрямую. Конкретная реализация заключается в том, что операционная система делит виртуальное адресное пространство на две части, одна часть — это пространство ядра, а другая часть — пользовательское пространство. Для операционной системы Linux старший байт 1 ГБ (от виртуального адреса 0xC0000000 до 0xFFFFFFFF) используется ядром и называется пространством ядра. Младшие байты 3G (от виртуального адреса 0x00000000 до 0xBFFFFFFF) используются различными процессами и называются пространством пользователя.
Мы можем понять приведенный выше абзац так:
В адресном пространстве 4G каждого процесса самый высокий 1G совпадает, то есть пространство ядра. Только оставшийся 3G используется самим процессом.
Другими словами, пространство ядра размером до 1 ГБ используется всеми процессами!
На следующем рисунке показано распределение адресного пространства 4G для каждого процесса (этот рисунок взят из Интернета):

Почему нам нужно различать пространство ядра и пространство пользователя

Среди всех инструкций ЦП некоторые инструкции очень опасны: их неправильное использование приведет к сбою системы, например очистка памяти и установка часов. Если всем программам разрешить использовать эти инструкции, вероятность сбоев системы значительно возрастет.
Таким образом, ЦП делит инструкции на привилегированные и непривилегированные инструкции.Для этих опасных инструкций их разрешено использовать только операционной системе и связанным с ней модулям, а обычные приложения могут использовать только инструкции, которые не вызовут катастрофы. Например, процессор Intel делит уровень привилегий на 4 уровня: Ring0 ~ Ring3.
Фактически, система Linux использует только два уровня выполнения, Ring0 и Ring3 (то же самое верно и для систем Windows). Когда процесс выполняется на уровне Ring3, он называется запущенным в пользовательском режиме, а когда он выполняется на уровне Ring0, он называется запущенным в режиме ядра.

Читайте также:  Linux which files in directory

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

Что ж, теперь нам нужно снова объяснить, что такое режим ядра и пользовательский режим:
Когда процесс выполняется в пространстве ядра, он находится в режиме ядра, а когда процесс выполняется в пользовательском пространстве, он находится в пользовательском режиме.
В режиме ядра процесс выполняется в адресном пространстве ядра, и в это время ЦП может выполнять любые инструкции. Работающий код также не подлежит никаким ограничениям, может свободно обращаться к любому действующему адресу, а также может напрямую обращаться к порту.
В пользовательском режиме процесс выполняется в адресном пространстве пользователя, а исполняемый код подвергается множеству проверок со стороны ЦП. Они могут получить доступ только к виртуальному адресу страницы, к которой можно получить доступ в пользовательском режиме, указанном в таблице страниц. запись, отображающая свое адресное пространство.И он может напрямую обращаться только к доступным портам, указанным в битовой карте разрешений ввода-вывода в сегменте состояния задачи (TSS).

Для предыдущей операционной системы DOS не было таких понятий, как пространство ядра, пространство пользователя, а также режим ядра и пользовательский режим. Можно считать, что все коды работают в режиме ядра, поэтому код приложения, написанный пользователем, может легко привести к сбою операционной системы.
Для Linux, разграничивая структуру пространства ядра и пространства пользователя, код операционной системы (код операционной системы намного сильнее, чем код приложения) и код приложения изолированы. Даже одна ошибка прикладной программы не повлияет на стабильность операционной системы, поэтому другие программы могут работать нормально (Linux — это многозадачная система!).

Таким образом, разделение пространства ядра и пространства пользователя существенно улучшает стабильность и удобство использования операционной системы.

Как войти в пространство ядра из пользовательского пространства

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

Читайте также:  Linux все через прокси

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

На следующем рисунке кратко описан переход между пользовательским режимом и режимом ядра:

Поскольку для использования системных ресурсов процесс пользовательского режима должен быть переключен в режим ядра, давайте посмотрим, сколько способов существует у процесса для входа в режим ядра из пользовательского режима. Вкратце, есть три способа:Системный вызов, мягкое прерывание и аппаратное прерывание. Каждый из этих трех методов требует обширных знаний об операционной системе, поэтому я не буду здесь подробно останавливаться.

весь кадр

Затем давайте посмотрим на структуру всей системы Linux с точки зрения пространства ядра и пространства пользователя. Его можно условно разделить на три части, снизу вверх: оборудование -> пространство ядра -> пространство пользователя. Как показано на рисунке ниже (этот рисунок взят из Интернета):

Помимо оборудования, код в пространстве ядра контролирует право на использование аппаратных ресурсов, а код в пользовательском пространстве может использовать аппаратные ресурсы в системе только через интерфейс системного вызова, предоставляемый ядром. На самом деле не только Linux, но и конструкция операционной системы Windows похожа.

Фактически, мы можем суммировать активность каждого процессора в любой данный момент времени как одну из следующих трех:

  • Запуск в пользовательском пространстве и выполнение пользовательских процессов.
  • Выполняется в пространстве ядра в контексте процесса и выполняется от имени определенного процесса.
  • Выполняется в пространстве ядра в контексте прерывания, не имеет ничего общего с каким-либо процессом, обрабатывает конкретное прерывание.
Читайте также:  Linux network connections by process

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

подводить итоги

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

Источник

Оцените статью
Adblock
detector