Разработка ядра Linux - [173]

Шрифт
Интервал

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

Функция >printk()

Функция форматированного вывода сообщений >printk() работает аналогично библиотечной функции >printf() языка С. Действительно в этой книге до этого момента мы не видели никаких существенных отличий в ее использовании. Для большинства задач это именно так: функция >printk() — это просто функция ядра, выполняющая форматированный вывод сообщений. Однако, некоторые различия все же имеются.

Устойчивость функции >printk()

Одно из проверенных и часто используемых свойств функции >printk() — это ее устойчивость. Функцию >printk() можно вызывать практически в любое время и в любом месте ядра. Её можно вызывать из контекста прерывания и из контекста процесса. Её можно вызывать во время удержания блокировки. Её можно вызывать одновременно на нескольких процессорах и она не требует при этом удерживать какие-нибудь блокировки.

Эта функция очень устойчива, и это очень важно, потому что полезность функции >printk() базируется на том факте, что она всегда доступна и всегда работает.

Неустойчивость функции >printk()

Слабое место у функции >printk() в плане устойчивости все же существует. Её нельзя использовать до некоторого момента при загрузки ядра, пока консоль еще не инициализирована. Действительно, если нет консоли, то куда будут выводится сообщения?

Обычно это не проблема, если не нужно выполнять отладку кода, который выполняется на очень ранних стадиях процесса загрузки (например, функции >setup_arch(), которая выполняет инициализацию специфичную для аппаратной платформы). Отладка такого рода — настоящая задача: отсутствие каких-либо способов вывода сообщений, а только проблема в полном составе.

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

Одно из решений проблемы — вариант функции >printk(), который может выводить информацию на консоль на очень ранних стадиях процесса загрузки — >early_printk(). Поведение этой функции аналогично функции >printk(), за исключением имени и возможности работать на очень ранних стадиях загрузки. Однако, такое решение не переносимо, потому что не для всех поддерживаемых аппаратных платформ этот метод работы реализован. Если же он есть, то может сослужить хорошую службу.

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

Уровни вывода сообщений ядра

Главное отличие между функциями >printk() и >printf() — это возможность в первой указывать уровень вывода сообщений ядра (loglevel). Ядро использует уровень вывода сообщений для принятия решения о том, выводить сообщение на консоль или нет. Ядро выводит на консоль все сообщение с уровнями меньшими, или равными, соответствующему значению для консоли (console loglevel). Уровень вывода сообщений можно указывать следующим образом.

>printk(KERN_WARNING "Это предупреждение!\n");

>printk(KERN_DEBUG "Это отладочное сообщение!\n");

>printk("Мы не указали значения loglevel!\n");

Строки >KERN_WARNING и >KERN_DEBUG определены через препроцессор в заголовочном файле >. Эти макросы раскрываются в строки, соответственно >"<4>" и >"<7>", которые объединяются со строкой формата в самом начале сообщения, выводимого функцией >printk(). После этого на основании уровня вывода сообщения и уровня вывода консоли (значение переменной >console_loglevel) ядро принимает решение выводить информацию на консоль или нет. В табл. 18.1 приведен полный список возможных значений уровня вывода сообщений.


Таблица 18.1. Доступные значения уровня вывода сообщений ядра (loglevel)

Значение loglevelОписание
>KERN_EMERGАварийная ситуация
>KERN_ALERTПроблема, на которую требуется немедленно обратить внимание
>KERN_CRITКритическая ситуация
>KERN_ERRОшибка
>KERN_WARNINGПредупреждение
>KERN_NOTICEОбычная ситуация, но на которую следует обратить внимание
>KERN_INFOИнформационное сообщение
>KERN_DEBUGОтладочное сообщение — обычно избыточная информация

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


Рекомендуем почитать
Сборник тестов: 1500 вопросов и ответов на знание Android

Книга содержит 30 тестов по 50 вопросов с ответами на знание Android. Книга предназначена для подготовки к экзаменам и собеседованиям.


Погружение в Salix

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


Домены. Все, что нужно знать о ключевом элементе Интернета

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


Хитрости Windows 7: для профессионалов

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


Ubuntu Linux: базовый курс

Если вы читаете эту книгу, значит вы подумываете о том, как бы поставить и попробовать Ubuntu. Наверняка, вы не захотите сразу отказываться от Windows и поставите Ubuntu, как вторую ОС (операционную систему).Возможно, вы как и я долго метались от дистрибутива к дистрибутиву и решали, какой же установить. Уверяю вас, вы сделали правильный выбор. Данная книга проведёт небольшую, но базовую экскурсию на тему установки и настройки.Я уверен, что вы найдёте эту книгу интересной для себя. Если у вас возникают какие-либо вопросы, я могу осветить их в новой версии этой книги.


Документация NetAMS

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