Надо Знать

добавить знаний



Ядро Linux


Tux

План:


Введение

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

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

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


1. Архитектура

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

На сегодняшний день Linux - монолитное ядро ​​с поддержкой загружаемых модулей. Драйверы устройств и расширения ядра обычно запускаются на "кольце 0", с полным доступом к оборудованию. В отличие от обычных монолитных ядер, драйверы устройств легко собираются в виде модулей и загружаются или выгружаются во время работы системы.

То, что архитектура Linux не является микроядерной, вызвало дебаты между Линусом Торвальдсом и Эндрю Таненбаум в конференции comp.os.minix (Англ.) в 1992 г.


1.1. Структура

Операционную систему можно условно разделить на два уровня.

На верхнем уровне расположен пользовательский пространство (пространство выполнение приложений). Здесь выполняются приложения пользователя. Во пользовательским пространством располагается пространство ядра. Здесь функционирует ядро ​​Linux.

Есть также библиотека GNU C ( glibc). Она предоставляет интерфейс системных вызовов, который обеспечивает связь с ядром и дает механизм для перехода от программы, работающей в пространстве пользователя, ядра. Это важно, поскольку ядро ​​и программа пользователя располагаются в разных защищенных адресных пространствах. При этом, если в каждый процесс в пространстве пользователя имеет свой ​​собственный виртуальное адресное пространство, ядро занимает один общее адресное пространство.

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

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


1.2. Свойства ядра Linux

В ядре Linux реализован целый ряд важных архитектурных элементов. И в самом общем, и на детальных уровнях ядро ​​можно подразделить на множество различных подсистем. С другой стороны, Linux можно рассматривать как монолитное целое, поскольку все базовые сервисы собраны в ядре системы. Такой подход отличается от архитектуры с микроядром, когда ядро ​​предоставляет только общие сервисы, такие как обмен информацией, ввод / вывод, управление памятью и процессами, а конкретные сервисы реализуются в модулях, подключаемых к уровню микроядра.

Со временем ядро ​​Linux стало эффективным с точки зрения использования памяти и процессорных ресурсов и приобрело исключительной стабильности. Важный аспект Linux, учитывая размер и сложность этой системы - это ее переносимость. Linux можно собрать для огромного количества различных процессоров и платформ, имеющих различные архитектурные ограничения и потребности. Например, Linux может работать на процессоре как с блоком управления памятью (MMU), так и без MMU. Поддержка процессоров без MMU реализована в версии ядра uClinux.


1.3. Интерфейс системных вызовов

Интерфейс системных вызовов (SCI) - это тонкий уровень, предоставляющий средства для вызова функций ядра из пространства пользователя. Этот интерфейс может быть архитектурный зависимым, даже в пределах одного процессорного семейства. SCI фактически является службой мультиплексирования и демультиплексирования вызова функций. Реализация SCI содержится в. / Linux / kernel, а архитектурно-зависимая часть - в. / Linux / arch.

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


1.4. Управление процессами

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

Еще одна задача управления процессами - совместное использование процессора активными нитями. В ядре реализован новаторский алгоритм планировщика, время работы которого не зависит от числа нитей, претендующих на ресурсы процессора. Название этого планировщика - O (1) - подчеркивает, что на диспетчеризацию одной нити уходит столько же времени, как и на множество нитей. Планировщик O (1) также поддерживает симметричные многопроцессорные конфигурации ( SMP).


1.5. Управление памятью

Другой важный ресурс, которым управляет ядро, - это оперативная память. Для повышения эффективности, учитывая механизм работы аппаратных средств с виртуальной памятью, память организуется в виде так называемых страниц (в большинстве архитектуры размером 4 КБ). В Linux есть средства для управления имеющейся памятью, а также аппаратными механизмами для установления соответствия между физическим и виртуальной памятью.

Однако управление памятью - это гораздо больше, чем просто управление буферами по 4 КБ. Linux предоставляет абстракции над этими 4 КБ буферами, например, механизм распределения slab allocator. Этот механизм управления базируется на 4 КБ буферах, но затем размещает структуры внутри них, следя за тем, какие страницы полные, которые частично заполнены и которые пусты. Это позволяет динамически расширять и сокращать схему зависимости от потребностей размещенной системы.

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


1.6. Виртуальная файловая система

Еще один важный аспект ядра Linux - виртуальная файловая система (VFS), которая предоставляет общую абстракцию интерфейса к файловых систем. VFS оказывает уровень коммутации между SCI и файловыми системами, поддерживаемыми ядром. На верхнем уровне VFS располагается единственная API-абстракция таких функций, как открытие, закрытие, чтение и запись файлов. На нижнем уровне VFS расположены абстракции файловых систем, которые определяют, как реализуются функции верхнего уровня. Они являются модулями, подключаемых для конкретных файловых систем (которых существует более 50).

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


1.7. Сетевой стек

Сетевой стек по своей конструкции имеет многоуровневую архитектуру, повторяющий структуру самих протоколов. Протокол Internet Protocol (IP) - это базовый протокол сетевого уровня, расположен ниже транспортный протокол Transmission Control Protocol, TCP). Выше TCP расположен уровень сокетов, вызываемое через SCI.

Уровень сокетов является стандартным API к сетевой подсистемы. Он предоставляет интерфейс к различным сетевым протоколам. Уровень сокетов реализует стандартизированный способ управления соединениями и передачи данных между конечными точками, от доступа к "чистых" кадров данных и блоков данных протокола IP (PDU) и протоколам TCP и User Datagram Protocol ( UDP).


1.8. Драйверы устройств

Подавляющее большинство исходного кода ядра Linux приходится на драйверы устройств, обеспечивающих возможность работы с конкретными аппаратными устройствами. В дереве исходных кодов Linux является подкаталог драйверов, в котором, в свою очередь, является подкаталоги для разных типов поддерживаемых устройств, таких как Bluetooth, I2C, последовательные порты и тому подобное.

1.9. Архитектурно-зависимый код

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

2. Отличия от 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.


3. Лицензия

Linux распространяется на условиях лицензии GNU General Public License (исключительно версии 2 [2]), то есть свободно. Эту лицензию выбрал Линус Торвальдс практически сразу после того, как стало ясно, что его хобби стало приобретать распространение по всему миру. Владельцем торговой марки Linux ? является Линус, а помогает следить за соблюдением его прав и условий организация Linux Mark Institute.

4. История

Апрель 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]


4.1. Изменение политики нумерации версий ядра Linux

30 мая 2011 Линус Торвальдс выпустил ядро ​​версии 3.0-rc1. Вместе с ним изменена политика нумерации версий ядра. Отменено использование парных / нечетных номеров для обозначения стабильности ядра, а третье число означает стабилизацию ядра. Версия 3.0 не содержит значительных изменений, кроме новой политики нумерации ядра. Таким образом, стабильные версии ядра 3.0 будут именоваться 3.0.X, а следующий после этого релиз будет иметь номер 3.1.

5. Кто создает ядро ​​Линукс

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] (Англ.) .


6. Критика

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

Согласно внутренним исследованиям Intel, производительность Linux падает на два процента с каждым новым релизом - общее снижение производительности за последние десять релизов достигло 12 процентов.

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

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


7. Сноски

  1. InfoWorld. "Linux creator Torvalds still no fan of GPLv3" . http://www.infoworld.com/article/06/07/28/HNtorvaldsnofan_1.html .
  2. а б COPYING
  3. Stallman, Richard (2006-10-11). "Linux, GNU, and freedom". Free Software Foundation . http://www.gnu.org/philosophy/linux-gnu-freedom.html . Проверено 2007-02-21 .
  4. "September 25, 2006 e-mail by Linus Torvalds: Linux is open source, not free software" . http://lkml.org/lkml/2006/9/25/161 .
  5. Релиз ядра Linux 3.3. Обзор новшеств
  6. Linux Kernel Development (отчет, апрель 2008)
  7. http://lwn.net/Articles/334721/
  8. http://lwn.net/Articles/373405/
  9. Linus calls Linux "bloated and huge" - The Register, 22.09.2009
  10. "Linux ist zu komplex geworden". Linus Torvalds, der Erfinder des freien Betriebssystems, f?rchtet, dass irgendwann kein Entwickler mehr Linux versteht. Es m?sse simpler werden, sagt er im Interview.
  11. Линус Торвальдс выразил опасения в связи со стремительным усложнения ядра Linux

Источники


код для вставки
Данный текст может содержать ошибки.

скачать

© Надо Знать
написать нам