Что такое ядро Linux
Ядро Linux за авторством Линуса Торвальдса недавно отметило юбилей, вот уже три десятилетия оно используется в компьютерах по всему миру. Благодаря тому, что оно перенесено на множество платформ, его можно встретить практически везде, в персональных компьютерах, смартфонах, носимой электронике, бытовой технике и сетевых устройствах.
Так что же делает ядро Linux и почему оно так востребовано? Мы рассмторим архитектуру ядра, его основные задачи и интерфейсы. Это поможет понять его преимущества и недостатки.
Что такое ядро Linux
1. На чём написано ядро
Несмотря на то, что ассемблерный код позволяет достичь наилучшей производительности, его возможности весьма ограничены, поэтому большая часть кода написана на языке C, его доля достигает 98%. На ассемблере написаны только небольшие вставки, повышающие производительность, архитектурно-зависимые функции и загрузчик.
2. Архитектура ядра
Уровень доступа к ресурсам компьютера зависит от того, какое ядро использует операционная система. Привилегии ядра выше остальных приложений, а работает оно в едином адресном пространстве. В зависимости от того, сколько задач выполняется на уровне ядра, различают несколько типов ядер. Самые популярные – это монолитное (Linux), микроядро (macOS) и гибридное (Windows).
Ядро Linux монолитное, большая его часть хранится в одном файле. Однако, это не признак монолитного ядра, модули вполне могут храниться отдельно. Основная его особенность заключается в том, что оно обрабатывает все процессы, кроме пользовательских приложений. То есть управление процессами и памятью, драйверы, виртуальная файловая система, сетевой стек и многое другое – это всё заботы ядра, которые к тому же имеют самый высокий уровень доступа к аппаратной части компьютера.
Однако, это не означает то, что пользовательские приложения не могут выполнять схожие функции. Например, система инициализации Systemd помимо прочего выстраивает иерархию процессов поверх групп ядра cgroups, а демоны, вроде PulseAudio, контролируют работу устройств, расширяя функциональность драйверов.
Также стоит понимать, что ядро хоть и монолитное, но состоит из внутренних модулей, которые загружаются только по необходимости, а не все сразу. Некоторые модули хранятся отдельно от ядра, в основном это дополнительные драйверы устройств.
Интерфейсы, имена переменных и структура каталогов системы определяются стандартами POSIX, что делает Linux UNIX-подобной системой. Линус Торвальдс, создатель ядра, выбрал UNIX по той причине, что имелась база приложений, необходимых для функционирования операционной системы, утилиты GNU. Однако, он не разделяет идеи философии UNIX, одна программа – одно действие, текстовый вывод информации как универсальный интерфейс. По его мнению они не отражают запросы современных пользователей.
3. Что делает ядро
Как было сказано ранее, у монолитного ядра самый широкий спектр задач. На верхнем уровне ядро обрабатывает поступающие системные вызовы, которые являются интерфейсом между ядром и пользовательскими приложениями. На нижнем уровне ядро обрабатывает аппаратные прерывания, сигналы, поступающие от периферии, процессора, памяти и так далее.
На обработке прерываний задачи ядра не заканчиваются, оно содержит в себе драйверы устройств. Драйверы нужны для того, чтобы обработать поступающие с устройств сигналы, а команды приложений перевести в машинный код.
Драйверы занимают большую часть ядра. Некоторые из них представлены сразу в виде бинарных файлов, что противоречит идеям фонда СПО. Версия ядра без закрытых драйверов называется Linux-libre, на практике его использование крайне затруднительно, так как собрать компьютер на основе комплектующих только с открытыми драйверами у вас едва ли получится.
Остальные задачи ядра – это работа с абстракциями. Например, планировщик создаёт виртуальные потоки, менеджер памяти выделяет и изолирует часть оперативной памяти под процесс, виртуальная файловая система создаёт единое пространство для хранения файлов, а сетевой модуль создаёт сокеты. Это одно из условий обеспечения высокого уровня безопасности, иначе одна программа могла бы беспрепятственно взять конфиденциальные данные из другой, например, ключи шифрования.
Система межпроцессного взаимодействия следит за тем, чтобы не возникало конфликтов при обращении к одним и тем же ресурсам компьютера, а также обеспечивает обмен данными между процессами.
Со стороны пользовательских приложений всё это выглядит как настоящее оборудование, с той лишь разницей, что общение с процессором и памятью происходит не напрямую, а с помощью системных вызовов. Для периферийных устройств имеются символьные и блочные ссылки в каталоге /dev, последние отличает то, что ни работают с блоками фиксированного размера.
Несмотря на то, что ядро контролирует все процессы, само по себе оно ничего не делает, ему нужны пользовательские программы и их процессы. Среди базовых приложений стоит отметить утилиты проекта GNU, без них не обходится ни один дистрибутив Linux. Например, командная оболочка Bash позволит вам вводить команды в консоли.
4. Версии ядра
Запись версии ядра можно представить в виде: A.B.C-D.
- A – это версия ядра, изначально планировалось повышать номер только после значительной переработки ядра, но сейчас это делают после достаточного количества правок и нововведений примерно два раза за десятилетие.
- B – это ревизия ядра, обновление происходит каждые 2-3 месяца. Некоторые из них получают долгосрочную поддержку (LTS – long term support). Последним таким ядром стало 5.10. Каждая ревизия имеет большой список изменений, которые сначала проверяют тестировщики.
- C и D отвечают за небольшие правки в коде ядра. С увеличивается в том случае, если были обновлены драйверы устройств, а D – когда вышел очередной патч безопасности. Эти номера могут меняться практически каждый день.
Узнать версию ядра можно с помощью команды:
5. Где хранятся файлы ядра
Файлы ядра хранятся в каталоге /boot. Непосредственно само ядро находится в запакованном виде в файле vmlinuz, где z как раз и указывает на то, что ядро сжато для экономии места. Файл initrd.img – это первичная файловая система, которая монтируется перед тем, как подключить реальные накопители к виртуальной файловой системе VFS. Там же содержатся дополнительные модули ядра, поэтому этот файл может быть больше самого ядра. В файле system.map можно найти адреса функций и процедур ядра, что будет полезно при отладке.
Выводы
Подведём итоги. Теперь вы знаете что такое ядро Linux. Ядро — это самая привилегированная программа на компьютере. Если говорить конкретно о ядре Linux, то оно монолитное. Иными словами, в режиме ядра работает всё необходимое для управления ресурсами компьютера. В пользовательском режиме также имеются программы для управления, но они лишь расширяют возможности ядра.
Соответствие стандартам POSIX позволило перенести ядро на множество платформ. Но следование философии UNIX во многих аспектах дистрибутивов Linux имеет как плюсы, так и минусы. Простые приложения с выводом в терминал хорошо подходят для серверов, но для домашнего использования такой подход едва ли может привлечь широкие массы.
К примеру, Android использует ядро Linux, но не утилиты GNU и в целом не пытается стать похожим на UNIX, что во многом обеспечило его популярность. Так что ядро – это лишь инструмент, а цели могут быть любыми, от запуска терминала и до создания суперкомпьютеров.
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.
Что такое ядро операционной системы
Ядро — это центральный компонент операционной системы. Ядро также считается сердцем операционной системы. Он отвечает за управление всеми процессами, памятью, файлами и т. д. Ядро функционирует на самом низком уровне операционной системы. Он действует как интерфейс (мост) между пользовательским приложением (программным обеспечением) и аппаратным обеспечением. Поэтому связь между программным обеспечением и аппаратным обеспечением осуществляется через ядро.
Основные функции, которые выполняет ядро:
- управление процессами
- управление памятью
- управление устройством
- обработка прерываний
- операции ввода/вывода
Теперь давайте разберемся подробнее в этих функциях ядра.
Функции ядра в операционной системе
Управление процессами
Создание, выполнение и завершение процессов выполняются внутри системы всякий раз, когда система находится во включенном состоянии (режиме ON). Процесс содержит всю информацию о задаче, которую необходимо выполнить. Таким образом, для выполнения любой задачи внутри системы создается процесс. В то же время существует множество процессов, которые находятся в активном состоянии внутри системы. Управление всеми этими процессами очень важно для предупреждения тупиковых ситуаций и для правильного функционирования системы, и оно осуществляется ядром.
Управление памятью
Всякий раз, когда процесс создается и выполняется, он занимает память, и когда он завершается, память должна быть освобождена и может быть использована снова. Но память должна быть обработана кем-то, чтобы освобожденная память могла быть снова назначена новым процессам. Эта задача также выполняется ядром. Ядро отслеживает, какая часть памяти в данный момент выделена и какая часть доступна для выделения другим процессам.
Управление устройствами
Ядро также управляет всеми различными устройствами, подключенными к системе, такими как устройства ввода и вывода и т. д.
Обработка прерываний
При выполнении процессов возникают условия, при которых сначала необходимо решить задачи с большим приоритетом. В этих случаях ядро должно прерывать выполнение текущего процесса и обрабатывать задачи с большим приоритетом, которые были получены в промежутке.
Операции ввода/вывода
Поскольку ядро управляет всеми подключенными к нему устройствами, оно также отвечает за обработку всех видов входных и выходных данных, которыми обмениваются эти устройства. Таким образом, вся информация, которую система получает от пользователя, и все выходные данные, которые пользователь получает через различные приложения, обрабатываются ядром.
Типы ядер в операционной системе
Как выше было сказано ядро — это программа, которая является основным компонентом операционной системы. Теперь давайте рассмотрим типы ядер.
Ядро подразделяется на два основных типа:
- монолитное ядро
- Микро-Ядра
Существует еще один тип ядра, который является комбинацией этих двух типов ядер и известен как гибридное ядро. Рассмотрим каждый из них вкратце.
Монолитное Ядро
В этом типе архитектуры ядра все функции, такие как управление процессами, управление памятью, обработка прерываний и т. д. выполняются в пространстве ядра.Монолитные ядра сначала состояли только из одного модуля, и этот модуль отвечал за все функции, которые выполнялись ядром. Это увеличило производительность ОС, так как все функции присутствовали внутри одного модуля, но это также привело к серьезным недостаткам, таким как большой размер ядра, очень низкая надежность, потому что даже если одна функция ядра отказала, это привело к отказу всей программы ядра и плохому обслуживанию, по той же причине. Таким образом, для повышения производительности системы был применен модульный подход в монолитных ядрах, в которых каждая функция присутствовала в отдельном модуле внутри пространства ядра. Таким образом, для исправления любых ошибок или в случае сбоя, только этот конкретный модуль был выгружен и загружен после исправления.
Микроядра
В этом типе архитектуры ядра основные пользовательские службы, такие как управление драйверами устройств, управление стеком протоколов, управление файловой системой и управление графикой, присутствуют в пространстве пользователя, а остальные функции управление памятью, управление процессами присутствует внутри пространства ядра. Таким образом, всякий раз, когда система имеет потребность в услугах, присутствующих в пространстве ядра, ОС переключается в режим ядра, а для служб пользовательского уровня она переключается в режим пользователя. Этот тип архитектуры ядра уменьшает размер ядра, но скорость выполнения процессов и предоставления других услуг значительно ниже, чем у монолитных ядер.
Гибридное Ядро
Для наилучшей производительности системы нам требуется как высокая скорость, так и малый размер ядра, чтобы наша система могла иметь максимальную эффективность. Поэтому для решения этой задачи был разработан новый тип ядра, который представлял собой комбинацию монолитного ядра и микроядра. Этот тип ядра известен как гибридное ядро. Такой тип архитектуры используется практически во всех системах, которые производятся в настоящее время.
Что делает ядро Linux
Ядро Linux — это ключевой компонент любого дистрибутива. Оно создавалось Линусом Торвальдсом как средство для доступа к терминалу университетского компьютера, но сейчас на него возложено гораздо больше функций.
Мы затронем не только само ядро, но ещё и утилиты проекта GNU. Это поможет определить границы возможностей ядра, а также понять, почему ядро без них бесполезно.
Что делает ядро Linux
Ядро Linux монолитное. Это значит, что оно самодостаточное и выполняет все низкоуровневые задачи. Код ядра можно разбить на блоки. Часть кода отвечает за общение с аппаратной частью, другая — за виртуализацию и так далее. Чем выше уровень, тем больше системных вызовов доступно программам. Ядро работает со всеми компонентами компьютера: процессором, оперативной памятью, сетью, устройствами ввода/вывода. Ниже представлена карта ядра Linux.
Аппаратный уровень
На нём определяется интерфейс подключения и архитектура, чтобы была возможность перейти на следующий уровень. Например, у процессора считывается идентификатор, что позволяет задействовать все его возможности.
Уровень драйверов
Код драйверов занимает большую часть ядра. Это легко объяснить. Если остальной код ядра унифицирован, то драйверы у каждого устройства свои. Их настолько много, что некоторые вынесены в отдельные модули. Если собирать ядро только под определённое железо, то оно займёт совсем немного места.
Функциональный уровень
На этом уровне, с учётом двух предыдущих, определяются функциональные возможности компьютера. Настраивается планировщик процессора, определяются логические разделы диска и их файловая система.
Именно здесь задаются протоколы передачи данных TCP и UDP. Перезапуск или выключение ядра тоже можно отнести к функциональным возможностям.
Уровень взаимодействия
Этот уровень предназначен для того, чтобы устройства могли общаться между собой и дополнять друг друга. Например, на накопителе выделяется место под SWAP, что позволяет системе выгружать невостребованные данные из оперативной памяти.
Ещё один пример взаимодействия — это управление потоками. Без этого было бы невозможно использовать сотни потоков на процессоре с кратно меньшим количеством ядер. Если процесс ничем не занят, то его поток замораживается, высвобождая тем самым процессорное время для более важных задач.
Здесь же реализуется межпроцессное взаимодействие (IPC). С его помощью потоки одного процесса могут обмениваться данными.
Уровень виртуализации
Это один из самых важных уровней ядра. На нём потоки представляются программам как нечто абстрактное, как будто других программ не существует. Аналогичная ситуация с памятью, под определённую задачу выделяется только её часть, об остальной занятой памяти программа знать не должна.
На этом уровне создаются также виртуальные файловые системы. Это одна из ключевых задач ядра. Вместо того чтобы отображать пользователю файловую систему ext4 или любую другую, ядро приводит её к одному виду, который понятен не только программам, но и пользователю. Что интересно, файловой системой можно сделать даже оперативную память. Для этого на уровне взаимодействия создаётся RAM-диск. Во время загрузки операционной системы это решает вопрос доступа к загрузочным файлам до момента инициализации файловой системы накопителя.
Прикладной уровень
На прикладном уровне описана большая часть системных вызовов. Они нужны для того, чтобы программы могли общаться с ядром. Таким образом, можно запросить чтение или запись файла, создание нового потока и так далее. Иными словами, через вызовы происходит взаимодействие с ресурсами компьютера. Однако даже этого недостаточно для того, чтобы организовать полноценную работу операционной системы. На этом моменте мы плавно переходим к следующему пункту.
Что НЕ делает ядро Linux
Вы наверняка слышали о том, что операционные системы Linux называют GNU/Linux. Именно библиотеки и утилиты проекта GNU дополняют ядро, давая тем самым возможность более гибко и просто использовать его вызовы. Системных вызовов несколько сотен, но библиотека GNU C (glibc) значительно расширяет этот список всевозможными функциями. Аналогичную работу выполняет библиотека DRM (не относится к GNU), дающая доступ к ресурсам видеокарты. На примере ниже показана работа видеоигры.
Другие утилиты GNU не менее полезны. Например, командная оболочка Bash отвечает за выполнение консольных команд.
Исходя из вышесказанного, можно утверждать, что ядро Linux редко используется напрямую. Посредники в виде библиотек GNU предоставляют доступ к основным функциям ядра и расширяют их. Если сравнить операционную систему GNU/Linux с языком программирования, то ядро — это операторы, а GNU — набор стандартных функций.
Android тоже использует ядро Linux, но вместо библиотек GNU задействует собственные. Поэтому GNU/Linux и Android имеют несовместимые друг с другом программы.
Выводы
Теперь вы знаете что делает ядро Linux. Если кратко описать задачи ядра, то оно управляет ресурсами компьютера и предоставляет к ним доступ в виде абстракций вроде виртуальной памяти и потоков. Но не стоит переоценивать заслуги ядра, вместе с утилитами GNU вы получаете не просто планировщик потоков, а практически полноценную операционную систему.
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.
При подготовке материала использовались источники:
https://losst.pro/chto-takoe-yadro-linux
https://wiki.merionet.ru/articles/chto-takoe-yadro-operacionnoj-sistemy
https://losst.pro/chto-delaet-yadro-linux