Разработка ядра Linux
Шрифт:
Уменьшение количества выводимых сообщений
Для того чтобы уменьшить шум, связанный с сообщениями, которые выдаются во время сборки, но в то же время видеть предупреждения и сообщения об ошибках, можно использовать такую хитрость, как перенаправление стандартного вывода команды
Если вдруг окажется необходимым просмотреть выводимые сообщения, можно воспользоваться соответствующим файлом. Но обычно, если предупреждения или сообщения об ошибках выводятся на экран, в этом нет
На самом деле я выполняю следующую команду
что позволяет совсем избавиться от ненужных сообщений.
Параллельная сборка
Программа
По умолчанию утилита
где n — количество заданий, которые необходимо запустить.
Обычно запускается один или два процесса на процессор. Например, на двухпроцессорной машине можно использовать следующий запуск.
Используя такие отличные утилиты, как
Инсталляция ядра
После того как ядро собрано, его необходимо инсталлировать. Процесс инсталляции существенно зависит от платформы и типа системного загрузчика. Для того чтобы узнать, в какой каталог должен быть скопирован образ ядра и как установить его для загрузки, необходимо обратиться к руководству по используемому системному загрузчику. На случай если новое ядро будет иметь проблемы с работоспособностью, всегда следует сохранить одну или две копии старых ядер, которые гарантированно работоспособны!
Например, для платформы x86, при использовании системного загрузчика grub можно скопировать загружаемый образ ядра из файла
Инсталляция модулей ядра автоматизирована и не зависит от аппаратной платформы. Просто нужно запустить следующую команду с правами пользователя root.
В процессе компиляции в корневом каталоге дерева исходного кода ядра также создается файл
"Зверек другого рода"
Ядро имеет некоторые отличия в сравнении с обычными пользовательскими приложениями, эти отличия хотя и не обязательно приводят к серьезным усложнениям при программировании, но все же создают специфические проблемы при разработке ядра.
Эти отличия делают ядро зверьком другого рода. Некоторые из старых правил при этом остаются в силе, а некоторые правила являются полностью новыми. Хотя часть различий очевидна (все знают, что ядро может делать все, что пожелает), другие различия не так очевидны. Наиболее важные отличия описаны ниже.
• Ядро не имеет доступа к библиотеке функций языка С.
• Ядро программируется с использованием компилятора GNU С.
• В ядре нет такой защиты памяти, как в режиме пользователя.
• В ядре нельзя легко использовать вычисления с плавающей точкой.
• Ядро использует стек небольшого фиксированного размера.
• Поскольку в ядре используются асинхронные прерывания, ядро является преемптивным и в ядре имеется поддержка SMP, то в ядре необходимо учитывать наличие параллелизма и использовать синхронизацию.
• Переносимость очень важна.
Давайте рассмотрим более детально все эти проблемы, так как все разработчики ядра должны постоянно помнить о них.
Отсутствие библиотеки
В отличие от обычных пользовательских приложений, ядро не компонуется со стандартной библиотекой функций языка С (и ни с какой другой библиотекой такого же типа). Для этого есть несколько причин, включая некоторые ситуации с дилеммой о курице и яйце, однако первопричина — скорость выполнения и объем кода. Полная библиотека функций языка С, и даже только самая необходимая ее часть, очень большая и неэффективная для ядра.
При этом не нужно расстраиваться, так как многие из функций библиотеки языка С реализованы в ядре. Например, обычные функции работы со строками описаны в файле
Заметим, что упомянутые заголовочные файлы и заголовочные файлы, которые будут упоминаться далее в этой книге, принадлежат дереву исходного кода ядра. В файлах исходного кода ядра нельзя подключать заголовочные файлы извне этого дерева каталогов, так же как и нельзя использовать внешние библиотеки,
Отсутствует наиболее известная функция