Ядро операционной системы Linux

...

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

Ядро Linux— это и есть сам Linux. Это результат совместного труда (а подчас — и
предмет острых споров) многих людей во всем мире. Эта работа длится уже более
десятка лет. Каждый дистрибутив Linux, включая и дистрибутив RedHat, комплектуется собственным уже скомпилированным ядром, а также и исходным кодом этого ядра. Имея исходники, администратор получает абсолютную власть над операционной системой Linux.


Приведенная здесь информация по устранению неполадок поможет понять, что делать, если
инсталляция ядра Linuxили его компиляция проходят не так, как требуется. Большинство пользователей обнаружит, что заранее скомпилированное (дистрибутивное) ядро RedHatLinuxпригодно практически для всех их потребностей. Тем не менее возможно, что рано или поздно потребность в перекомпиляции ядра все же возникнет. Скажем, нужно будет обеспечить поддержку специфических аппаратных средств или потребуется добавить в вашу операционную систему новые возможности.


Ядро Linux.

Ядро Linux— это управляющая часть операционной системы, которую многие
называют просто Linux. Хотя многие понимают под Linuxего полный дистрибутив,
единственная часть системы, которая вправе так называться, — это ядро. RedHat
Linux, подобно многим дистрибутивам Linux, кроме ядра включает также дополнительные программы.

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


Исходные тексты ядра Linuxхранятся в группе каталогов, которые обычно называют деревом каталогов исходников ядра. Дело в том, что процесс компиляции ядра предельно автоматизирован и управляется специальными make-сценариями. Эти сценарии, или makefiles, предполагают, что необходимые им части исходного кода ядра находятся в строго определенных каталогах, в противном случае сценарии не смогут работать.

Установка исходных кодов ядра Linuxне требуется ни для нормальной работы системы, ни для
выполнения типовых задач, как-то: обработка электронной почты или работа с текстами. Однако если хочется скомпилировать новое ядро, то исходники ядра нужно будет установить. Важно правильно установить файлы исходных кодов ядра и создать необходимую символическую ссылку на них. Эта ссылка будет вести в каталог /usr/src/, в котором содержатся файлы
.config. Makefileи Rules.make.

Файл .configсодержит конфигурацию стандартного ядра Linux, заданную при его компиляции. Два других вышеупомянутых файла — это части программы make. В файле Rules.makeхранятся сценарии, которые сообщают программе make, как следует поступать с исходными текстами и связанными с ними файлами.

Этот файл редактировать нельзя. Однако можно, используя текстовый редактор, отредактировать второй файл, в частности изменить строку EXTRAVERSION(в начале файла), чтобы присвоить уникальный номер версии вашему новому ядру.

Теперь давайте рассмотрим каталоги, обнаруженные в /usr/src/linux-4.8. Наиболее
полезный для нас каталог - Documentation. В нем и его подкаталогах можно найти почти всю
документацию, касающуюся любой из частей ядра. В файле 00-INDEX(обратите внимание, что каждый из подкаталогов также содержит файл 00-INDEX) хранится список файлов данного каталога и их краткое описание. Большинство файлов документации предназначено исключительно для системных программистов (разработчиков ядра), а также разработчиков прикладных программ, но некоторые из них могут быть полезны для опытных пользователей Linux, желающих больше узнать о ядре, системном программировании и обо всем, что связано с драйверами устройств.

Вот некоторые из наиболее интересных и полезных документов этого каталога:
1) devices.txt— Это список всех возможных устройств системы, которые представлены в каталоге /dev/. В нем приведены основные и второстепенные номера устройств и дано их краткое описание.

2) ide.txt— В этом файле описывается, как ядро взаимодействует с дисками IDE. Здесь же перечислены различные команды ядра, которые могут использоваться для решения аппаратных проблем, связанных с IDE, ручной установки режимов передачи данных и других параметров ваших IDE-дисков. В основном, это управление осуществляется автоматически, но если требуется понять, как ядро взаимодействует с устройствами IDE, можно найти объяснение в этом файле.

3) initrd.txt— В этом файле представлено более детальное описание имиджа RAM-диска начальной загрузки, включая подробности об используемой для его создания и установки петлевой файловой системе, а также объяснено, как ядро взаимодействует с такими устройствами.

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

5) sysrq.txt— Если вам доводилось размышлять, для чего на клавиатуре нужна клавиша, обозначенная как SysRq, то данный файл содержит ответ на этот вопрос. Если вкратце, то клавиша SysRqпредставляет собой комбинацию клавиш, вызывающих аппаратное прерывание, поддержка которого встроена в ядро. Она может оказаться очень полезной в случае "зависания" системы и поможет восстановить ее функционирование. В RedHatLinuxэта функция по умолчанию отключена из соображений безопасности.


В других каталогах, находящихся в каталоге Documentation, размещены аналогичные текстовые файлы, посвященные модулям ядра для драйверов CD-ROM, драйверов файловой системы, игрового порта и драйверов джойстика, видеодрайверов.
(Не путайте с драйверами графических плат! Они относятся к оболочке XFree86, a
не к ядру.) Здесь есть сетевые драйверы, а также драйверы остальных подсистемам,
поддерживаемых в операционной системе Linux.

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

После того как новое ядро будет построено, все откомпилированные файлы будут автоматически
перенесены в каталог archи его подкаталоги. Утилита makeэто очень сложная программа. 

Остальные каталоги в /usr/src/linux-4.8 содержат исходные коды ядра и драйверов
ядра. В процессе установки исходных кодов ядра эти файлы помещаются туда автоматически. Если внести исправления (patch) в исходники ядра, эти файлы также автоматически изменяются. Также автоматически происходит обращение к этим файлам в процессе компиляции ядра. Рядовому пользователю, скорее всего, никогда и не потребуется модифицировать файлы исходных кодов ядра, однако они могут быть весьма полезны.

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

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


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

На заре Linuxего ядро было цельным блоком программного кода, содержащим все необходимые программы для обслуживания процессора, системной платы и других аппаратных средств. Если заменялось какое-либо периферийное оборудование, нужно было перекомпилировать код ядра, чтобы включить в него поддержку необходимого оборудования и отбросить то, в котором вы больше не нуждались.
Включение в ядро ненужного кода было непозволительной роскошью: ядро становилось слишком
большим и занимало лишнюю память. На старых системах, имеющих только 4 — 8 Мб памяти, память была драгоценной. Тратить ее на ненужные программы было недопустимо. Компилирование ядра превращалось в нечто из области черной магии, каждый пользователь Linuxпытался выжать максимум производительности из своего компьютера. Ядра, скомпилированные как цельный блок кода, называются монолитными ядрами.

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

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

В типичном ядре RedHatLinuxнекоторые драйверы скомпилированы непосредственно как часть ядра, а другие - скомпилированы в виде модулей. Только те устройства, драйверы которых были
скомпилированы в составе ядра, доступны ему в процессе загрузки системы, модульные же драйверы становятся доступны только после полной загрузки системы.

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

В процессе компиляции ядра наступает момент, когда определяется, будет ли данная подсистема
построена в виде модуля или же встроена в ядро. Это неотъемлемая часть процедуры make config.