Что такое ядро Linux


 

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

Но что делает ядро Linux? Как оно работает? Какие его основные задачи? Это очень обширная тема и мы попытаемся разобрать ее в этой статье.

Что делает ядро Linux?

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

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

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

Возьмем для примера чтение и запись данных в оперативную память. Каждая материнская плата может иметь разные контроллеры памяти, а ваш компьютер может работать на процессоре ARM, Intel, AMD, SPARC, PowerPC или MIPS. Но это не будет иметь значения для вашей программы Hello World, а так как ядро предоставляет унифицированный интерфейс для всех этих платформ.

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

Хранение данных:

  • RAM — Чтение и запись данных в оперативную память;
  • Постоянное хранение — Чтение и запись данных на постоянные запоминающие устройства;
  • Виртуальная файловая система;

Доступ к сетям:

  • Работа с физическими сетями (Ethernet, Wireless, LTE, коммутаторы, Bluetooth);
  • Виртуальные сети;

Планирование задач:

  • Совместное использование процессорного времени программами;
  • Балансировка нагрузки процессора и приоритеты;

Поддержка внешних устройств:

  • Съемные USB носители;
  • Веб-камеры;
  • Мыши и клавиатуры;

Безопасность:

  • Права доступа к файлам для пользователей и групп;
  • Разрешение доступа к ресурсам системы;

Благодаря вышеуказанным функциям ядра Linux разработка программ становится проще. Ядро реализует все это с помощью системных вызовов. Дальше мы рассмотрим более детально многие функции.

Хранение данных

Существует два способа хранения данных — это временный и постоянный. Временное хранение — это оперативная память. Не все данные, которые попадают в ОЗУ нужно постоянно хранить. Например, когда вы просматриваете интернет, вы же не хотите чтобы каждая веб-страница, видео или изображение были сохранена на вашем жестком диске. Иначе он очень быстро переполниться. Также для некоторых данных нужна максимальная скорость чтения и записи, ее и обеспечивает ОЗУ.

Ядро Linux обеспечивает прозрачный интерфейс для чтения и записи данных из оперативной памяти. Не имеет значения где запущенна операционная система, на старом процессоре i386 или новом Andorid ARM смартфоне. Код не нужно менять для обеспечения совместимости. Ядро содержит код для большинства аппаратных платформ, поэтому оно может обеспечить единый интерфейс для работы с ними.

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

Похоже, дела обстоят с постоянным хранением. Ядро скрывает от программ отличия между интерфейсами SATA, PATA, SCSI, USB, M2 и другими протоколами хранения. Одна программа может работать с любым носителем и любой поддерживаемой файловой системой без каких-либо изменений в программе. Это увеличивает повторное использование кода и производительность труда разработчиков.

Доступ к сети

Когда дело доходит до работы с сетью, то здесь все сложнее, поскольку существуют различные сетевые протоколы, и у каждого из них свои спецификации, формат адреса и т д. Таким образом, для поддержки протокола программу необходимо будет дорабатывать.

Но к счастью, на данный момент самые популярные протоколы, это IPv4 и IPv6. Что касается других сетевых протоколов, таких как DECnet, IPX, AppleTalk, то они поддерживаются ядром, но вряд ли есть смысл использовать их в современных программах.

Вернемся к IPv4 и IPv6. У обоих слишком разные форматы записи IP адреса, но это скорее хорошо, чем плохо. Тип протокола можно определить сразу по форме IP адреса. Ядро обеспечивает поддержку протоколов передачи данных: TCP, UDP, SCTP и ICMP. Все они могут быть очень легко использованы с помощью системных вызовов. Не имеет значения, подключен ли ваш компьютер к Ethernet или Wifi. Эта обеспечивает гибкость для конечных пользователей.

Планирование задач

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

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

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

Выводы

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

kernel.org