Ядро Linux перевалило за 10 млн строк
Простой анализ последней версии ядра Linux 2.6.27 показывает, что объём кода в нём превысил 10 млн строк. Правда, в это число входят и пустые строки, комментарии и текстовые файлы.
Если профильтровать результат с помощью SLOCCount, то более глубокий анализ выдаёт точное число полезных строк кода: 6 399 191. Из них 96,4% написано на C, а 3,3% — на ассемблере, третье место занимает Perl (0,1%). Число строк увеличивается с каждой новой версией ядра, которые выпускаются примерно каждые 90 дней.
Более половины объёма кода сейчас — это аппаратные драйверы, на втором месте — директория arch/, в которой находится код для различных архитектур, поддерживаемых в Linux.
По гипотетической оценке SLOCCount, чтобы переписать Linux с нуля, требуется работа 200 программистов в течение девяти с половиной лет и обойдётся это в $268 млн (при средней зарплате программиста). Стоимость ядра тоже растёт с каждым апдейтом.
Ядру Linux исполнилось 26 лет
Линус Торвальдс — создатель и основной координатор проекта по созданию ядра Linux История развития UNIX-систем. Linux является UNIX-совместимой, однако основывается на собственном исходном коде
25 августа 1991 года, после пяти месяцев разработки 21-летний студент Линус Торвальдс объявил в телеконференции comp.os.minix о создании рабочего прототипа новой операционной системы Linux, для которой было отмечено завершение портирования bash 1.08 и gcc 1.40. Первый публичный выпуск ядра Linux был представлен 17 сентября.
Ядро 0.0.1 имело размер 62 Кб в сжатом виде и содержало около 10 тысяч строк исходного кода. Современное ядро Linux насчитывает более 24 млн строк кода. По данным исследования, проведённого в 2010 году по заказу Евросоюза, приблизительная стоимость разработки с нуля проекта, аналогичного современному ядру Linux, составила бы более миллиарда долларов США, по другим оценкам — более 3 миллиардов.
Ядро Linux было создано под впечатлением от операционной системы Minix, которая не устраивала Линуса своей ограниченной лицензией. Впоследствии, когда Linux стал известным проектом, недоброжелатели пытались обвинить Линуса в прямом копировании кода некоторых подсистем Minix. Нападение отразил Эндрю Таненбаум, автор Minix, который поручил одному из студентов провести детальное сравнение кода Minix и первых публичных версий Linux. Результаты исследования показали наличие только четырёх несущественных совпадений блоков кода, обусловленных требованиями POSIX и ANSI C.
Первоначально Линус задумал назвать ядро Freax, от слов «free», «freak» и X (Unix). Но имя «Linux» ядро получило с лёгкой руки Ари Лемке (фин. Ari Lemmke ), который по просьбе Линуса разместил ядро на FTP-сервере университета, назвав директорию с архивом не «freax», как просил Торвальдс, а «linux». Примечательно, что предприимчивый делец Вильям Делло Крок (англ. William Della Croce ) сумел зарегистрировать торговую марку Linux и хотел со временем собирать отчисления, но позднее передумал и передал все права на торговую марку Линусу.
Официальный талисман Linux-ядра, пингвин Tux, был выбран в результате соревнования, состоявшегося в 1996 году. Имя Tux расшифровывается как Torvalds UniX.
- 0.0.1 — сентябрь 1991, 10 тыс. строк кода;
- 1.0.0 — март 1994, 176 тыс. строк кода;
- 1.2.0 — март 1995, 311 тыс. строк кода;
- 2.0.0 — июнь 1996, 778 тыс. строк кода;
- 2.2.0 — январь 1999, 1.8 млн строк кода;
- 2.4.0 — январь 2001, 3.4 млн строк кода;
- 2.6.0 — декабрь 2003, 5.9 млн строк кода;
- 2.6.28 — декабрь 2008, 10.2 млн строк кода;
- 2.6.35 — август 2010, 13.4 млн строк кода;
- 3.0 — август 2011, 14.6 млн строк кода.
- 3.5 — июль 2012, 15.5 млн строк кода.
- 3.10 — июль 2013, 15.8 млн строк кода;
- 3.16 — август 2014, 17.5 млн строк кода.
- 4.1 — июнь 2015, 19.5 млн строк кода.
- 4.7 — июль 2016, 21.7 млн строк кода.
- 4.12 — июль 2017, 24.1 млн строк кода.
- Linux 0.0.1 — сентябрь 1991, первый публичный выпуск, поддерживающий только CPU i386 и загружающийся с дискеты;
- Linux 0.12 — январь 1992, код начал распространяться под лицензией GPLv2;
- Linux 0.95 — март 1992, обеспечена возможность запуска X Window System, реализована поддержка виртуальной памяти и раздела подкачки.
- Linux 0.96-0.99 — 1992—1993, началась работа над сетевым стеком. Представлена файловая система Ext2, добавлена поддержка формата файлов ELF, представлены драйверы для звуковых карт и контроллеров SCSI, реализована загрузка модулей ядра и файловой системы /proc.
- В 1992 году появились первые дистрибутивы SLS и Yggdrasil. Летом 1993 года были основаны проекты Slackware и Debian.
- Linux 1.0 — март 1994, первый официально стабильный релиз;
- Linux 1.2 — март 1995, существенное увеличение числа драйверов, поддержка платформ Alpha, MIPS и SPARC, расширение возможностей сетевого стека, появление пакетного фильтра, поддержка NFS;
- Linux 2.0 — июнь 1996 года, поддержка многопроцессорных систем;
- Март 1997: основан LKML, список рассылки разработчиков ядра Linux;
- 1998 год: запущен первый попавший в список Top500 кластер на базе Linux, состоящий из 68 узлов с CPU Alpha;
- Linux 2.2 — январь 1999, увеличена эффективность системы управления памятью, добавлена поддержка IPv6, реализован новый межсетевой экран, представлена новая звуковая подсистема;
- Linux 2.4 — февраль 2001, обеспечена поддержка 8-процессорных систем и 64 Гб ОЗУ, файловая система Ext3, поддержка USB, ACPI;
- Linux 2.6 — декабрь 2003, поддержка SELinux, средства автоматического тюнинга параметров ядра, sysfs, переработанная система управления памятью;
- В 2005 году представлен гипервизор Xen, который открыл эру виртуализации;
- В сентябре 2008 года сформирован первый релиз платформы Android, основанной на ядре Linux;
- В июле 2011 года после 10 лет развития ветки 2.6.x осуществлён переход к нумерации 3.x.
- В 2015 году состоялся выпуск ядра Linux 4.0.
Источники [ править ]
- «Ядру Linux исполнилось 26 лет». opennet.ru, 25 августа 2017 года. (архив) (CC-BY).
Комментарии [ править ]
Мнения Пожалуйста, прочтите правила общения и оформления реплик на портале Викиновости
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.
С днём рождения, Linux: ядру операционной системы исполнилось 26 лет
25 августа 1991 года является днём рождения ядра операционной системы Linux. История её создания очень проста. Молодой финский аспирант, Линус Торвальдс, был разочарован поставляемой вместе с ОС Minix программой эмуляции терминала. Было принято решение переписать ее без привязки к какой-либо конкретной системе. После некоторых модификаций и доработок начало появляться некое подобие ОС, о чем гордый Торвальдс объявил в телеконференции comp.os.minix. На тот момент времени было уже завершено портирование bash 1.08 и gcc 1.40.
Первый публичный выпуск ядра Linux был представлен 17 сентября того же года. Ядро 0.0.1 имело размер 62 Кб в сжатом виде и содержало около 10 тысяч строк исходного кода. Современное же ядро Linux версии 4.12.9 насчитывает более 24 млн строк кода вместе с драйверами устройств, по умолчанию включенных в ядро.
Проект стал стремительно развиваться благодаря усилиям и энтузиазму программистов, которые получили свободный доступ к исходному коду ОС. Настало время дать проекту название. Свое нынешнее имя проект Линуса получил не сразу. Изначально он назывался Freax — гибрид английских слов freak (чудак) и free (бесплатный) с окончанием X, как дань ОС UNIX, которой и вдохновлялся создатель Linux. Ари Лемке, разместивший ядро на сервере университета, назвал директорию с архивом не «freax», как просил Торвальдс, а «linux». С того момента детище Линуса и носит гордо своё имя.
По прошествии пары лет вследствие кропотливой работы на ядром новой ОС она приобрела статус полноценного некоммерческого клона своего прародителя UNIX. Выход первой официальной версии Linux состоялся в 1994 году. Она содержала все необходимые функции, включая работу с сетями. К разработке подключились еще больше программистов — система уверенно завоёвывала авторитет. В 1995 году в свет вышел товарный знак Linux, а вслед за ним, в 1996, и новая сборка Linux 2.0.
Всем известный в компьютерном мире талисман Linux-ядра, пингвин Tux, был выбран в результате голосования, состоявшегося в 1996 году. Идею именно такого изображения выдвинул сам Торвальдс. Само же имя Tux расшифровывается как Torvalds UniX.
До сегодняшнего дня консорциум не изменяет своим принципам — ОС распространяется свободно, а каждый пользователь имеет право получить доступ к исходному коду, дополнить, изменить, либо же использовать его в своих проектах. Все это возможно с условием, что модифицированный код будет также доступен любому пользователю в дальнейшем, как и оригинал. Во многом благодаря свободному распространению системой пользуются более 90 млн человек во всем мире.
Важно отметить, что в разработке системы принимают участие не только независимые разработчики, но и многие представители крупных технологических корпораций. Среди прочих можно упомянуть Intel, Red Hat, Linaro, Samsung, SUSE, IBM, Renesas, Google, AMD, Texas Instuments и ARM.
Основные моменты из истории развития ядра:
- Linux 0.0.1 — сентябрь 1991, первый публичный выпуск, поддерживающий только CPU i386 и загружающийся с дискеты;
- Linux 0.12 — январь 1992, код начал распространяться под лицензией GPLv2;
- Linux 0.95 — март 1992, обеспечена возможность запуска X Window System, реализована поддержка виртуальной памяти и раздела подкачки;
- В 1992 году появились первые дистрибутивы SLS и Yggdrasil;
- Linux 1.0 — март 1994, первый официально стабильный релиз;
- Linux 2.0 — июнь 1996 года, поддержка многопроцессорных систем;
- 1998 год: запущен первый попавший в список Top500 кластер на базе Linux, состоящий из 68 узлов с CPU Alpha;
- Linux 2.2 — январь 1999, увеличена эффективность системы управления памятью, добавлена поддержка IPv6, реализован новый межсетевой экран, представлена новая звуковая подсистема;
- Linux 2.4 — февраль 2001, обеспечена поддержка 8-процессорных систем и 64 Гб ОЗУ, файловая система Ext3, поддержка USB, ACPI;
- Linux 2.6 — декабрь 2003, поддержка SELinux, средства автоматического тюнинга параметров ядра, sysfs, переработанная система управления памятью;
- В сентябре 2008 года сформирован первый релиз платформы Android, основанной на ядре Linux;
- В июле 2011 года после 10 лет развития ветки 2.6.x осуществлён переход к нумерации 3.x.;
- В 2015 году состоялся выпуск ядра Linux 4.0;
- На момент написания статьи версия ядра 4.12.9.
По мнению большинства разработчиков, данная система оказала огромное влияние на человечество. Изначально задуманная как проект для научных исследований и конкурент тогдашнему гегемону мира операционных систем UNIX, Linux давно вышла за стены институтов и университетов. На основе этой ОС работает большинство суперкомпьютеров и дата-центров, а также создана OC Android. На Linux работают торговые биржи, банковские и корпоративные системы.
Хотелось бы пожелать операционке в этот хоть и не юбилейный день рождения дальнейших успехов и признания среди большего количества обычных пользователей. Опираясь на успехи ОС Android в мобильном мире, использующей ядро Linux, можно смело ожидать и увеличения доли на рынке десктопных систем.
Unix2019b/Ядро Linux
Разработка кода ядра была начата финским студентом Линусом Торвальдсом в 1991 году, на его имя зарегистрирована Торговая марка Linux.
Версии
- «Ванильные» (vanilla) ядра, то есть официальные ядра с сайта kernel.org без каких-либо сторонних изменений.
- Альтернативные ветки, которые могут быть взяты из различных источников. Как правило, разработчики дистрибутивов Linux поддерживают свои собственные версии ядра, например, включая в них драйверы устройств, которые ещё не включены в официальную версию.
Нумерация версий
Сначала версии нумеровались 0.01, 0.02, 0.03, . и до 1.0.
Затем начали использовать схему a.b.c (от версии 1.0 до версии 2.6). a — версия ядра, b — мажорная ревизия, c — минорная ревизия. Первое число изменялось при очень крупных переработках концепции ядра. Это было дважды в истории: в 1994 (version 1.0) и в 1996 (version 2.0). Чётность числа b определяла стабильность ядра: нечётные числа — разработческие версии, чётные числа — стабильные версии (например 1.2, 2.4 или 2.6). Минорная версия c увеличивалась при фиксах багов и при исправлениях в безопасности.
В 2004 г. после релиза 2.6.0 схема нумерации версий поменялась. Префикс 2.6 сохранялся в течение семи лет, последняя цифра увеличивалась с каждым релизом раз в два-три месяца. Иногда при срочных фиксах добавлялось четвёртое число (2.6.8.1). Чётно-нечётная схема упразднена. Разработческие версии имеют суффикс -rc.
Версия 3.0, выпущенная в 2011 г., не имела каких-то серьёзных изменений концепции. Следовала после версии 2.6.39. Считается, что Линус так решил, потому что число стало слишком большим, и чтобы заодно отметить 20-летие Linux.
Затем релизы продолжили идти по времени, но с увеличением уже второй цифры, а не третьей.
После 3.19 выпустили версию 4.0 (в 2015 г.). Затем после 4.20 вышла версия 5.0 (в марте 2019 г.). Переход к новым мажорным версиям тут не был связан с какими-то революционными изменениями. Линусу не нравятся большие номера версий. «I’m once more close to running out of fingers and toes,» говорил Торвальдс.
По состоянию на 6 апреля 2020 г. последней стабильной версией ядра является версия 5.6.2.
Разработка
Код написан в основном на C с некоторыми расширениями gcc и на ассемблере (с использованием AT&T-синтаксиса GNU Assembler). Из-за наличия нестандартных хаков долгое время С-код собирался только компилятором GCC. Большим достижением для разработчиков альтернативного компилятора Clang стало то, что в 2019 году версия Clang 9.0 смогла наконец собрать всё ядро Linux под x86-64 без дополнительных патчей.
Изначально в разработке не использовалась автоматизированная система контроля версий из-за нелюбви Линуса к таким системам. В 2002 г. начали использовать BitKeeper, но это была коммерческая система. В 2005 г. Торвальдс и команда за две недели написали новую систему контроля версий — git.
Узнать версию ядра
Архитектура ядра Linux
На сегодняшний день Linux — монолитное ядро с поддержкой загружаемых модулей. Драйверы устройств и расширения ядра обычно запускаются в 0-м кольце защиты, с полным доступом к оборудованию. Все драйверы и подсистемы работают в своем адресном пространстве, отделенном от пользовательского.
Сам термин «монолит» говорит о том, что в ядре сконцентрировано всё, и, по логике, ничего не может в него добавляться или удаляться. В отличие от обычных монолитных ядер, драйверы устройств легко собираются в виде модулей и загружаются или выгружаются во время работы системы.
То, что архитектура Linux не является микроядерной, вызвало обширнейшие прения между Торвальдсом и Эндрю Таненбаумом в конференции по Minix в 1992 году.
Файлы и форматы
vmlinux
Это статически слинкованный исполняемый файл, содержащий ядро Linux в одном из поддерживаемых форматов (ELF, COFF или a.out).
Название vmlinux сложилось исторически. Традиционно в Unix образ ядра назывался unix. Префикс vm значит Virtual Memory.
Традиционно лежит в корне ФС. «Сырой» vmlinux может быть полезен при отладке.
vmlinux.bin
Можно встретить на некоторых системах. То же самое, но без символов и информации для релокации.
vmlinuz
Образ ядра обычно сжимают. Одна из причин — экономия места на диске (актуально для embedded). На некоторых системах I/O происходит медленнее, чем декомпрессия при помощи CPU меньшего объёма прочитанных с диска сжатых данных (вероятно, неактуально для SSD). В прошлом на размер накладывались жёсткие ограничения (невозможность адресовать диск далее 1024 цилиндра при загрузке).
- gzip (до 2.6.30)
- LZMA
- bzip2
Традиционное название файла — vmlinuz.
bzImage
Это формат образа (big zImage). Был разработан для того, чтобы преодолеть ограничения на размер адресуемых данных при загрузке на разных архитектурах.
Название может ввести в заблуждение. Этот образ не обязательно сжимается при помощи bzip2, может быть и другой алгоритм.
После компиляции ядра получается файл с именем bzImage, его обычно размещают для загрузки под именем vmlinuz:
System.map
System.map — файл, внутри которого находится символьная таблица адресов функций и процедур, используемых ядром. В этой таблице перечислены имена переменных и функций и их адреса в памяти компьютера. Эта таблица весьма полезна при отладке ядра в случае Kernel panic или Linux oops. System.map генерируется при компиляции ядра.
Initial RAM Disk
Initrd (сокращение от англ. Initial RAM Disk, диск в оперативной памяти для начальной инициализации) — временная файловая система, используемая ядром Linux при начальной загрузке. Initrd обычно используется для начальной инициализации перед монтированием «настоящих» файловых систем. В Linux Kernel HOWTO (руководстве о сборке ядра) пишут, что initrd призван решить проблему курицы и яйца для модульного ядра: для монтирования файловой системы необходим модуль для работы с диском и файловой системой, а для чтения модуля необходима файловая система, с которой этот модуль читается.
Зачем нужно
Во многих дистрибутивах поставляется один образ ядра, а разнообразие железа огромно. Их все вкомпилировать в ядро нет смысла. Драйверы подключаются в виде модулей ядра.
К тому же корневая ФС может быть на томе программного RAID, LVM, даже на NFS (для бездисковых машин).
initrd
- A ramdev block device is created. It is a ram-based block device, that is a simulated hard disk that uses memory instead of physical disks.
- The initrd file is read and unzipped into the device, as if you did zcat initrd | dd of=/dev/ram0 or something similar.
- The initrd contains an image of a filesystem, so now you can mount the filesystem as usual: mount /dev/ram0 /root. Naturally, filesystems need a driver, so if you use ext2, the ext2 driver has to be compiled in-kernel.
- Done!
initramfs
В ядре Linux 2.6 появилась новая концепция загрузочного диска — он представляет собой сжатый gzip’ом cpio-архив.
cpio (copy in and out) — архиватор и формат файла, похожий на tar. Не уменьшает объём данных, просто соединяет несколько файлов в один.
- A tmpfs is mounted: mount -t tmpfs nodev /root. The tmpfs doesn’t need a driver, it is always on-kernel. No device needed, no additional drivers.
- The initramfs is uncompressed directly into this new filesystem: zcat initramfs | cpio -i, or similar.
- Done!
Посмотреть внутрь
Модули ядра
Модули хранятся в каталоге «/lib/modules/<версия ядра>» в виде файлов с расширением «ko». Для получения списка всех модулей из дерева можно выполнить команду поиска всех файлов с расширением «ko» в каталоге с модулями текущего ядра:
Более детальную информацию о модуле можно получить при помощи команды modinfo:
Загрузить модуль в ядро можно при помощи двух команд: «insmod» и «modprobe», отличающихся друг от друга возможностью просчета и удовлетворения зависимостей.
- Команда insmod загружает конкретный файл с расширением «ko», при этом, если модуль зависит от других модулей, еще не загруженных в ядро, команда выдаст ошибку, и не загрузит модуль.
- Команда modprobe работает только с деревом модулей, и возможна загрузка только оттуда по имени модуля, а не по имени файла.
Отсюда следует область применения этих команд: при помощи insmod подгружается файл модуля из произвольного места файловой системы (например, пользователь скомпилировал модули и перед переносом в дерево ядра решил проверить его работоспособность), а modprobe — для подгрузки уже готовых модулей, включенных в дерево модулей текущей версии ядра.
После загрузки модуля можно проверить его наличие в списке загруженных в ядро модулей при помощи команды lsmod:
Чтобы его выгрузить, можно воспользоваться командой rmmod или той же командой modprobe с ключом -r. В качестве параметра обоим командам нужно передать только имя модуля. Если модуль не используется, то он будет выгружен, а если используется — будет выдана ошибка, и придется выгружать все модули, которые от него зависят.
Автоматизация
В современных ядрах при подключении оборудования модули подключаются автоматически, а это событие обрабатывается демоном udev, который создает соответствующий файл устройства в каталоге /dev. Все это выполняется в том случае, если соответствующий модуль корректно установлен в дерево модулей. В случае с файловыми системами ситуация та же: при попытке монтирования файловой системы ядро подгружает необходимый модуль автоматически, и выполняет монтирование. Если необходимость в модуле не на столько очевидна, ядро его не загружает самостоятельно. Например, для поддержки функции шифрования на loop устройстве нужно вручную подгрузить модуль «cryptoloop», а для непосредственного шифрования — модуль алгоритма шифрования, например «blowfish».
Для автоматической загрузки модулей в разных дистрибутивах предусмотрены разные механизмы. B Ubuntu — редактируем файл /etc/modules [1].