Надо Знать![]() |
Введение
Ядро 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 является операционной системой со строгим наследованием традиций ОС Unix. 3. ЛицензияLinux распространяется на условиях лицензии GNU General Public License (исключительно версии 2 [2]), то есть свободно. Эту лицензию выбрал Линус Торвальдс практически сразу после того, как стало ясно, что его хобби стало приобретать распространение по всему миру. Владельцем торговой марки Linux ? является Линус, а помогает следить за соблюдением его прав и условий организация Linux Mark Institute. 4. История
Отметка в 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. Изменение политики нумерации версий ядра Linux30 мая 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 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. Сноски
Источники
код для вставки Данный текст может содержать ошибки. скачать |