Ця стаття про ядро операційної системи. Для отримання інформації про операційні системи, які використовують це ядро, і які також часто називають «Linux», читайте статтю Linux.
Ядро Linux — ядро Unix-подібної операційної системи. Розповсюджується під ліцензією GNU General Public License (GPL), і розробляється людьми з усього світу, що дозволило йому стати одним із найвидатніших прикладів відкритого програмного забезпечення та увійти до числа наймасштабніших проєктів з розробки програмного забезпечення: версія 4.5 мала 21 млн рядків коду, а за 2015 рік до роботи над ним долучилось близько чотирьох тисяч розробників та понад 440 різних організацій .
Роботу над Лінукс розпочав Лінус Торвальдс у 1991 році. Тим часом, проєкт GNU розробив багато компонентів, необхідних для повноцінної вільної операційної системи, але його власне ядро, GNU Hurd було неповним і незакінченим. Програми проєкту GNU та велика кількість людей, що долучилися до розвитку ядра, сприяли його популяризації та створенню повноцінних операційних систем на базі цього ядра, котрі називають дистрибутивами Linux.
Архітектура Ядро Linux підтримує багатозадачність, віртуальну пам'ять, динамічні бібліотеки, відкладене завантаження, продуктивну систему керування пам'яттю і багато мережних протоколів.
Linux — монолітне ядро з підтримкою завантажуваних модулів. Драйвери пристроїв і розширення ядра зазвичай запускаються на «кільці 0», з повним доступом до устаткування. На відміну від звичайних монолітних ядер, у ядрі Лінукс драйвери пристроїв легко збираються у вигляді модулів і завантажуються або вивантажуються під час роботи системи.
Те, що архітектура Linux не є мікроядерною, викликало дебати між Лінусом Торвальдсом і Ендрю Таненбаумом на конференції comp.os.minix
Структура Операційну систему можна умовно розділити на два рівні.
На верхньому рівні розташований користувацький простір (простір виконування прикладних програм). Тут виконуються застосунки користувача. Під призначеним для користувача простором розташовується простір ядра. Тут функціонує ядро Linux.
Є також бібліотека GNU C (glibc). Вона надає інтерфейс системних викликів, який забезпечує зв'язок з ядром і дає механізм для переходу від програми, що працює в просторі користувача, до ядра. Це важливо, оскільки ядро і програма користувача розташовуються в різних захищених адресних просторах. При цьому, тоді як кожен процес в просторі користувача має свій власний віртуальний адресний простір, ядро займає один загальний адресний простір.
Ядро Linux можна, своєю чергою, розділити на три великі рівні. Вгорі розташовується інтерфейс системних викликів, який реалізує базові функції, наприклад, читання і запис. Нижче за інтерфейс системних викликів розташовується код ядра, точніше кажучи, незалежний код ядра. Цей код є загальним для всіх процесорних архітектур, підтримуваних Linux. Ще нижче розташовується архітектурно-залежний код, що утворює так званий BSP (Board Support Package — пакет підтримки апаратної платформи). Цей код залежить від процесора і платформи для конкретної архітектури.
Ядро по суті є диспетчером ресурсів. Незалежно від того, що є керованим ресурсом — процес, пам'ять чи апаратний пристрій, — ядро організовує й упорядковує доступ до ресурсу безлічі конкуруючих користувачів (як у просторі ядра, так і в просторі користувача).
Властивості ядра Linux У ядрі Linux реалізована ціла низка важливих архітектурних елементів. І на найзагальнішому, і на детальніших рівнях ядро можна підрозділити на безліч різних підсистем. З іншого боку, Linux можна розглядати як монолітне ціле, оскільки всі базові сервіси зібрані в ядрі системи. Такий підхід відрізняється від архітектури з мікроядром, коли ядро надає тільки найзагальніші сервіси, такі як обмін інформацією, ввід/вивід, управління пам'яттю і процесами, а конкретніші сервіси реалізуються в модулях, що підключаються до рівня мікроядра.
З часом ядро Linux стало ефективнішим з погляду використання пам'яті і процесорних ресурсів і набуло виняткової стабільності. Важливий аспект Linux, враховуючи розмір і складність цієї системи — це її переносимість. Linux можна відкомпілювати для величезної кількості різних процесорів і платформ, що мають різні архітектурні обмеження і потреби. Наприклад, Linux може працювати на процесорі як з блоком керування пам'яттю (MMU), так і без нього. Підтримка процесорів без MMU реалізована у версії ядра uClinux.
Інтерфейс системних викликів Інтерфейс системних викликів (SCI) — це тонкий рівень, що надає засоби для виклику функцій ядра з простору користувача. Цей інтерфейс може бути архітектурно залежним, навіть в межах одного процесорного сімейства. SCI фактично є службою мультиплексування і демультиплексування виклику функцій. Реалізація SCI міститься в у підкаталозі kernel, а архітектурно-залежна частина — у підкаталозі arch.
Механізм обробки системних викликів (перехід від простору користувача до простору ядра) відрізняється для різних процесорних архітектур, і може навіть бути різним у межах однієї архітектури (наприклад, механізми шлюзів виклику, int 80h, SYSENTER і SYSCALL для x86).
Керування процесами Керування процесами сконцентроване на виконанні процесів. У ядрі ці процеси називаються нитками (); вони відповідають окремим віртуалізованим об'єктам процесора (код ниті, дані, стек, процесорні регістри). У просторі користувача зазвичай використовується термін процес, хоча в реалізації Linux ці дві концепції (процеси і ниті) не розрізняють. Ядро надає прикладний програмний інтерфейс (API) через SCI для створення нового процесу (породження копії, запуску на виконання, виклику функцій Portable Operating System Interface POSIX), зупинки процесу (kill, exit), взаємодії і синхронізації між процесами (сигнали або механізми POSIX).
Ще одне завдання керування процесами — сумісне використання процесора активними нитями. У ядрі реалізований новаторський алгоритм планувальника, час роботи якого не залежить від числа нитей, що претендують на ресурси процесора. Назва цього планувальника — O(1) — підкреслює, що на диспетчеризацію одної ниті витрачається стільки ж часу, як і на множину нитей. Планувальник O(1) також підтримує симетричні багатопроцесорні конфігурації (SMP).
Керування пам'яттю Інший важливий ресурс, яким керує ядро, — це оперативна пам'ять. Для підвищення ефективності, враховуючи механізм роботи апаратних засобів з віртуальною пам'яттю, пам'ять організовується у вигляді так званих сторінок фіксованого розміру. У Linux є засоби для керування наявною пам'яттю, а також апаратними механізмами для встановлення відповідності між фізичною і віртуальною пам'яттю.
На базі сторінкової пам'яті у ядрі Linux збудовано різні механізми виділення і звільнення блоків пам'яті, такі як , і . Після виділення сторінок ядро розміщує структури усередині них, стежачи за тим, які сторінки повні, які частково заповнені і які порожні. Це дозволяє динамічно розширювати і скорочувати схему залежно від потреб розміщеної системи.
В умовах наявності великого числа користувачів у пам'яті можливі ситуації, коли вся наявна пам'ять буде вичерпана. Через це сторінки можна видаляти з пам'яті і переносити на диск. Цей процес обміну сторінок між оперативною пам'яттю і твердим диском називається підкачуванням, або свопінгом.
Віртуальна файлова система Ще один важливий аспект ядра Linux — віртуальна файлова система (VFS), яка надає загальну абстракцію інтерфейсу до файлових систем. VFS надає рівень комутації між SCI і файловими системами, підтримуваними ядром. На верхньому рівні VFS розташовується єдина API-абстракція таких функцій, як відкриття, закриття, читання і запис файлів. На нижньому рівні VFS розташовані абстракції файлових систем, які визначають, як реалізуються функції верхнього рівня. Вони є модулями, що підключаються, для конкретних файлових систем (яких існує більше 50).
Нижче за рівень файлової системи міститься кеш буферів, що надає загальний набір функцій до рівня файлової системи (незалежний від конкретної файлової системи). Цей рівень кешування оптимізує доступ до фізичних пристроїв за рахунок короткострокового зберігання даних (або попереджувального читання, що забезпечує готовність даних до того моменту, коли вони знадобляться). Нижче за кеш буферів містяться драйвери пристроїв, що реалізовують інтерфейси для конкретних фізичних пристроїв.
Мережевий стек Мережевий стек за своєю конструкцією має багаторівневу архітектуру, що повторює структуру самих протоколів. Протокол Internet Protocol (IP) — це базовий протокол мережевого рівня, розташований нижче за транспортний протокол (Transmission Control Protocol, TCP). Вище TCP розташований рівень сокетів, що викликається через SCI.
Рівень сокетів є стандартним API до мережевої підсистеми. Він надає користувацький інтерфейс до різних мережевих протоколів. Рівень сокетів реалізує стандартизований спосіб управління з'єднаннями і передачі даних між кінцевими точками, від доступу до «чистих» кадрів даних і блоків даних протоколу IP (PDU) і до протоколів TCP і User Datagram Protocol (UDP).
Графічний стек
Драйвери пристроїв Переважна більшість початкового коду ядра Linux припадає на драйвери пристроїв, що забезпечують можливість роботи з конкретними апаратними пристроями. У дереві початкових кодів Linux є підкаталог драйверів, в якому, своєю чергою, є підкаталоги для різних типів підтримуваних пристроїв, таких як Bluetooth, I2C, послідовні порти тощо.
Архітектурно-залежний код Хоча основна частина Linux незалежна від архітектури, на якій працює операційна система, в деяких елементах для забезпечення нормальної роботи і підвищення ефективності необхідно враховувати архітектуру.
Відмінності від Unix Ядро Linux підтримує динамічне завантаження модулів ядра. Хоча ядро Linux і є монолітним, воно додатково підтримує динамічне завантаження і вивантаження виконуваного коду ядра за потреби Ядро Linux підтримує симетричну багатопроцесорну обробку (SMP). Хоча більшість комерційних варіантів операційної системи Unix зараз підтримують SMP, більшість традиційних реалізацій ОС Unix такої підтримки не мають. Ядро Linux підтримує витискальну багатозадачність, у тому числі для потоків виконання ядра. Серед комерційних реалізацій ОС Unix преемптивне ядро мають тільки операційні системи Solaris і IRIX. У ядрі Linux використовується цікавий підхід для підтримки багатонитковості (multithreading): нитки нічим не відрізняються від звичайних процесів. З погляду ядра всі процеси однакові, просто деякі з них мають спільні ресурси. У ядрі Linux відсутні деякі функції ОС Unix, які вважаються погано реалізованими, як, наприклад, підтримка інтерфейсу STREAMS, або відповідають «недолугим» стандартам. Ядро Linux є повністю відкритим у повному розумінні цього слова. Набір функцій, реалізованих в ядрі Linux, — це результат вільної і відкритої моделі розробки операційної системи Linux. Якщо якась функція ядра вважається несуттєвою або неякісною, то розробники ядра не зобов'язані її реалізувати. В протилежність цьому, внесення змін при розробці ядра Linux займає «елітарну» позицію: зміни повинні вирішувати певну практичну задачу, повинні бути логічними і мати зрозумілу чітку реалізацію. Отже, функції деяких сучасних варіантів ОС Unix, такі як пам'ять ядра зі сторінковою реалізацією, не були реалізовані.
Попри наявні відмінності, Linux є операційною системою зі строгим спадкоємством традицій ОС Unix.
Ліцензія Linux розповсюджується на умовах ліцензії GNU General Public License (виключно версії 2), тобто вільно. Цю ліцензію вибрав Лінус Торвальдс практично відразу після того, як стало зрозуміло, що його хобі почало набувати поширення по всьому світу. Власником торгової марки Linux™ є Лінус, а допомагає стежити за дотриманням його прав і умов організація Linux Mark Institute.
Історія