Ядро linux

Содержание:

Откуда берётся код ядра?

Этот вопрос связан с тем, что существуют (поддерживаются и обновляются) официальные (ещё
известные как ванильные) версии кода ядра, размещённые на
[http://www.kernel.org/]. Именно эти версии считаются «эталоном» кода
ядра. Но создатели дистрибутивов (Fedora, CentOS, Debian, Ubuntu, …) вносят изменения в исходный код
ядра, которые оформляют заплатками (используя утилиты и
). Это связано с закрытием проблемных мест в безопасности, описанных
ко времени сборки дистрибутива, или включением каких-то опубликованных кодов, которые не сочли нужным
включать официальные разработчики ядра. В любом случае, возникает вопрос: какое ядро брать для сборки?
Здесь нет однозначного ответа даже у дистрибьюторов, но можно предположить следующее:

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

Для простоты понимания мы рассмотрим эти возможности в обратном порядке.

Понятие ядра операционной системы Linux.

  1. создает процессы и управляет ими
  2. распределяет и обеспечивает доступ к файлам, а также к периферийным устройствам

Взаимодействие прикладных задач с ядром происходит посредством стандартного интерфейса системных вызовов. Интерфейс системных вызовов представляет собой набор услуг ядра и определяет формат запросов на услуги. Процесс запрашивает услугу посредством системного вызова определенной процедуры ядра, внешне похожего на вызов обычной библиотечной функции . Ядро от имени процесса выполняет запрос и возвращает процессу необходимые данные.

Исходный код ядра коммерческих дистрибутивов UNIX является собственностью их разработчиков и не распространяется за пределы компании. Полностью противоположная ситуация с Linux. Процедуры для компиляции и исправления ядер и драйверов весьма различны. Для Linux и других операционных систем с открытым исходным кодом патч может быть выпущен в виде исходного кода, и конечный пользователь может установить, проверить и даже модифицировать его. Эти патчи обычно проверены не так тщательно как патчи от поставщиков коммерческих ОС UNIX. Поскольку нет полного списка приложений и сред, которые должны быть оттестированы для корректной работы на Linux, Linux-разработчики зависят от конечных пользователей и других разработчиков, которые будут отлавливать ошибки.

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

Архитектура ядра Linux

Получение исходников ядра

Самое первое что нужно сделать — это скачать исходники ядра. Исходники лучшие брать с сайта вашего дистрибутива, если они там есть или официального сайта ядра: kernel.org. Мы рассмотрим загрузку исходников с kernel.org.

Перед тем как скачивать исходники нам нужно определиться с версией ядра которую будем собирать

Есть две основных версии релизов — стабильные (stable) и кандидаты в релизы (rc), есть, конечно, еще стабильные с длительным периодом поддержки (longterm) но важно сейчас разобраться с первыми двумя. Стабильные это, как правило, не самые новые, но зато уже хорошо протестированные ядра с минимальным количеством багов

Тестовые — наоборот, самые новые, но могут содержать различные ошибки.

Итак когда определились с версией заходим на kernel.org и скачиваем нужные исходники в формате tar.xz:

В этой статье будет использована самая новая на данный момент нестабильная версия 4.4.rc7.

Получить исходники ядра Linux можно также с помощью утилиты git. Сначала создадим папку для исходников:

Для загрузки самой последней версии наберите:

Распаковка исходников ядра

Теперь у нас есть сохраненные исходники. Переходим в папку с исходниками:

Или если загружали ядро linux с помощью браузера, то сначала создадим эту папку и скопируем в нее архив:

Распаковываем архив с помощью утилиты tar:

И переходим в папку с распакованным ядром, у меня это:

Оценка стоимости разработки с нуля

Стоимость переразработки ядра Linux версии 2.6.0 способами, принятыми для разработки проприетарного ПО, была оценена в 612 млн долл. США (467 млн евро) в ценах 2004 года с использованием модели оценки человеко-месяцев COCOMO. В 2006 году исследование, профинансированное Евросоюзом, подняло стоимость разработки ядра Linux до уровня 882 млн евро (1,09 млрд долл. США).

Эта тема была снова поднята в октябре 2008 г. Амандой МакФерсон, Брайаном Проффиттом и Роном Хейл-Эвансом. Используя методологию Дэвида Э. Вилера, они оценили разработку ядра 2.6.25 в 1,3 млрд долл. США (часть от 10,8 млрд долл. США переразработки Fedora 9). Также Гарсиа-Гарсиа и Алонсо де Магдалено из университета Овьедо (Испания) оценили ежегодный прирост стоимости ядра приблизительно в 100 млн евро с 2005 по 2007 гг. и 225 млн евро в 2008 г. Совокупная стоимость разработки в Евросоюзе в 2009 году оценена в более чем 1 млрд евро (около 1,23 млрд долл. США).

Processor type and features

Поддержка симметричной мультипроцессорности. Включается в случае, если у вас
многопроцессорный компьютер или многоядерный процессор.

Для старых систем SMP, которые не имеют надлежащей поддержки ACPI.

Поддержка платформ, отличных от PC.

Поддержка паравиртуализации (например, для Xen).

Следует выбрать тип своего процессора. Если не знаете или рассчитываете использовать созданную конфигурацию ядра на разных машинах, отмечайте Generic.

Включение технологии Hyperthreading.

Для процессоров Intel Core, AMD Athlon64/Phenom.

Для поддержки UEFI. В данном примере она отключена.

Автоматическая настройка сборки ядра Linux

Перед тем как начнется сборка ядра linux, нам придется его настроить. Как я и говорил, сначала рассмотрим автоматический вариант настройки сборки ядра. В вашей системе уже есть собранное, настроенное производителем дистрибутива, и полностью рабочее ядро. Если вы не хотите разбираться с тонкостями конфигурации ядра, можно просто извлечь уже готовые настройки старого ядра и сгенерировать на их основе настройки для нового. Нам придется лишь указать значения для новых параметров. Учитывая, что в последних версиях не было и не намечается серьезных изменений можно отвечать на все эти параметры как предлагает скрипт настройки.

Параметры используемого ядра хранятся в архиве по адресу /proc/config.gz. Распакуем конфиг и поместим его в нашу папку утилитой zcat:

А дальше запускаем скрипт адаптации настроек:

В процессе его работы нужно будет ответить на несколько вопросов. Это новые параметры, которые изменились или были добавлены в новое ядро и поддержка нового оборудования, в большинстве случаев можно выбирать вариант по умолчанию. Обычно есть три варианта y — включить, n — не включать, m — включить в качестве модуля. Рекомендованный вариант написан с большой буквы, для его выбора просто нажмите Enter.

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

Вступление или подготовка к сборке ядра

Для сборки можно использовать ядро с kernel.org.
Если вам удобнее собрать ядро, поставляемое с вашим дистрибутивом, вы можете
смело пропустить этот шаг.

Пройдите по указанной выше ссылке и скачайте ядро .
Должен скачаться файл примерно с таким наименованием: .

Помимо этого, иногда вам может понадобиться поставить заплатки для ядра. Если
вы не знаете, что это, значит оно вам и не нужно. Хотя мы рассмотрим процесс
наложения заплаток для полноты картины. Получить их можно всё на том же сайте.

Рекомендация по собственно сборке ядра одна на все дистрибутивы, что естественно.
А вот инструмент для сборки вполне возможно, что придётся доустановить.
Для gentoo это пакет (если предполагается сборка дистрибутивного
ядра). Для дебиана понадобится установить
целую пачку пакетов,
для арча понадобится эта инструкция.

Перед сборкой неплохо сесть и подумать какое же ядро собрать. Ядро может быть:

— монолитным

такое ядро полностью грузится при старте системы и остаётся в оперативной памяти
до выключения машины. Его компоненты нельзя изменить, невозможно подгружать и
выгружать модули благодаря чему ядро становится нечувствительным к различным
троянским программам, направленным на подмену оригинальных модулей своими — это
просто невозможно. Но с другой стороны монолитность ядра привносит и некоторые минусы,
такие как невозможность установить стороннюю прошивку или проприетарный драйвер для
видеокарты (ведь его модуль нельзя будет подгрузить!). То есть для домашних машин
лучше не использовать монолитные ядра, а вот для серверов — самое оно.

— модульным

это ядро напротив позволит включать многие компоненты не жёстко, а модульно
(соответственно своему названию), что уменьшит размер ядра и сделает возможным…
да, загрузку и выгрузку нужных модулей. В готовых дистрибутивах для создания такого
ядра используется initramfs (раньше — initrd). Но при сборке под себя можно обойтись
и без него, достаточно лишь жёстко встроить поддержку файловой системы и контроллёра
HD корневого раздела для того, чтобы система смогла определить их и загрузиться.

Это интересно

в чём разница между initrd и initramfs прочитать.

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

Итак, вы скачали ядро и заплатки. Переместите их в каталог и
сами перейдите в него. Теперь следует распаковать исходники ядра и архивы с заплатками, наложить
заплатки:

При наложении заплаток есть лишь один нюанс: сначала накладывается заплатка
для обновления версии ядра ( как дано выше) и уже затем
все остальные.

Обратите внимание на вывод команды. Если заплатка идеально подходит к
ядру, то в выводе должны быть только строчки .
Строка означает что заплатка наложена успешно,
но место наложения сдвинуто на несколько строк

Если же вы увидите
слово — заплатка не подходит. Лучше удалить каталог
и начать все сначала уже без этой заплатки.

Далее могут выполнены следующие команды:

  • — очистит каталог от мусора предыдущей сборки
  • — запустит окно настроек ядра
  • — опция включена жёстко
  • — опция включена модульно
  • — опция отключена

Вы можете воспользоваться поиском по параметрам ядра, для этого
нажмите (слеш) и введите искомое. Также не забывайте о справке:
остановитесь на параметре, подробное описание которого вам хотелось бы видеть,
и выбирайте внизу экрана.

Что такое ядро операционной системы

Ядро является главной частью любой операционной системы. Существует точка зрения, которая понятие операционной системы приравнивает к ядру. Есть точка зрения, когда в понятие операционной системы включают как ее ядро, так и системные программы, позволяющие пользователю обращаться через ядро к аппаратным ресурсам.

Так что же такое ядро ОС и каковы его функции? Как известно, компьютер – не только система аппаратного обеспечения (железа), но и набор работающего на нем программного обеспечения. Чтобы второе могло эффективно работать на первом, нужна более низкоуровневая программа, скрывающая сложности работы с железом и предоставляющая обычным программам и пользователям удобный для них интерфейс.

Железо говорит на языке сигналов, регистров, секторов, переводов головок. Программам все это не надо. Они говорят на языке «записать, прочитать, сложить, вычесть …». Специальной программой, обеспечивающей остальным простой и понятный интерфейс для работы на имеющемся оборудовании, является ядро операционной системы. Однако создание виртуальной машины – не единственная функция ядра.

Представим себе, что ядра нет, а каждая запущенная программа сама обращается к железу и обрабатывает сигналы от него. Вроде бы ничего страшного, кроме дублирования кода в каждой такой программе. Но на компьютере одновременно работает множество программ. Как они будут «договариваться» между собой о совместном использовании общего аппаратного обеспечения?

Конечно, они могут встать в очередь, и сначала одна программа выполнится полностью, затем другая. Однако одни программы должны работать постоянно в фоновом режиме, другие – могут долго ожидать ввода или вывода, третьи – должны получать данные из другой работающей программы. Поэтому функция оптимального распределения аппаратных ресурсов возлагается на ядро. Оно организует как бы параллельную работу множества программ, играет роль менеджера.

Ядро операционной системы – это тоже программа, написанная на том или ином языке программирования и скомпилированная в исполняемый файл. Однако, в отличии от других программ, ядро всегда загружается первым и потом постоянно «сидит» в определенной области оперативной памяти. То есть это программа, которая всегда находится в запущенном состоянии и взаимодействует, с одной стороны, с железом, а с другой – с системными и пользовательскими программами.

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

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

Резюме

Подведу маленький итог написанному. Скажу сразу, что загрузиться с переконфигурированного ядра мне удалось раза с пятого:) Посему — пробуйте, экспериментируйте! VirtualBox вам в помощь:)

По моему мнению, указанную в статье процедуру целесообразно выполнять либо при необходимости выиграть несколько мегабайт свободной памяти, либо добавить необходимые модули/драйвера (конечно, можно и другие причины придумать, например для экспериментов ). При этом, в первом случае, сборка ядра растягивается на неопределенный промежуток времени и неопределенное количество попыток сборки и перезагрузки для того чтобы получить «идеально» оптимизированное под железо и заточенное под себя ядро. Во втором случае, сборка ядра сводится к нескольким шагам: 1. получение исходников, 2. подготовка ядра к компиляции, 2.1 выполнение make cloneconfig перед make menuconfig для копирования текущих настроек ядра, 3. Выполнение make menuconfig или другой цели для конфигурирования и добавления новых параметров, 4. Компиляция и установка по вышеуказанной инструкции.

Итак, сборка и настройка индивидуального ядра состоит из нескольких этапов: 1. получение исходников ядра, 2. Конфигурирование ядра, 3. Сборка (компиляция) ядра, 4. Установка ядра. первый этап — это команда wget, второй — make menuconfig, третий — make. Вот так

Буду рад Вашим комментариям.

upd 2010.01.15: добавил новую цель — make nconfig (спасибо S_paul за коммент)

Заключение

Мы только что собрали полностью новое ядро Linux, и теперь можем работать с новой, обновлённой до
последней версии, операционной системой Linux. Означает ли это, что такими последовательными
обновлениями можно поддерживать систему в самом свежем состоянии, адекватном новым дистрибутивам?
К сожалению, нет, так как хотя мы обновляем ядро и его модули (драйвера), но версии всех утилит,
библиотек, компиляторов и всего прочего остаются устаревшими. Кроме того, через некоторое время
начнут возникать проблемы с устареванием репозитариев, указанных в пакетной системе для поиска
обновлений программ. Отсрочить эту проблему можно, если аккуратно подредактировать вручную ссылки
на репозитарии в каталоге /etc/yum.repos.d, но это совсем другая история.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *