...
#ifdef CONFIG_FOO
foo();
#endif
...
Вместо этого, если макрос CONFIG_FOO
не определен, необходимо определять функцию foo()
, как ту, которая ничего не делает.
#ifdef CONFIG_FOO
static int foo(void)
{
/* ... */
}
#else
static inline int foo(void) { }
#endif
После этого можно вызывать функцию foo()
без всяких условий. Пусть компилятор поработает за вас.
Инициализация структур
Структуры необходимо инициализировать, используя метки полей. Это позволяет предотвратить некорректную инициализацию при изменении структур. Это также позволяет выполнять инициализацию не всех полей. К сожалению, в стандарте C99 принят довольно "страшненький" формат меток полей, а в компиляторе gcc ранее использовавшийся формат меток полей в стиле GNU признан устаревшим. Следовательно, для кода ядра необходимо использовать новый формат, согласно стандарту C99, каким бы ужасным он ни был.
struct foo my_foo = {
.a = INITIAL_A,
.b = INITIAL_B,
};
где а
и b
— это поля структуры struct foo
, а параметры INITIAL_A
и INITIAL_B
— соответственно, их начальные значения. Если поле не указано при инициализации, то оно устанавливается в свое начальное значение, согласно стандарту ANSI С (указателям присваивается значение NULL
, целочисленным полям — нулевое значение, а полям с плавающей точкой— значение 0.0). Например, если структура struct foo
также имеет поле int с
, то это поле в предыдущем примере будет инициализировано в значение 0.
Да, это ужасно. Но у нас нет другого выбора.
Исправление ранее написанного кода
Если в ваши руки попал код, который даже близко не соответствует стилю написания кода ядра Linux, то все равно не стоит терять надежды. Немного упорства, и утилита indent
поможет сделать все как надо. Программа indent
— отличная утилита GNU, которая включена во многие поставки ОС Linux и предназначена для форматирования исходного кода в соответствии с заданными правилами. Установки по умолчанию соответствуют стилю форматирования GNU, который выглядит не очень красиво. Для того чтобы утилита выполняла форматирование в соответствии со стилем написания кода ядра Linux, необходимо использовать следующие параметры.
indent -kr -i8 -ts8 -sob -180 -ss -bs -psl <файл>
Можно также использовать сценарий scripts/Lindent
, который вызывает утилиту indent
с необходимыми параметрами.
Организация команды разработчиков
Разработчики — это хакеры, которые занимаются развитием ядра Linux. Некоторые делают это за деньги, для некоторых это хобби, но практически все делают это с удовольствием. Разработчики ядра, которые внесли существенный вклад, перечислены в файле CREDITS
, который находится в корневом каталоге дерева исходных кодов ядра.
Для различных частей ядра выбираются MAINTAINERS
. Этот файл тоже находится в корневом каталоге дерева исходных кодов.
Среди ответственных разработчиков существует специальный человек, который отвечает за все ядро в целом (kernel maintainer). Исторически, Линус отвечает за разрабатываемую серию ядер (где наиболее интересно) и за первые выпуски стабильной версии ядра. Вскоре после того как ядро становится стабильным, Линус передает бразды правления одному из ведущих разработчиков. Они продолжают поддержку стабильной серии ядра, а Линус начинает работу над новой разрабатываемой серией. Таким образом, серии ядер 2.0, 2.4 и 2.6 все еще активно поддерживаются.
Несмотря на слухи, здесь нет
Отправка сообщений об ошибках
Если вы обнаружили ошибку, то наилучшим решением будет исправить ее, сгенерировать соответствующую заплату, оттестировать и отправить, как это будет рассказано в следующих разделах. Конечно, можно и просто сообщить об ошибке, чтобы кто-нибудь исправил ее для вас.
Наиболее важная часть сообщения об ошибке — это полное описание проблемы. Необходимо описать симптомы, системные сообщения и декодированное сообщение oops (если такое есть). Еще более важно, чтобы вы смогли пошагово описать, как устойчиво воспроизвести проблему, и кратко описать особенности вашего аппаратного обеспечения.