Ядро Linux

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук
Linux
Tux
Розробник(и) Лінус Торвальдс (засновник) та велика спільнота
Стабільний випуск 3.17 (5 жовтня 2014; 26 днів тому)
Написано на C
Платформа DEC Alpha, ARM, AVR32, Blackfin, ETRAX CRIS, FR-V, H8/300, Itanium, M32R, m68k, Microblaze, MIPS, MN103, PA-RISC, PowerPC, s390, S+core, SuperH, SPARC, TILE64, Unicore32, x86, Xtensa
Тип Ядро операційної системи
Ліцензія GNU General Public License лише версії 2[1][2] плюс різні ліцензовані блоби[3]
Сайт www.kernel.org
The Linux kernel is ubiquitously found on various hardware and is supported by an abundance of both, free and open-source and also proprietary software
Ця стаття про ядро операційної системи. Для отримання інформації про операційні системи, які використовують це ядро, і які також часто називають «Linux», читайте статтю Linux.

Ядро Linuxядро UNIX-подібної операційної системи. Розповсюджується під ліцензією GNU General Public License (GPL), і розробляється людьми з усього світу, що дозволило йому стати одним із найвидатніших прикладів відкритого програмного забезпечення[4].

Роботу над Лінукс розпочав Лінус Торвальдс у 1991 році. Тим часом, проект GNU розробив багато компонентів, необхідних для повноцінної вільної операційної системи, але його власне ядро, GNU Hurd було неповним і не було закінченим. Програми проекту GNU та велика кількість людей, що долучилися до розвитку ядра, сприяли його популяризації та створенню повноцінних операційних систем на базі цього ядра, котрі називають дистрибутивами лінукс.

Архітектура[ред.ред. код]

Ядро Linux підтримує багатозадачність, віртуальну пам'ять, динамічні бібліотеки, відкладене завантаження, продуктивну систему управління пам'яттю і багато мережних протоколів.

На сьогоднішній день Linux — монолітне ядро з підтримкою завантажуваних модулів. Драйвери пристроїв і розширення ядра зазвичай запускаються на «кільці 0», з повним доступом до устаткування. На відміну від звичайних монолітних ядер, драйвери пристроїв легко збираються у вигляді модулів і завантажуються або вивантажуються під час роботи системи.

Те, що архітектура Linux не є мікроядерною, викликало дебати між Лінусом Торвальдсом і Ендрю Таненбаумом в конференції comp.os.minix(англ.) в 1992 р.

Структура[ред.ред. код]

Операційну систему можна умовно розділити на два рівні.

На верхньому рівні розташований користувацький простір (простір виконування прикладних програм). Тут виконуються застосунки користувача. Під призначеним для користувача простором розташовується простір ядра. Тут функціонує ядро Linux.

Є також бібліотека GNU C (glibc). Вона надає інтерфейс системних викликів, який забезпечує зв'язок з ядром і дає механізм для переходу від програми, що працює в просторі користувача, до ядра. Це важливо, оскільки ядро і програма користувача розташовуються в різних захищених адресних просторах. При цьому, тоді як кожен процес в просторі користувача має свій власний віртуальний адресний простір, ядро займає один загальний адресний простір.

Ядро Linux можна, у свою чергу, розділити на три великі рівні. Вгорі розташовується інтерфейс системних викликів, який реалізує базові функції, наприклад, читання і запис. Нижче за інтерфейс системних викликів розташовується код ядра, точніше кажучи, незалежний код ядра. Цей код є загальним для всіх процесорних архітектур, підтримуваних Linux. Ще нижче розташовується архітектурно-залежний код, що утворює так званий BSP (Board Support Package — пакет підтримки апаратної платформи). Цей код залежить від процесора і платформи для конкретної архітектури.

Ядро по суті є диспетчером ресурсів. Незалежно від того, що є керованим ресурсом — процес, пам'ять або апаратний пристрій, — ядро організовує й упорядковує доступ до ресурсу безлічі конкуруючих користувачів (як у просторі ядра, так і в просторі користувача).

Властивості ядра Linux[ред.ред. код]

У ядрі Linux реалізована ціла низка важливих архітектурних елементів. І на найзагальнішому, і на детальніших рівнях ядро можна підрозділити на безліч різних підсистем. З іншого боку, Linux можна розглядати як монолітне ціле, оскільки всі базові сервіси зібрані в ядрі системи. Такий підхід відрізняється від архітектури з мікроядром, коли ядро надає тільки найзагальніші сервіси, такі як обмін інформацією, ввід/вивід, управління пам'яттю і процесами, а конкретніші сервіси реалізуються в модулях, що підключаються до рівня мікроядра.

З часом ядро Linux стало ефективнішим з погляду використання пам'яті і процесорних ресурсів і набуло виняткової стабільності. Важливий аспект Linux, враховуючи розмір і складність цієї системи — це її переносимість. Linux можна відкомпілювати для величезної кількості різних процесорів і платформ, що мають різні архітектурні обмеження і потреби. Наприклад, Linux може працювати на процесорі як з блоком управління пам'яттю (MMU), так і без MMU. Підтримка процесорів без MMU реалізована у версії ядра uClinux.

Інтерфейс системних викликів[ред.ред. код]

Інтерфейс системних викликів (SCI) — це тонкий рівень, що надає засоби для виклику функцій ядра з простору користувача. Цей інтерфейс може бути архітектурно залежним, навіть в межах одного процесорного сімейства. SCI фактично є службою мультиплексування і демультиплексування виклику функцій. Реалізація SCI міститься в ./linux/kernel, а архітектурно-залежна частина - в ./linux/arch.

Реальна архітектура Linux не цілком слідує "ідеальній" моделі. Наприклад, механізм обробки системних викликів (перехід від простору користувача до простору ядра) може бути різним для різної архітектури. У сучасніших процесорах з архітектурою x86, що мають підтримку інструкцій віртуалізації, цей процес здійснюється ефективніше, ніж в старих процесорах x86, де застосовується традиційний підхід з використанням переривання int 80h.

Керування процесами[ред.ред. код]

Керування процесами сконцентроване на виконанні процесів. У ядрі ці процеси називаються нитями (англ. threads); вони відповідають окремим віртуалізованим об'єктам процесора (код ниті, дані, стек, процесорні регістри). У просторі користувача зазвичай використовується термін процес, хоча в реалізації Linux ці дві концепції (процеси і ниті) не розрізняють. Ядро надає прикладний програмний інтерфейс (API) через SCI для створення нового процесу (породження копії, запуску на виконання, виклику функцій Portable Operating System Interface POSIX), зупинки процесу (kill, exit), взаємодії і синхронізації між процесами (сигнали або механізми POSIX).

Ще одне завдання керування процесами — сумісне використання процесора активними нитями. У ядрі реалізований новаторський алгоритм планувальника, час роботи якого не залежить від числа нитей, що претендують на ресурси процесора. Назва цього планувальника — O(1) — підкреслює, що на диспетчеризацію одної ниті витрачається стільки ж часу, як і на множину нитей. Планувальник O(1) також підтримує симетричні багатопроцесорні конфігурації (SMP).

Керування пам'яттю[ред.ред. код]

Інший важливий ресурс, яким управляє ядро, — це оперативна пам'ять. Для підвищення ефективності, враховуючи механізм роботи апаратних засобів з віртуальною пам'яттю, пам'ять організовується у вигляді так званих сторінок (у більшості архітектури розміром 4 КБ). У Linux є засоби для управління наявною пам'яттю, а також апаратними механізмами для встановлення відповідності між фізичною і віртуальною пам'яттю.

Проте управління пам'яттю — це значно більше, чим просто управління буферами по 4 КБ. Linux надає абстракції над цими 4 КБ буферами, наприклад, механізм розподілу slab allocator. Цей механізм управління базується на 4 КБ буферах, але потім розміщує структури усередині них, стежачи за тим, які сторінки повні, які частково заповнені і які порожні. Це дозволяє динамічно розширювати і скорочувати схему залежно від потреб розміщеної системи.

В умовах наявності великого числа користувачів у пам'яті можливі ситуації, коли вся наявна пам'ять буде вичерпана. У зв'язку з цим сторінки можна видаляти з пам'яті і переносити на диск. Цей процес обміну сторінок між оперативною пам'яттю і твердим диском називається підкачкою.

Віртуальна файлова система[ред.ред. код]

Ще один важливий аспект ядра 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, ядро Linux в змозі витіснити завдання, що виконується, навіть якщо це завдання працює в режимі ядра. Серед комерційних реалізацій ОС Unix преемптивне ядро мають тільки операційні системи Solaris і IRIX.
  • У ядрі Linux використовується цікавий підхід для підтримки багатонитевості (multithreading): ниті нічим не відрізняються від звичайних процесів. З погляду ядра всі процеси однакові, просто деякі з них мають спільні ресурси.
  • У ядрі Linux відсутні деякі функції ОС Unix, які вважаються погано реалізованими, як, наприклад, підтримка інтерфейсу STREAMS, або відповідають "недолугим" стандартам.
  • Ядро Linux є повністю відкритим у повному розумінні цього слова. Набір функцій, реалізованих в ядрі Linux, — це результат вільної і відкритої моделі розробки операційної системи Linux. Якщо якась функція ядра вважається несуттєвою або неякісною, то розробники ядра не зобов'язані її реалізувати. В протилежність цьому, внесення змін при розробці ядра Linux займає “елітарну” позицію: зміни повинні вирішувати певну практичну задачу, повинні бути логічними і мати зрозумілу чітку реалізацію. Отже, функції деяких сучасних варіантів ОС Unix, такі як пам'ять ядра із сторінковою реалізацією, не були реалізовані.

Незважаючи на наявні відмінності, Linux є операційною системою зі строгим спадкоємством традицій ОС Unix.

Ліцензія[ред.ред. код]

Linux розповсюджується на умовах ліцензії GNU General Public License (виключно версії 2[2]), тобто вільно. Цю ліцензію вибрав Лінус Торвальдс практично відразу після того, як стало зрозуміло, що його хобі почало набувати поширення по всьому світу. Власником торгової марки Linux™ є Лінус, а допомагає стежити за дотриманням його прав і умов організація Linux Mark Institute.

Історія[ред.ред. код]

квітень 1991 21 річний Лінус Торвальдс розпочинає роботу над керівником задач під i386 і терміналом.
25 серпня 1991 Лінус повідомляє про свою працю у comp.os.minix. Працюють bash(1.08) та gcc(1.40) [1]
17 вересня 1991 Linux 0.01. 10,239 рядків коду.
Жовтень 1991 Linux 0.02 [2]
Грудень 1991 Linux 0.11. Перша версія, у якій можна скомпілювати її саму.
19 січня 1992 Перше повідомлення в alt.os.linux [3]
31 березня 1992 створення групи новин comp.os.linux [4]
Квітень 1992 Linux 0.96, вперше запускається X Window System.
Весь 1993, і початок 1994 15 версій 0.99.*
14 березня 1994 Linux 1.0.0. Стабільна версія 176,250 рядків коду.
Березень 1995 Linux 1.2.0. Зявилась підтримка Alpha, Sparc і Mips 310,950 рядків коду.
9 травня 1996 Пінгвін Tux вибраний логотипом Лінукс
9 червня 1996 Linux 2.0.0. Багатопроцесорність, SMP 777,956 рядків коду.
25 січня 1999 Linux 2.2.0. [5] 1,800,847 рядків коду.
4 січня 2001 Linux 2.4.0 [6] 3,377,902 рядків коду.
18 грудня 2003 Linux 2.6.0 [7] 5,929,913 рядків коду.

Відмітка в 10 млн рядків була пройдена у кінці 2008 року, при випуску ядра 2.6.27.

Ядро 3.3, що вийшло у березні 2012, подолало черговий рубіж — розмір сирцевого коду ядра перевищив відмітку в 15 млн рядків. При цьому 5.6 млн рядків доводиться на драйвери, 1.8 млн на специфічний для апаратної архітектури код, 700 тисяч на файлові системи, 533 тисяч на звукову підсистему, 493 тисяч на мережевий стек. 97.22% кода ядра написано на мові Сі, 2.47% на асемблері, 0.15% на Perl і 0.04% на Shell.[5]

Зміна політики нумерації версій ядра Linux[ред.ред. код]

30 травня 2011 Лінус Торвальдс випустив ядро ​​версії 3.0-rc1. Разом з ним змінено політику нумерації версій ядра. Скасовано використання парних / непарних номерів для позначення стабільності ядра, а третє число означає стабілізацію ядра. Версія 3.0 не містить значних змін, крім нової політики нумерації ядра. Таким чином, стабільні версії ядра 3.0 будуть іменуватися 3.0.X, а наступний після цього реліз буде мати номер 3.1.

Хто створює ядро Лінукс[ред.ред. код]

Linux — складна система, що може включати тисячі різних пакунків, від найпоширеніших, таких, як утиліти GNU, X.org, графічні середовища GNOME і KDE, до специфічних для якогось одного з дистрибутивів. Команди розробників кожного проекту відрізняються чисельністю, підходом до роботи, використовуваними інструментами і методами планування робіт. При цьому ядро Linux займає особливе місце серед всіх інших застосувань. Від нього залежить можливість роботи системи Linux на різних апаратних платформах і ступінь підтримки різних пристроїв. Тому характеристики процесу його розробки можуть, якоюсь мірою, служити індикатором для всієї системи Linux.

Linux Foundation провело дослідження[6], що охоплює трирічний період розробки ядра (від версії 2.6.11 до версії 2.6.24) і фокусується на таких характеристиках, як частота релізів і змін, розмір початкових текстів ядра, і найголовніше, дозволяє отримати уявлення про тих, хто зрештою розробляє ядро Linux.

Статистика показує, що, в середньому, кожен новий реліз ядра виходить раз на 2,5 — 3 місяці (60 — 110 днів). В першу чергу це пов'язано з вибраною в 2005 р. моделлю розробки, направленою на зведення до мінімуму тривалості проміжків між розробкою нових функцій, появою підтримки нових пристроїв і включенням їх в ядро; а також що зводить до мінімуму потребу творців дистрибутивів в модифікаціях ядра.

При цьому число латок (патчів), що вносяться до ядра, має тенденцію до зростання. Зводячи воєдино ці дві характеристики, можна відзначити, що, в середньому, до ядра вноситься 2,83 патча за годину, при цьому, в рядках коду щодня в ядро додається понад 3 тис. рядків, більше 1,4 тис. рядків модифікується. Число розробників, що взяли участь у випуску версії 2.6.24, більш ніж вдвічі перевищило цей показник для версії 2.6.11 і склало 1057 чоловік.

При цьому, проте, всього 10 провідних розробників спільно внесли майже 15% змін, а 30 провідних розробників — 30%. Це, проте, не означає, що поширене в деяких кругах уявлення про Linux як про систему, що розробляється аматорами, правильне. Не зважаючи, що далеко не у всіх компаній, що займаються вільним ПЗ, є необхідність вносити зміни до ядра, числа компаній, що беруть участь в його розробці, росте. Чотири найбільші компанії-розробники ядра — Red Hat, Novell, IBM і Intel — внесли більше 32% зроблених за час дослідження змін, а сумарний відсоток змін в ядро, внесених розробниками, що працюють на компанії, склав більше 70%.

При цьому серед компаній, що беруть участь в розробці ядра, виділяється декілька груп по основній меті участі в розробці. Це група компаній, що включає IBM, Intel, HP, SGI, MIPS та інших, яка орієнтується в основному на підтримку роботи Linux на власному устаткуванні. Дистриб'ютори, такі, як Red Hat,, Novell, MontaVista мають на меті додавання в ядро можливостей, на які існує попит серед користувачів, і які підсилюють конкурентоспроможність дистрибутивів як кінцевих продуктів. Такі компанії, як Sony, Nokia, Samsung працюють над ядром для поліпшення роботи систем на базі ядра Linux у власних пристроях.

Компанії, які найактивніше здійснюють доопрацювання ядра Linux
Назва компанії Кількість змін % від загального числа змін
Приватні користувачі 11,594 13.9%
Назва не визначена 10,803 12.9%
Red Hat 9,351 11.2%
Novell 7,385 8.9%
IBM 6,952 8.3%
Intel 3,388 4.1%
Linux Foundation 2,160 2.6%
Consultant 2,055 2.5%
SGI 1,649 2.0%
MIPS Technologies 1,341 1.6%
Oracle 1,122 1.3%
MontaVista 1,010 1.2%
Google 965 1.1%
Linutronix 817 1.0%
HP 765 0.9%
NetApp 764 0.9%
SWsoft 762 0.9%
Renesas Technology 759 0.9%
Freescale 730 0.9%
Astaro 715 0.9%
Academia 656 0.8%
Cisco 442 0.5%
Simtec 437 0.5%
Linux Networx 434 0.5%
QLogic 398 0.5%
Fujitsu 389 0.5%
Broadcom 385 0.5%
Analog Devices 358 0.4%
Mandriva 329 0.4%
Mellanox 294 0.4%
Snapgear 285 0.3%

Таким чином, з дослідження Linux Foundation можна зробити висновок, що ядро Linux є безпрецедентним прикладом успішної співпраці різних за розміром і вироблюваною продукцією компаній і індивідуальних розробників. Кількість цих розробників і розподіл їхнього внеску в розробку може служити, в деякому розумінні, гарантією стабільності і незалежності розробки.

Також доступні новіші версії статистики для ядер 2.6.30 та 2.6.33[7][8](англ.).

Критика[ред.ред. код]

Під час круглого столу на конференції LinuxCon 2009 року в США Лінус Торвальдс назвав ядро операційної системи Linux, створене ним 18 років тому, "роздутим і величезним" ("bloated and huge")[9]. З появою в ядрі кожної нової функції ситуація тільки погіршується, і в цей час співтовариство не має в своєму розпорядженні плану з виправлення ситуації. Але сама ситуація неминуча внаслідок необхідності додавання нових функцій і підтримки великої кількості пристроїв.

Згідно з внутрішнім дослідженням Intel, продуктивність Linux падає на два відсотки з кожним новим релізом — загальне зниження продуктивності за останні десять релізів досягло 12 відсотків.

Перша версія ядра Linux включала в себе приблизно 10 тисяч рядків коду, для версії 3.3 розмір ядра перевалив уже за 15 мільйонів рядків.

В інтерв'ю німецькому виданню Zeit[10][11] Лінус Торвальдс висловив свої побоювання у зв'язку зі стрімким ускладненням ядра Linux. Ситуацію, коли в якийсь підсистемі ОС здатні розібратися буквально кілька людей з усього співтовариства, Лінус вважає неприпустимою: "Іноді просто для того, щоб зрозуміти, через що проявляється якась помилка — ми витрачаємо кілька днів, щоб знайти потрібного фахівця". Крім того, Лінус каже, що він тепер не знає тих тисяч розробників, що працюють над ядром, оскільки особисто контактує не більше, ніж з 50 провідними розробниками різних підсистем. При цьому він зізнається, що по-справжньому він довіряє лише кільком із них. Така система роботи склалася стихійно, і Лінус називає її "мережею взаємодії, побудованої на довірі" (Лінус довіряє декільком основним ментейнерам, які, в свою чергу, довіряють розробникам, котрі розвивають їхні підсистеми).

Виноски[ред.ред. код]

Джерела[ред.ред. код]

Посилання[ред.ред. код]

Дивись також[ред.ред. код]