Ядро Linux содержит более 13 миллионов строк кода и является одним из самых крупных проектов с открытым исходным кодом в мире. Так что такое ядро Linux и для чего оно используется?
Что такое ядро Linux?
Ядро — это самый низкий уровень программного обеспечения, которое взаимодействует с аппаратными средствами компьютера. Оно отвечает за взаимодействие всех приложений, работающих в пространстве пользователя вплоть до физического оборудования. Также позволяет процессам, известным как сервисы получать информацию друг от друга с помощью системы IPC.
Виды и версии ядра
Что такое ядро Linux вы уже знаете, но какие вообще бывают виды ядер? Есть различные способы и архитектурные соображения при создании ядер с нуля. Большинство ядер могут быть одного из трех типов: монолитное ядро, микроядро, и гибрид. Ядро Linux представляет собой монолитное ядро, в то время как ядра Windows и OS X гибридные. Давайте сделаем обзор этих трех видов ядер.
Микроядро
Микроядра реализуют подход, в котором они управляют только тем, чем должны: процессором, памятью и IPC. Практически все остальное в компьютере рассматривается как аксессуары и обрабатывается в режиме пользователя. Микроядра имеют преимущество в переносимости, они могут использоваться на другом оборудовании, и даже другой операционной системе, до тех пор, пока ОС пытается получить доступ к аппаратному обеспечению совместимым образом.
Микроядра также имеют очень маленький размер и более безопасны, поскольку большинство процессов выполняются в режиме пользователя с минимальными привилегиями.
Плюсы
- Портативность
- Небольшой размер
- Низкое потребление памяти
- Безопасность
Минусы
- Аппаратные средства доступны через драйверы
- Аппаратные средства работают медленнее потому что драйверы работают в пользовательском режиме
- Процессы должны ждать свою очередь чтобы получить информацию
- Процессы не могут получить доступ к другим процессам не ожидая
Монолитное ядро
Монолитные ядра противоположны микроядрам, потому что они охватывают не только процессор, память и IPC, но и включают в себя такие вещи, как драйверы устройств, управление файловой системой, систему ввода-вывода. Монолитные ядра дают лучший доступ к оборудованию и реализуют лучшую многозадачность, потому что если программе нужно получить информацию из памяти или другого процесса, ей не придется ждать в очереди. Но это и может вызвать некоторые проблемы, потому что много вещей выполняются в режиме суперпользователя. И это может принести вред системе при неправильном поведении.
Плюсы:
- Более прямой доступ к аппаратным средствам
- Проще обмен данными между процессами
- Процессы реагируют быстрее
Минусы:
- Большой размер
- Занимает много оперативной памяти
- Менее безопасно
Гибридное ядро
Гибридные ядра могут выбирать с чем нужно работать в пользовательском режиме, а что в пространстве ядра. Часто драйвера устройств и файловых систем находятся в пользовательском пространстве, а IPC и системные вызовы в пространстве ядра. Это решение берет все лучшее из обоих предыдущих, но требует больше работы от производителей оборудования. Поскольку вся ответственность за драйвера теперь лежит на них.
Плюсы
- Возможность выбора того что будет работать в пространстве ядра и пользователя
- Меньше по размеру чем монолитное ядро
- Более гибкое
Минусы
- Может работать медленнее
- Драйверы устройств выпускаются производителями
Где хранятся файлы ядра?
Где находится ядро Linux? Файлы ядра Ubuntu или любого другого Linux-дистрибутива находятся в папке /boot и называются vmlinuz-версия. Название vmlinuz походит с эпохи Unix. В шестидесятых годах ядра привыкли называть просто Unix, в 90-х годах Linux ядра тоже назывались — Linux.
Когда для облегчения многозадачности была разработана виртуальная память, перед именем файла появились буквы vm, чтобы показать что ядро поддерживает эту технологию. Некоторое время ядро называлось vmlinux, но потом образ перестал помещаться в память начальной загрузки, и был сжат. После этого последняя буква x была изменена на z, чтобы показать что использовалось сжатие zlib. Не всегда используется именно это сжатие, иногда можно встретить LZMA или BZIP2, поэтому некоторые ядра называют просто zImage.
Нумерация версии состоит из трех цифр, номер версии ядра Linux, номер вашей версии и патчи или исправления.
В паке /boot можно найти не только ядро Linux, такие файлы, как initrd.img и system.map. Initrd используется в качестве небольшого виртуального диска, который извлекает и выполняет фактический файл ядра. Файл System.map используется для управления памятью, пока еще ядро не загрузилось, а конфигурационные файлы могут указывать какие модули ядра включены в образ ядра при сборке.
Архитектура ядра Linux
Так как ядро Linux имеет монолитную структуру, оно занимает больше и намного сложнее других типов ядер. Эта конструктивная особенность привлекла много споров в первые дни Linux и до сих пор несет некоторые конструктивные недостатки присущие монолитным ядрам.
Но чтобы обойти эти недостатки разработчики ядра Linux сделали одну вещь — модули ядра, которые могут быть загружены во время выполнения. Это значит что вы можете добавлять и удалять компоненты ядра на лету. Все может выйти за рамки добавления функциональных возможностей аппаратных средств, вы можете запускать процессы сервера, подключать виртуализацию, а также полностью заменить ядро без перезагрузки.
Представьте себе возможность установить пакет обновлений Windows без необходимости постоянных перезагрузок.
Модули ядра
Что, если бы Windows уже имела все нужные драйвера по умолчанию, а вы лишь могли включить те, которые вам нужны? Именно такой принцип реализуют модули ядра Linux. Модули ядра также известные как загружаемые модули (LKM), имеют важное значение для поддержки функционирования ядра со всеми аппаратными средствами, не расходуя всю оперативную память.
Модуль расширяет функциональные возможности базового ядра для устройств, файловых систем, системных вызовов. Загружаемые модули имеют расширение .ko и обычно хранятся в каталоге /lib/modules/. Благодаря модульной природе вы можете очень просто настроить ядро путем установки и загрузки модулей. Автоматическую загрузку или выгрузку модулей можно настроить в конфигурационных файлах или выгружать и загружать на лету, с помощью специальных команд.
Сторонние, проприетарные модули с закрытым исходным кодом доступны в некоторых дистрибутивах, таких как Ubuntu, но они не поставляются по умолчанию, и их нужно устанавливать вручную. Например, разработчики видеодрайвера NVIDIA не предоставляют исходный код, но вместо этого они собрали собственные модули в формате .ko. Хотя эти модули и кажутся свободными, они несвободны. Поэтому они и не включены во многие дистрибутивы по умолчанию. Разработчики считают что не нужно загрязнять ядро несвободным программным обеспечением.
Теперь вы ближе к ответу на вопрос что такое ядро Linux. Ядро не магия. Оно очень необходимо для работы любого компьютера. Ядро Linux отличается от OS X и Windows, поскольку оно включает в себя все драйверы и делает много вещей поддерживаемых из коробки. Теперь вы знаете немного больше о том, как работает ваше программное обеспечение и какие файлы для этого используются.
История и архитектурная организация

Поскольку цель данной статьи — познакомить вас с ядром Linux и дать обзор его архитектуры и основных компонентов, давайте начнем с краткого обзора истории ядра Linux, затем рассмотрим архитектуру ядра Linux "с высоты птичьего полета", и, наконец, обсудим его основные подсистемы. Ядро Linux насчитывает свыше шести миллионов строк, поэтому данное введение не может быть исчерпывающим. Для получения более подробной информации пользуйтесь ссылками на дополнительные ресурсы.
Краткий обзор истории Linux
Хотя Linux, по всей видимости, является самой популярной операционной системой с открытым исходным кодом, на самом деле ее история в сравнении с другими операционными системами относительно коротка. На заре компьютерной эры программисты разрабатывали свои программы для "голой" аппаратуры, используя языки, понятные для этой аппаратуры. В отсутствие операционной системы использовать всю большую и дорогую вычислительную машину в каждый конкретный момент времени могло только одно приложение (и один пользователь). Первые операционные системы были разработаны в 1950-е годы, чтобы облегчить жизнь разработчиков. В качестве примера можно назвать General Motors Operating System (GMOS), разработанную для IBM 701, и FORTRAN Monitor System (FMS), созданную North American Aviation для IBM 709.
В 1960-е годы в Массачусетском Технологическом институте (MIT) и в ряде компаний была разработана экспериментальная операционная система Multics (Multiplexed Information and Computing Service) для машины GE-645. Один из разработчиков этой ОС, компания AT&T, отошла от Multics и в 1970 году разработала свою собственную систему Unics. Вместе с этой ОС поставлялся язык C. При этом C был разработан и написан так, чтобы обеспечить переносимость разработки операционной системы.
Двадцать лет спустя Эндрю Танненбаум (Andrew Tanenbaum) создал микроядерную версию UNIX® под названием MINIX (minimal UNIX), которая могла работать на небольших персональных компьютерах. Эта операционная система с открытым исходным кодом вдохновила Линуса Торвальдса (Linus Torvalds) на разработку первой версии Linux в начале 1990-х (см. Рис. 1).
Рис. 1. Краткая история основных выпусков ядра Linux


Linux быстро превратился из инициативы энтузиаста-одиночки во всемирный проект, в котором участвуют тысячи разработчиков. Одним из важнейших решений в судьбе Linux стало принятие лицензии GNU General Public License (GPL). GPL защитила ядро Linux от коммерческой эксплуатации и одновременно открыла путь к использованию разработок сообщества пользователей проекта GNU, основанного Ричардом Столлменом (Richard Stallman), объемы кода которого значительно превосходят даже объем ядра Linux. Это позволило использовать в Linux такие полезные приложения, как комплекс компиляторов GNU Compiler Collection (GCC) и различные командные оболочки.
Введение в ядро Linux
Перейдем к общему обзору архитектуры операционной системы GNU/Linux. Операционную систему можно условно разделить на два уровня, как показано на Рис. 2.
Рис. 2. Фундаментальная архитектура операционной системы GNU/Linux


На верхнем уровне находится пользовательское пространство (пространство приложений). Здесь исполняются приложения пользователя. Под пользовательским пространством располагается пространство ядра. Здесь функционирует ядро Linux.
Имеется также библиотека GNU C (glibc). Она предоставляет интерфейс системных вызовов, который обеспечивает связь с ядром и дает механизм для перехода от приложения, работающего в пространстве пользователя, к ядру. Это важно, поскольку ядро и пользовательское приложение располагаются в разных защищенных адресных пространствах. При этом, в то время как каждый процесс в пространстве пользователя имеет свое собственное виртуальное адресное пространство, ядро занимает одно общее адресное пространство. Более подробную информацию можно найти в литературе, ссылки на которую приведены в разделе "Ресурсы".
Ядро Linux можно, в свою очередь, разделить на три больших уровня. Наверху располагается интерфейс системных вызовов, который реализует базовые функции, например, чтение и запись . Ниже интерфейса системных вызовов располагается код ядра, точнее говоря, архитектурно-независимый код ядра. Этот код является общим для всех процессорных архитектур, поддерживаемых Linux. Еще ниже располагается архитектурно-зависимый код, образующий т.н. BSP (Board Support Package — пакет поддержки аппаратной платформы). Этот код зависит от процессора и платформы для конкретной архитектуры.
Свойства ядра Linux
Обсуждая архитектуру большой и сложной системы, можно рассматривать ее со многих разных точек зрения. Одна из целей архитектурного анализа может состоять в том, чтобы лучше понять исходный код системы. Именно этим мы здесь и займемся.
В ядре Linux реализован целый ряд важных архитектурных элементов. И на самом общем, и на более детальных уровнях ядро можно подразделить на множество различных подсистем. С другой стороны, Linux можно рассматривать как монолитное целое, поскольку все базовые сервисы собраны в ядре системы. Такой подход отличается от архитектуры с микроядром, когда ядро предоставляет только самые общие сервисы, такие как обмен информацией. ввод/вывод, управление памятью и процессами, а более конкретные сервисы реализуются в модулях, подключаемых к уровню микроядра. Каждая из этих точек зрения имеет свои достоинства, но я здесь не буду вдаваться в это обсуждение.
С течением времени ядро Linux стало более эффективным с точки зрения использования памяти и процессорных ресурсов и приобрело исключительную стабильность. Однако самый интересный аспект Linux, учитывая размер и сложность этой системы — это ее переносимость. Linux можно откомпилировать для огромного количества разных процессоров и платформ, имеющих разные архитектурные ограничения и потребности. Например, Linux может работать на процессоре как с блоком управления памятью (MMU), так и без MMU. Поддержка процессоров без MMU реализована в версии ядра uClinux. Более подробную информацию см. в разделе "Ресурсы".
Основные подсистемы ядра Linux
Давайте рассмотрим некоторые основные компоненты ядра Linux, следуя структуре, изображенной на рис. 3.
Рис. 3. Один из возможных взглядов на архитектуру ядра Linux


Интерфейс системных вызовов
SCI — это тонкий уровень, предоставляющий средства для вызова функций ядра из пространства пользователя. Как уже говорилось, этот интерфейс может быть архитектурно зависимым, даже в пределах одного процессорного семейства. SCI фактически представляет собой службу мультиплексирования и демультиплексирования вызова функций. Реализация SCI находится в ./linux/kernel, а архитектурно-зависимая часть — в ./linux/arch. Более подробные сведения об этом компоненте можно найти в разделе Ресурсы.
Управление процессами
Управление процессами сконцентрировано на исполнении процессов. В ядре эти процессы называются потоками (threads); они соответствуют отдельным виртуализованным объектам процессора (код потока, данные, стек, процессорные регистры). В пространстве пользователя обычно используется термин процесс, хотя в реализации Linux эти две концепции (процессы и потоки) не различают. Ядро предоставляет интерфейс программирования приложений (API) через SCI для создания нового процесса (порождения копии, запуска на исполнение, вызова функций Portable Operating System Interface [POSIX]), остановки процесса (kill, exit), взаимодействия и синхронизации между процессами (сигналы или механизмы POSIX).
Еще одна задача управления процессами — совместное использование процессора активными потоками. В ядре реализован новаторский алгоритм планировщика, время работы которого не зависит от числа потоков, претендующих на ресурсы процессора. Название этого планировщика — O(1) — подчеркивает, что на диспетчеризацию одного потока затрачивается столько же времени, как и на множество потоков. Планировщик O(1) также поддерживает симметричные многопроцессорные конфигурации (SMP). Исходные коды системы управления процессами находятся в ./linux/kernel, а коды архитектурно-зависимой части — в ./linux/arch). Более подробную информацию об этом алгоритме см. в разделе Ресурсы.
Управление памятью
Другой важный ресурс, которым управляет ядро — это память. Для повышения эффективности, учитывая механизм работы аппаратных средств с виртуальной памятью, память организуется в виде т.н. страниц (в большинстве архитектур размером 4 КБ). В Linux имеются средства для управления имеющейся памятью, а также аппаратными механизмами для установления соответствия между физической и виртуальной памятью.
Однако управление памятью — это значительно больше, чем просто управление буферами по 4 КБ. Linux предоставляет абстракции над этими 4 КБ буферами, например, механизм распределения slab allocator. Этот механизм управления базируется на 4 КБ буферах, но затем размещает структуры внутри них, следя за тем, какие страницы полны, какие частично заполнены и какие пусты. Это позволяет динамически расширять и сокращать схему в зависимости от потребностей вышележащей системы.
В условиях наличия большого числа пользователей памяти возможны ситуации, когда вся имеющаяся память будет исчерпана. В связи с этим страницы можно удалять из памяти и переносить на диск. Этот процесс обмена страниц между оперативной памятью и жестким диском называется подкачкой. Исходные коды управления памятью находятся в ./linux/mm.
Виртуальная файловая система
Еще один интересный аспект ядра Linux — виртуальная файловая система (VFS), которая предоставляет общую абстракцию интерфейса к файловым системам. VFS предоставляет уровень коммутации между SCI и файловыми системами, поддерживаемыми ядром (см. Рис. 4).
Рис. 4. VFS предоставляет коммутационную матрицу между пользователями и файловыми системами


На верхнем уровне VFS располагается единая API-абстракция таких функций, как открытие, закрытие, чтение и запись файлов. На нижнем уровне VFS находятся абстракции файловых систем, которые определяют, как реализуются функции верхнего уровня. Они представляют собой подключаемые модули для конкретных файловых систем (которых существует более 50). Исходные коды файловых систем находятся в ./linux/fs.
Ниже уровня файловой системы находится кэш буферов, предоставляющий общий набор функций к уровню файловой системы (независимый от конкретной файловой системы). Этот уровень кэширования оптимизирует доступ к физическим устройствам за счет краткосрочного хранения данных (или упреждающего чтения, обеспечивающего готовность данных к тому моменту, когда они понадобятся). Ниже кэша буферов находятся драйверы устройств, реализующие интерфейсы для конкретных физических устройств.
Сетевой стек
Сетевой стек по своей конструкции имеет многоуровневую архитектуру, повторяющую структуру самих протоколов. Вы помните, что протокол Internet Protocol (IP) — это базовый протокол сетевого уровня, располагающийся ниже транспортного протокола Transmission Control Protocol, TCP). Выше TCP находится уровень сокетов, вызываемый через SCI.
Уровень сокетов представляет собой стандартный API к сетевой подсистеме. Он предоставляет пользовательский интерфейс к различным сетевым протоколам. Уровень сокетов реализует стандартизованный способ управления соединениями и передачи данных между конечными точками, от доступа к "чистым" кадрам данных и блокам данных протокола IP (PDU) и до протоколов TCP и User Datagram Protocol (UDP). Исходные коды сетевой подсистемы ядра находятся в каталоге ./linux/net.
Драйверы устройств
Подавляющее большинство исходного кода ядра Linux приходится на драйверы устройств, обеспечивающие возможность работы с конкретными аппаратными устройствами. В дереве исходных кодов Linux имеется подкаталог драйверов, в котором, в свою очередь, имеются подкаталоги для различных типов поддерживаемых устройств, таких как Bluetooth, I2C, последовательные порты и т.д. Исходные коды драйверов устройств находятся в ./linux/drivers.
Архитектурно-зависимый код
Хотя основная часть Linux независима от архитектуры, на которой работает операционная система, в некоторых элементах для обеспечения нормальной работы и повышения эффективности необходимо учитывать архитектуру. В подкаталоге ./linux/arch находится архитектурно-зависимая часть исходного кода ядра, разделенная на ряд подкаталогов, соответствующих конкретным архитектурам. Все эти каталоги в совокупности образуют BSP. В случае обычного настольного ПК используется каталог i386. Подкаталог для каждой архитектуры содержит ряд вложенных подкаталогов, относящихся к конкретным аспектам ядра, таким как загрузка, ядро, управление памятью и т.д. Исходные коды архитектурно-зависимой части находятся в ./linux/arch.
Интересные особенности ядра Linux
Помимо переносимости и эффективности, ядро Linux обладает целым рядом других интересных функций, которые не были освещены в вышеприведенном рассмотрении.
Linux, как широко используемая на практике операционная система с открытым исходным кодом, является отличной испытательной площадкой для новых протоколов и их усовершенствований. Linux поддерживает большое количество сетевых протоколов, включая традиционный TCP/IP и его высокоскоростные расширения (для сетей быстрее Gigabit Ethernet [GbE] и 10 GbE). Linux также поддерживает такие протоколы, как Stream Control Transmission Protocol (SCTP), реализующий множество дополнительных функций, отсутствующих в TCP (применяется в качестве альтернативного протокола транспортного уровня).
Следует отметить, что ядро Linux является динамическим (поддерживает добавление и удаление программных компонентов без остановки системы). Эти компоненты называются динамически загружаемыми модулями ядра. Их можно вводить в систему при необходимости, как во время загрузки (если найдено конкретное устройство, для которого требуется такой модуль), так и в любое время по желанию пользователя.
Еще одно недавнее усовершенствование Linux — возможность ее использования в качестве операционной системы для других операционных систем (т.н. гипервизора). Недавно в ядро было внесено усовершенствование, получившее название Kernel-based Virtual Machine (KVM, виртуальная машина на базе ядра). В результате этой модификации в пространстве пользователя был реализован новый интерфейс, позволяющий исполнять поверх ядра с поддержкой KVM другие операционные системы. В таком режиме можно не только исполнять другие экземпляры Linux, но и виртуализовать Microsoft® Windows®. Единственное ограничение состоит в том, что используемый процессор должен поддерживать новые инструкции виртуализации. Более подробную информацию см. в разделе Ресурсы.
Дальнейшее изучение
В этой статье мы лишь в самых общих чертах рассказали об архитектуре ядра Linux и его особенностях и возможностях. Подробную информацию о содержимом ядра можно найти в каталоге с документацией, который имеется в любом дистрибутиве Linux. Обязательно ознакомьтесь с разделом Ресурсы в конце данной статьи, где имеются ссылки на более подробную информацию по многим обсуждаемым здесь темам.
Ресурсы для скачивания
Похожие темы
- Оригинал статьи Anatomy of the Linux kernel: History and architectural decomposition.
- На сайте GNU описана лицензия GNU GPL, которая распространяется на ядро Linux и большинство поставляемых с ним полезных приложений. Также описана менее ограничительная форма GPL, т.н. Lesser GPL (LGPL).
- Описания UNIX, MINIX и Linux можно найти в энциклопедии Wikipedia. Там же имеется подробное генеалогическое древо операционных систем.
- Библиотека GNU C, она же glibc, представляет собой реализацию стандартной библиотеки C. Она используется в операционной системе GNU/Linux, а также в микроядерной операционной системе GNU/Hurd.
- uClinux это портированная версия ядра Linux, способная работать на системах, не имеющих блока управления памятью (MMU). Это дает возможность исполнять ядро Linux на очень компактных встраиваемых платформах, например, на процессоре Motorola DragonBall, применяемом в карманных компьютерах PalmPilot.
- "Управление ядром с помощью системных вызовов Linux" Статья посвящена важному уровню ядра Linux — интерфейсу системных вызовов, поддержку которого на уровне пространства пользователя обеспечивает библиотека glibc, позволяющая осуществлять вызовы функций между пространством пользователя и ядром.
- "Внутреннее устройство планировщика Linux" Новый планировщик O(1), появившийся в версии Linux 2.6, обладает высокой эффективностью, хорошо масштабируется для большого числа процессов (потоков) и поддерживает SMP-системы.
- "Доступ к ядру Linux с помощью файловой системы /proc" В статье рассматривается файловая система /proc — виртуальная файловая система, предоставляющая приложениям в пространстве пользователя принципиально новый способ взаимодействия с ядром. Помимо /proc, в статье рассматриваются загружаемые модули ядра.
- "Клиника серверов: практическое использование виртуальных файловых систем" В статье рассматривается уровень VFS, который позволяет Linux поддерживать множество разных файловых систем через общий интерфейс. Этот же интерфейс используется и для других типов устройств, например, сокетов.
- "Устройство процесса загрузки Linux" В статье рассматривается процесс загрузки Linux, который следует одной и той же базовой схеме независимо от того, загружаетесь ли вы с жесткого диска, дискеты, USB-накопителя или через сеть.
- "Виртуальный стартовый диск в Linux (initrd) — обзор" В статье рассматривается виртуальный стартовый диск — функция, которая позволяет отделить процесс загрузки от физического носителя, с которого происходит загрузка.
- "Улучшение работы сетей с помощью SCTP" Статья посвящена одному из самых интересных сетевых протоколов — Stream Control Transmission Protocol — который работает аналогично TCP, но имеет при этом ряд дополнительных полезных функций, например, обмен сообщениями, поддержка нескольких IP-адресов узла (multi-homing), передача фрагментов разных потоков данных (multi-streaming). Linux, как и BSD — отличная операционная система, если вас интересует поддержка сетевых протоколов.
- "Анатомия механизма slab allocator в Linux" Статья посвящена одному из самых интересных аспектов управления памятью в Linux — механизма slab allocator. Этот механизм впервые появился в SunOS, но прекрасно прижился и в ядре Linux.
- "Виртуальный Linux" Статья рассказывает о том, как Linux может использовать возможности процессоров, поддерживающих виртуализацию.
- "Linux и симметричные многопроцессорные системы" В статье рассматривается вопрос о том, как Linux может использовать возможности процессоров с поддержкой многопроцессорных конфигураций на уровне кристалла.
- "Знакомство с виртуальной машиной ядра Linux" В статье рассматриваются недавно появившиеся в ядре Linux средства виртуализации, превращающие ядро Linux в гипервизор для других виртуализованных операционных систем.
- Ознакомьтесь с книгой Тима Джонса: Программирование приложений для GNU/Linux, подробно рассказывающей о программировании для Linux в пространстве пользователя.
- В разделе Linux сайта developerWorks Россия можно найти другие ресурсы для Linux-разработчиков.
- Используйте ознакомительные версии ПО IBM, которые можно загрузить непосредственно с developerWorks, в вашем следующем проекте разработки для Linux.
Комментарии
Войдите или зарегистрируйтесь для того чтобы оставлять комментарии или подписаться на них.
| Ядро Linux | |
|---|---|
| Тип | свободное и открытое программное обеспечение и ядро операционной системы |
| Автор | Линус Торвальдс[1] |
| Разработчик | Линус Торвальдс , Кокс, Алан , Грег Кроа-Хартман , Ingo Molnár[d] и Andrew Morton[d] |
| Написана на | Си[3] , ассемблер и C++ |
| Первый выпуск | 25 августа1991 |
| Аппаратная платформа | ARM , AVR , Blackfin[d] , DEC Alpha , ETRAX CRIS[d] , Itanium , MIPS , PA-RISC , PowerPC , SPARC , SuperH , TILE64[d] , Unicore[d] , Xtensa[d] , Motorola 680×0 , IBM System/390 , x86 , x86-64 и z/Architecture [d] |
| Последняя версия |
|
| Лицензия | GNU GPL 2[4][5][6] |
| Сайт | kernel.org (англ.) |
| Медиафайлы на Викискладе | |
![]()
Ядро Linux ( /ˈlɪnʊks/ [7] ) — ядро операционной системы, соответствующее стандартам POSIX, составляющее основу операционных систем семейства Linux. Разработка кода ядра была начата финским студентом Линусом Торвальдсом в 1991 году, на его имя зарегистрирована торговая марка «Linux».
Код написан в основном на Си с некоторыми расширениями gcc и на ассемблере (с использованием AT&T-синтаксиса GNU Assembler).
Распространяется как свободное программное обеспечение на условиях GNU General Public License, кроме несвободных элементов, особенно драйверов, которые используют прошивки, распространяемые под различными лицензиями [8] .
Операционные системы на базе ядра Linux являются лидерами на рынках суперкомпьютеров, микрокомпьютеров, серверов и смартфонов.
Содержание
История [ править | править код ]
Начало проекту было положено в 1991 году с публикации сообщения в новостной группе Usenet [9] .
К тому времени GNU уже создал множество составляющих для свободной операционной системы, но её ядро GNU Hurd ещё не было готово. Поэтому пустующее место ядра для свободной операционной системы занял Linux и, несмотря на ограниченную функциональность ранних версий, привлёк к себе множество разработчиков и пользователей.
«Linux» как ядро операционной системы, разработка которого была начата Торвальдсом — лишь небольшая часть многих из использующих его систем, которые обычно тоже называют «Linux». Это иногда приводит к путанице, и те из них, которые используют системные библиотеки (например, GNU C Library) и другие программы проекта GNU, формально называют также «GNU/Linux» [10] .
По состоянию на сентябрь 2016 года семейство операционных систем на базе ядра Linux — третье по популярности в мире на рынке настольных компьютеров — 5,8 % [11] . На рынке веб-серверов доля Linux порядка 32 %, остальное — Unix-системы (FreeBSD и др.) [12] . По данным Top500 (июнь 2016 года), Linux используется в качестве операционной системы на 99,4 % самых мощных суперкомпьютеров планеты [13] .
Большинство мобильных устройств, таких, как смартфоны и планшетные компьютеры на базе операционных систем Android, MeeGo, Tizen, а также телевизоры и многие служебные устройства, такие, как внешние сетевые жёсткие диски, маршрутизаторы и модемы, также использует операционные системы на базе ядра Linux.
Хронология [ править | править код ]
- Апрель 1991: 21-летний Линус Торвальдс начал работу над некоторыми механизмами операционной системы. Он начал с эмулятора терминала и планировщика задач.
- 25 августа 1991: Торвальдс поместил сообщение в новостную группу по Minix[9][14] .
- 17 сентября 1991: Linux версии 0.01 (10 239 строк кода).
- 5 октября 1991: Linux версии 0.02 [1] (англ.) .
- Декабрь 1991: Linux версии 0.11. Это была первая версия Linux, на которой можно было собрать Linux из исходных кодов.
- 19 января 1992: Первое сообщение в группе новостей alt.os.linux (англ.) .
- 31 марта 1992: Создана группа новостей comp.os.linux (англ.) .
- Апрель 1992: Linux версии 0.96, на котором стало возможно запустить графический сервер X Window System.
- Весь 1993 и начало 1994: 15 тестовых выпусков версии 0.99.* (в июле 1993 введено понятие BogoMips).
- 14 марта 1994: Linux версии 1.0.0 (176 250 строк кода).
- Март 1995: Linux версии 1.2.0 (310 950 строк кода).
- 9 мая 1996: Выбран символ Linux — пингвин Tux.
- 9 июня 1996: Linux версии 2.0.0 (777 956 строк кода).
- 25 января 1999: Linux версии 2.2.0, изначально довольно недоработанный (1 800 847 строк кода).
- 4 января 2001: Linux версии 2.4.0 (3 377 902 строки кода).
- 18 декабря 2003: Linux версии 2.6.0 (5 929 913 строк кода).
- 23 марта 2009: Linux версии 2.6.29, временный символ Linux — тасманский дьявол Tuz (11 010 647 строк кода).
- 22 июля 2011: релиз Linux 3.0 (14,6 млн строк кода).
- 24 октября 2011: релиз Linux 3.1.
- 15 января 2012: релиз Linux 3.3 преодолел отметку в 15 млн строк кода.
- 23 февраля 2015: первый релиз-кандидат Linux 4.0 (более 19 млн строк кода).
- 7 января 2019: первый релиз-кандидат Linux 5.0 (более 26 млн строк кода).

Версии [ править | править код ]
Торвальдс продолжает выпускать новые версии ядра, объединяя изменения, вносимые другими программистами, и внося свои. Оно обычно называется «ванильным» (vanilla), то есть официальное ядро без каких-либо сторонних изменений. В дополнение к официальным версиям ядра существуют альтернативные ветки, которые могут быть взяты из различных источников. Как правило, разработчики дистрибутивов Linux поддерживают свои собственные версии ядра, например, включая в них драйверы устройств, которые ещё не включены в официальную версию. С 30 мая 2011 изменена политика нумерации версий ядра [15] .
Нумерация версий до 30 мая 2011 [ править | править код ]
Номер версии ядра Linux до 30 мая 2011 содержал четыре числа, согласно недавнему изменению в политике именования версий, схема которой долгое время была основана на трёх числах. Для иллюстрации допустим, что номер версии составлен таким образом: A.B.C[.D] (например, 2.2.1, 2.4.13 или 2.6.12.3).
- Число A обозначает версию ядра. Изначально задумывалось, что оно будет изменяться редко и только тогда, когда вносятся значительные изменения в код и концепцию ядра, первые такие изменения произошли в 1994 году (версия 1.0) и в 1996 году (версия 2.0). Впоследствии правило значительности изменений было нарушено, и дважды очередные версии ядра выходили с обновлённой первой цифрой — 31 мая 2011 года (3.0.0) и 21 апреля 2015 (4.0.0).
- Число B обозначает старшую версию ревизии ядра. В ядрах до версии 3.0 Чётные числа обозначали стабильные ревизии, то есть те, которые предназначены для продуктивного использования, такие, как 1.2, 2.4 или 2.6, а нечётные — ревизии для разработчиков, предназначенные для того, чтобы тестировать новые улучшения и драйвера до тех пор, пока они не станут достаточно стабильными для того, чтобы включить их в стабильный выпуск.
- Число C обозначает младшую версию ревизии ядра. В старой трёхчисловой схеме нумерации оно изменялось тогда, когда в ядро включались заплатки, связанные с безопасностью, исправления ошибок, новые улучшения или драйверы. С новой политикой нумерации, однако, оно изменяется только тогда, когда вносятся новые драйверы или улучшения; небольшие исправления поддерживаются числом D.
- Число D впервые появилось после случая, когда в коде ядра версии 2.6.8 была обнаружена грубая, требующая незамедлительного исправления ошибка, связанная с NFS. Однако других изменений было недостаточно для того, чтобы это послужило причиной для выпуска новой младшей ревизии (которой должна была стать 2.6.9). Поэтому была выпущена версия 2.6.8.1 с единственным изменением в виде исправления этой ошибки. С ядра 2.6.11 эта нумерация была адаптирована в качестве новой официальной политики версий. Исправления ошибок и заплатки безопасности теперь обозначаются с помощью четвёртого числа, тогда как большие изменения отражаются в увеличении младшей версии ревизии ядра (число C).
Нумерация версий с 30 мая 2011 [ править | править код ]
30 мая 2011 Линус Торвальдс выпустил ядро версии 3.0-rc1. Вместе с ним изменена политика нумерации версий ядра. Отменено использование чётных и нечётных номеров для обозначения стабильности ядра, а третье число означает стабильность ядра. Версия 3.0 практически не несёт никаких изменений, кроме изменения политики нумерации ядра. Таким образом, стабильные версии ядра 3.0 будут именоваться 3.0.X, а следующий после этого релиз будет иметь номер 3.1.
Поддержка [ править | править код ]
В то время как Торвальдс продолжает выпускать новые экспериментальные версии, руководство LTS-версиями передаётся другим лицам:
| Серия | Версии | Руководители | Окончание поддержки |
|---|---|---|---|
| 3.2 | 3.2.101 | Бэн Хатчингс | Май 2018 |
| 3.4 | 3.4.113 | Ли Зифан | Октябрь 2016 |
| 3.10 | 3.10.108 | Уилли Тароу | Ноябрь 2017 |
| 3.12 | 3.12.74 | Иржи Слаби | Май 2017 |
| 3.14 | 3.14.79 | Грег Кроа-Хартман | Сентябрь 2016 |
| 3.16 | 3.16.73 | Бэн Хатчингс | Апрель 2020 |
| 3.18 | 3.18.136 | Саша Левин | Январь 2017 |
| 4.1 | 4.1.51 | Саша Левин | Май 2018 |
| 4.4 | 4.4.190 | Грег Кроа-Хартман | Февраль 2022 |
| 4.9 | 4.9.190 | Грег Кроа-Хартман | Январь 2023 |
| 4.14 | 4.14.141 | Грег Кроа-Хартман | Январь 2020 |
| 4.19 | 4.19.69 | Грег Кроа-Хартман | Декабрь 2020 |
Другими программистами ядра Linux являются Роберт Лав [en] и Инго Молнар [en] [16] .






