Главная » Ядро Linux » Сборка ядра

0

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

Таблица 2.1 . Каталоги в корне дерева исходных кодов ядра

Каталог                                  Описание

arch crypto Documentation drivers

fs

include init

ipc

kernel lib

mm net scripts security sound

usr

Специфичный для аппаратной платформы  исходный  код

Криптографический API Документация исходного кода ядра Драйверы устройств

Подсистема VFS и отдельные файловые системы

Заголовочные файлы ядра

Загрузка и инициалиэация ядра

Код межпроцессного взаимодействия Основные  подсистемы, такие как планировщик Вспомогательные подпрограммы

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

Сетевая подсистема Сценарии  компиляции ядра Модуль безопасности Linux Звуковая подсистема

Начальный код пространства пользователя  (initramfs)

Так как доступен  исходный  код ядра Linux, то, это означает,  что есть возможность сконфигурировать ядро перед компиляцией. Есть возможность  скомпилировать  поддержку только  необходимых  драйверов  и  функций.  Конфигурация ядра— необходимый этап перед тем, как его компилировать.  Поскольку  в ядре бесчисленное  количество функций  и вариантов  поддерживаемого  аппаратного  обеспечения,  возможностей по конфигурации, мягко говоря, много. Конфигурация управляется с помощью  опций конфигурации в виде CONFIG_FEATURE. Например,  поддержка симметричной  многопроцессорной  обработки  (Symmetric  multiprocessing,  SMP)  устанавливается  с  помощью опции  CONFIG  SMP.  Если этот параметр  установлен,  то поддержка  функций SMP  включена.  Если  этот параметр  не установлен,  то функции  поддержки  SMP  отключены.  Все конфигурационные параметры  хранятся  в файле  .confi g в корневом каталоге  дерева исходного  кода  ядра  и устанавливаются  одной  из  конфигурационных программ,  например,  с помощью  команды  make    xconfig . Конфигурационные параметры  используются  как для определения   того, какие  файлы должны быть скомпилированы  во время  сборки ядра,  так и для управления  процессом  компиляции через директивы  препроцессора.

Конфигурационные переменные  бывают двух видов:  логические  (boolean) и переменные  с тремя  состояниями   (instate).  Логические  переменные  могут принимать значения  yes и  по. Такие  переменные  конфигурации ядра,  как  CONFIG_PREEMPT, обычно  являются  логическими.  Конфигурационная переменная  с тремя состояниями  может  принимать  значения  yes,  no и  module .  Значение  module  отвечает  конфигурационному   параметру,  который  установлен,   но  соответствующий  код  должен компилироваться как  модуль (т.е.  как  отдельный  объект,  который  загружается  динамически).  Драйверы  устройств  обычно  представляются  конфигурационными  переменными  с тремя состояниями.

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

Ядра, которые включаются в поставки ОС  Linux такими производителями, как Novell  и Redhat, компилируются как  часть дистрибутива. В таких ядрах обычно  имеется  большой набор  различных функций и практически полный набор  всех драйверов  устройств   в виде  загружаемых модулей.   Это  позволяет получить  хорошее базовое  ядро и поддержку широкого диапазона оборудования. К сожалению, как разработчикам ядра, вам  потребуется компилировать свои  ядра  и самим  разбираться, какие  модули  включать, а какие  нет.

В ядре поддерживается несколько инструментов, которые позволяют выполнять конфигурацию. Наиболее простой инструмент — это текстовая утилита  командной строки:

make config

Эта утилита  просматривает все параметры один  за другим  и интерактивно запрашивает  у пользователя, какое  значение соответствующего параметра установить — yes,  no или  module  {для переменной с тремя  состояниями). Эта операция требует длительного времени, и если у вас не почасовая оплата, то лучше использовать утилиту на основе интерфейса ncurses:

make menuconfig

или  графическую утилиту на основе  системы X11:

make xconfig

или еще более удобную  графическую утилиту, основанную на библиотеке gtk+

make gconfig

Эти  утилиты  позволяют разделить  все  параметры по  категориям, таким  как Processor  Features (Свойства процессора) и Network  Devices  (Сетевые устройства). Пользователи могут перемещаться по категориям и, конечно, изменять значения конфигурационных параметров. Команда

$ make defconfig

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

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

ционный файл  или  при  использовании  существующего конфигурационного  файла для  нового  дерева  каталогов исходного кода  ядра,  необходимо активизировать и  обновить конфигурацию с помощью команды:

make oldconfig

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

make

В отличие от  предыдущих  серий   ядер,  в  версии 2.6  больше   нет  необходимости выполнять команду make     dep  перед  сборкой ядра, так  как  создание дерева  зависимостей   выполняется  автоматически. Также  не  нужно  указывать цель  сборки, например  bzlmage,  как  это  было  необходимо для  более  ранних версий. Правило, записанное  в файле   с  именем Makefile , которое используется по  умолчанию,  в состоянии обработать  все!

Уменьшение  количества  выводимых сообщений

Для  того чтобы  уменьшить шум, связанный с сообщениями, которые выдаются во время  сборки, но  в то  же  время  видеть  предупреждения и  сообщения об  ошибках, можно использовать такую  хитрость, как  перенаправление стандартного вывода   команды  make  (1) :

make > "имя_некоторого_файла"

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

На  самом  деле  я  выполняю следующую команду

make > /dev/null,

что  позволяет совсем  избавиться от  ненужных сообщений.

Параллельная  сборка

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

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

$ make -jn

где n — количество заданий,  которые необходимо запустить.

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

$ make -j4

Используя такие  отличные утилиты, как  distc c (1)   и  ccache(l) , можно еще  более существенно уменьшить время  компиляции ядра.

Инсталляция ядра

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

Например, для  платформы  x86, при  использовании  системного загрузчика gru b можно  скопировать  загружаемый образ  ядра  из  файла   arch/i386/boot/bzlmag e  в каталог   /boo t  и  отредактировать файл   /etc/grub/grub.con f для  указания записи, которая соответствует новому  ядру.  В системах, где для  загрузки используется загрузчик  LILO,  необходимо соответственно отредактировать файл   /etc/lilo.con f и запустить утилиту lil o (8) .

Инсталляция модулей   ядра  автоматизирована и  не  зависит от  аппаратной платформы. Просто нужно  запустить следующую команду с правами пользователя root.

$ make modules_install

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

Источник: Лав,  Роберт. Разработка ядра  Linux, 2-е  издание. : Пер.  с англ.  — М.  : ООО  «И.Д.  Вильяме» 2006. — 448 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии