Remove ads
ядро UNIX-подібної операційної системи З Вікіпедії, вільної енциклопедії
Ядро Linux — ядро UNIX-подібної операційної системи. Розповсюджується під ліцензією GNU General Public License (GPL), і розробляється людьми з усього світу, що дозволило йому стати одним із найвидатніших прикладів відкритого програмного забезпечення[6] та увійти до числа наймасштабніших проєктів з розробки програмного забезпечення: версія 4.5 мала 21 млн рядків коду, а за 2015 рік до роботи над ним долучилось близько чотирьох тисяч розробників та понад 440 різних організацій[7].
Тип | Ядро операційної системи |
---|---|
Автор | Лінус Торвальдс[1] |
Розробники | Лінус Торвальдс (засновник) та велика спільнота |
Платформа | ARM, Мікроконтролери AVR, Blackfin, DEC Alpha, ETRAX CRIS, Itanium, MIPS, PA-RISC, PowerPC, SPARC, SuperH, TILE64, Unicore, Xtensa, Motorola 68000, IBM System/390, X86, x86_64, z/Architecture |
Мова програмування | C[2] |
Ліцензія | GNU General Public License лише версії 2[3][4] плюс різні ліцензовані блоби[5] |
Репозиторій | git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git |
Вебсайт | www.kernel.org |
Роботу над Лінукс розпочав Лінус Торвальдс у 1991 році. Тим часом, проєкт GNU розробив багато компонентів, необхідних для повноцінної вільної операційної системи, але його власне ядро, GNU Hurd було неповним і незакінченим. Програми проєкту GNU та велика кількість людей, що долучилися до розвитку ядра, сприяли його популяризації та створенню повноцінних операційних систем на базі цього ядра, котрі називають дистрибутивами Лінукс.
Ядро Linux підтримує багатозадачність, віртуальну пам'ять, динамічні бібліотеки, відкладене завантаження, продуктивну систему керування пам'яттю і багато мережних протоколів.
Linux — монолітне ядро з підтримкою завантажуваних модулів. Драйвери пристроїв і розширення ядра зазвичай запускаються на «кільці 0», з повним доступом до устаткування. На відміну від звичайних монолітних ядер, у ядрі Лінукс драйвери пристроїв легко збираються у вигляді модулів і завантажуються або вивантажуються під час роботи системи.
Те, що архітектура Linux не є мікроядерною, викликало дебати між Лінусом Торвальдсом і Ендрю Таненбаумом на конференції comp.os.minix[8]
Операційну систему можна умовно розділити на два рівні.
На верхньому рівні розташований користувацький простір (простір виконування прикладних програм). Тут виконуються застосунки користувача. Під призначеним для користувача простором розташовується простір ядра. Тут функціонує ядро Linux.
Є також бібліотека GNU C (glibc). Вона надає інтерфейс системних викликів, який забезпечує зв'язок з ядром і дає механізм для переходу від програми, що працює в просторі користувача, до ядра. Це важливо, оскільки ядро і програма користувача розташовуються в різних захищених адресних просторах. При цьому, тоді як кожен процес в просторі користувача має свій власний віртуальний адресний простір, ядро займає один загальний адресний простір.
Ядро Linux можна, своєю чергою, розділити на три великі рівні. Вгорі розташовується інтерфейс системних викликів, який реалізує базові функції, наприклад, читання і запис. Нижче за інтерфейс системних викликів розташовується код ядра, точніше кажучи, незалежний код ядра. Цей код є загальним для всіх процесорних архітектур, підтримуваних Linux. Ще нижче розташовується архітектурно-залежний код, що утворює так званий BSP (Board Support Package — пакет підтримки апаратної платформи). Цей код залежить від процесора і платформи для конкретної архітектури.
Ядро по суті є диспетчером ресурсів. Незалежно від того, що є керованим ресурсом — процес, пам'ять чи апаратний пристрій, — ядро організовує й упорядковує доступ до ресурсу безлічі конкуруючих користувачів (як у просторі ядра, так і в просторі користувача).
У ядрі Linux реалізована ціла низка важливих архітектурних елементів. І на найзагальнішому, і на детальніших рівнях ядро можна підрозділити на безліч різних підсистем. З іншого боку, Linux можна розглядати як монолітне ціле, оскільки всі базові сервіси зібрані в ядрі системи. Такий підхід відрізняється від архітектури з мікроядром, коли ядро надає тільки найзагальніші сервіси, такі як обмін інформацією, ввід/вивід, управління пам'яттю і процесами, а конкретніші сервіси реалізуються в модулях, що підключаються до рівня мікроядра.
З часом ядро Linux стало ефективнішим з погляду використання пам'яті і процесорних ресурсів і набуло виняткової стабільності. Важливий аспект Linux, враховуючи розмір і складність цієї системи — це її переносимість. Linux можна відкомпілювати для величезної кількості різних процесорів і платформ, що мають різні архітектурні обмеження і потреби. Наприклад, Linux може працювати на процесорі як з блоком керування пам'яттю (MMU), так і без нього. Підтримка процесорів без MMU реалізована у версії ядра uClinux.
Інтерфейс системних викликів (SCI) — це тонкий рівень, що надає засоби для виклику функцій ядра з простору користувача. Цей інтерфейс може бути архітектурно залежним, навіть в межах одного процесорного сімейства. SCI фактично є службою мультиплексування і демультиплексування виклику функцій. Реалізація SCI міститься в у підкаталозі kernel, а архітектурно-залежна частина — у підкаталозі arch.
Механізм обробки системних викликів (перехід від простору користувача до простору ядра) відрізняється для різних процесорних архітектур, і може навіть бути різним у межах однієї архітектури (наприклад, механізми шлюзів виклику, int 80h
, SYSENTER
і SYSCALL
для x86).
Керування процесами сконцентроване на виконанні процесів. У ядрі ці процеси називаються нитками (англ. threads); вони відповідають окремим віртуалізованим об'єктам процесора (код ниті, дані, стек, процесорні регістри). У просторі користувача зазвичай використовується термін процес, хоча в реалізації Linux ці дві концепції (процеси і ниті) не розрізняють. Ядро надає прикладний програмний інтерфейс (API) через SCI для створення нового процесу (породження копії, запуску на виконання, виклику функцій Portable Operating System Interface POSIX), зупинки процесу (kill, exit), взаємодії і синхронізації між процесами (сигнали або механізми POSIX).
Ще одне завдання керування процесами — сумісне використання процесора активними нитями. У ядрі реалізований новаторський алгоритм планувальника, час роботи якого не залежить від числа нитей, що претендують на ресурси процесора. Назва цього планувальника — O(1) — підкреслює, що на диспетчеризацію одної ниті витрачається стільки ж часу, як і на множину нитей. Планувальник O(1) також підтримує симетричні багатопроцесорні конфігурації (SMP).
Інший важливий ресурс, яким керує ядро, — це оперативна пам'ять. Для підвищення ефективності, враховуючи механізм роботи апаратних засобів з віртуальною пам'яттю, пам'ять організовується у вигляді так званих сторінок фіксованого розміру. У Linux є засоби для керування наявною пам'яттю, а також апаратними механізмами для встановлення відповідності між фізичною і віртуальною пам'яттю.
На базі сторінкової пам'яті у ядрі Linux збудовано різні механізми виділення і звільнення блоків пам'яті, такі як slab allocation[en], SLOB[en] і SLUB (software)[en]. Після виділення сторінок ядро розміщує структури усередині них, стежачи за тим, які сторінки повні, які частково заповнені і які порожні. Це дозволяє динамічно розширювати і скорочувати схему залежно від потреб розміщеної системи.[джерело?]
В умовах наявності великого числа користувачів у пам'яті можливі ситуації, коли вся наявна пам'ять буде вичерпана. Через це сторінки можна видаляти з пам'яті і переносити на диск. Цей процес обміну сторінок між оперативною пам'яттю і твердим диском називається підкачуванням, або свопінгом.
Ще один важливий аспект ядра 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).
Цей розділ потребує доповнення. (березень 2020) |
Переважна більшість початкового коду ядра Linux припадає на драйвери пристроїв, що забезпечують можливість роботи з конкретними апаратними пристроями. У дереві початкових кодів Linux є підкаталог драйверів, в якому, своєю чергою, є підкаталоги для різних типів підтримуваних пристроїв, таких як Bluetooth, I2C, послідовні порти тощо.
Хоча основна частина Linux незалежна від архітектури, на якій працює операційна система, в деяких елементах для забезпечення нормальної роботи і підвищення ефективності необхідно враховувати архітектуру.
Попри наявні відмінності, Linux є операційною системою зі строгим спадкоємством традицій ОС Unix.
Linux розповсюджується на умовах ліцензії GNU General Public License (виключно версії 2[4][10]), тобто вільно. Цю ліцензію вибрав Лінус Торвальдс практично відразу після того, як стало зрозуміло, що його хобі почало набувати поширення по всьому світу. Власником торгової марки Linux™ є Лінус, а допомагає стежити за дотриманням його прав і умов організація Linux Mark Institute.
квітень 1991 | 21 річний Лінус Торвальдс розпочинає роботу над планувальником задач операційної системи для роботи на комп'ютерах з процесорами i386. | |
25 серпня 1991 | Лінус повідомляє про свою працю у comp.os.minix. Працюють bash(1.08) та gcc(1.40)[11] | |
17 вересня 1991 | Linux 0.01. | 10,239 рядків коду. |
Жовтень 1991 | Linux 0.02[12] | |
Грудень 1991 | Linux 0.11. Перша версія, у якій можна скомпілювати її саму. | |
19 січня 1992 | Перше повідомлення в alt.os.linux[13] | |
31 березня 1992 | створення групи новин comp.os.linux[14] | |
Квітень 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.[15] | 1,800,847 рядків коду. |
4 січня 2001 | Linux 2.4.0[16] | 3,377,902 рядків коду. |
18 грудня 2003 | Linux 2.6.0[17] | 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.[18]
30 травня 2011 Лінус Торвальдс випустив ядро версії 3.0-rc1. Разом з ним змінено політику нумерації версій ядра. Скасовано використання парних / непарних номерів для позначення стабільності ядра, а третє число означає стабілізацію ядра. Версія 3.0 не містить значних змін, крім нової політики нумерації ядра. Таким чином, стабільні версії ядра 3.0 іменуються 3.0.X, а наступний після цього реліз має номер 3.1.
Нові версії виходять приблизно що два місяці. Після випуску версії 3.19 Лінус Торвальдс випустив ядро версії 4.0 12 квітня 2015 року. Версія 5.0 вийшла 2019-го року.
Linux — складна система, що може включати тисячі різних пакунків, від найпоширеніших, таких, як утиліти GNU, X.org, графічні середовища GNOME і KDE, до специфічних для якогось одного з дистрибутивів. Команди розробників кожного проєкту відрізняються чисельністю, підходом до роботи, використовуваними інструментами і методами планування робіт. При цьому ядро Linux займає особливе місце серед всіх інших застосувань. Від нього залежить можливість роботи системи Linux на різних апаратних платформах і ступінь підтримки різних пристроїв. Тому характеристики процесу його розробки можуть, якоюсь мірою, служити індикатором для всієї системи Linux.
Linux Foundation провело дослідження[19], що охоплює трирічний період розробки ядра (від версії 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 у власних пристроях.
Назва компанії | Кількість змін | % від загального числа змін |
---|---|---|
Приватні користувачі | 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% |
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[20][21](англ.).
Під час круглого столу на конференції LinuxCon 2009 року в США Лінус Торвальдс назвав ядро операційної системи Linux, створене ним 18 років тому, «роздутим і величезним» («bloated and huge»)[22]. З появою в ядрі кожної нової функції ситуація тільки погіршується, і в цей час співтовариство не має в своєму розпорядженні плану з виправлення ситуації. Але сама ситуація неминуча внаслідок необхідності додавання нових функцій і підтримки великої кількості пристроїв.
Згідно з внутрішнім дослідженням Intel, продуктивність Linux падає на два відсотки з кожним новим релізом — загальне зниження продуктивності за останні десять релізів досягло 12 відсотків.
Перша версія ядра Linux включала в себе приблизно 10 тисяч рядків коду, для версії 3.3 розмір ядра перевалив уже за 15 мільйонів рядків.
В інтерв'ю німецькому виданню Zeit[23][24] Лінус Торвальдс висловив свої побоювання через стрімке ускладнення ядра Linux. Ситуацію, коли якусь підсистему ОС здатні розуміти лише кілька людей зі всього співтовариства, Лінус вважає неприпустимою: «Іноді просто для того, щоб зрозуміти, через що проявляється якась помилка — ми витрачаємо кілька днів, щоб знайти потрібного фахівця». Крім того, Лінус каже, що він тепер не знає тих тисяч розробників, що працюють над ядром, оскільки особисто контактує не більше, ніж з 50 провідними розробниками різних підсистем. При цьому він зізнається, що по-справжньому він довіряє лише кільком із них. Така система роботи склалася стихійно, і Лінус називає її «мережею взаємодії, побудованою на довірі» (Лінус довіряє кільком основним ментейнерам, які, своєю чергою, довіряють розробникам, котрі розвивають їхні підсистеми).
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.