<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="http://wiki2.linuxformat.ru/skins/common/feed.css?97"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title>LXF129:kernelhack - История изменений</title>
		<link>http://wiki2.linuxformat.ru/index.php?title=LXF129:kernelhack&amp;action=history</link>
		<description>История изменений этой страницы в вики</description>
		<language>ru</language>
		<generator>MediaWiki 1.11.1</generator>
		<lastBuildDate>Wed, 13 May 2026 23:34:18 GMT</lastBuildDate>
		<item>
			<title>Crazy Rebel: викификация, оформление</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF129:kernelhack&amp;diff=11761&amp;oldid=prev</link>
			<description>&lt;p&gt;викификация, оформление&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая статья&lt;/b&gt;&lt;/p&gt;&lt;div&gt;: Вскрываем ядро&lt;br /&gt;
&lt;br /&gt;
==ЯДРО ЖДЕТ ПОМОЩИ ОТ ТЕБЯ==&lt;br /&gt;
&lt;br /&gt;
: А ТЫ записался в армию Linux? Командир ядра '''Грег Кроа-Хартман''' проведет курс молодого бойца...&lt;br /&gt;
&lt;br /&gt;
Чтобы влезть в ядро, не нужны степень в компьютерных науках и годы опыта. Безусловно, лишними они не будут, но природа разработки Linux означает его открытость для всех по умолчанию. Все, что вам нужно — это серьезно им заняться. Вы используете ядро Linux в той или иной форме каждый день; разве вы не почувствуете хоть каплю гордости, если сумеете помочь в работе над ним, независимо от величины вклада?&lt;br /&gt;
&lt;br /&gt;
Но если все прекрасно работает, что тогда исправлять?.. Не отчаивайтесь: разработчики ядра Linux рады любой помощи, и в дереве исходников хватает кода, ожидающего пересмотра. Один из примеров – ветка '''drivers/staging/''': она содержит кучу драйверов, не удовлетворяющих стандартам ядра. Драйверы поместили сюда, чтобы другие разработчики могли помочь привести их в порядок для дальнейшего включения в основную часть дерева ядра Linux.&lt;br /&gt;
&lt;br /&gt;
Каждый драйвер в директории '''drivers/staging/''' содержит в файле '''TODO''' список вещей, которые надо сделать, чтобы код мог переместиться в основную ветку ядра. Большинство драйверов содержат в своем '''TODO''' строчку&lt;br /&gt;
&lt;br /&gt;
 - fix checkpatch.pl issues&lt;br /&gt;
&lt;br /&gt;
Разберемся, что это означает и что тут можно сделать. Каждый объемный проект нуждается в выработке единого стиля кодирования, для выживаемости при совместной работе множества программистов. Мечта (и задача) любого разработчика ядра Linux – привлечь других к помощи по поиску проблем в своем коде, и хранение кода в общепринятом формате позволяет всем легко брать его, модифицировать и отмечать ошибки. Так как каждая строчка до ее включения в код ядра просматривается как минимум двумя разработчиками, важно придерживаться выработанного стиля.&lt;br /&gt;
&lt;br /&gt;
Стиль кодирования ядра Linux описан в файле '''Documentation/CodingStyle''' дерева исходных текстов. При его чтении важно помнить, что данный стиль не то что лучше других, но он логичен. Проверкой стиля занимается специальный скрипт '''scripts/checkpatch.pl''' в исходных кодах дерева ядра: он позволяет быстро выявить отклонения. Разработчик должен запускать его при внесении изменений, чтобы избавить рецензирующего от траты времени на указание проблем, подлежащих исправлению.&lt;br /&gt;
&lt;br /&gt;
===Из малого желудя...===&lt;br /&gt;
&lt;br /&gt;
Одно из лучших руководств по ''Git'' поставляется с самим ''Git''. Вы можете прочитать его, запустив&lt;br /&gt;
&lt;br /&gt;
 $ man gittutorial&lt;br /&gt;
&lt;br /&gt;
после того, как установите ''Git'' на свой ПК.&lt;br /&gt;
&lt;br /&gt;
Итак, запустите и установите ''Git'' на вашу Linux-систему, используя свой любимый менеджер пакетов, затем выполните клонирование основного репозитория ядра Linux:&lt;br /&gt;
&lt;br /&gt;
 $ mkdir ~/linux&lt;br /&gt;
 $ cd ~/linux&lt;br /&gt;
 $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git&lt;br /&gt;
&lt;br /&gt;
Внутри директории '''linux/''' должна создаться поддиректория '''linux-2.6'''. Все, чем мы с вами займемся, будет происходить в данном каталоге, поэтому для начала перейдем в него:&lt;br /&gt;
&lt;br /&gt;
 $ cd ~/linux/linux-2.6&lt;br /&gt;
&lt;br /&gt;
Теперь, имея сырой исходный код, как собрать его и установить его в вашу систему? Это более объемная задача, выходящая за рамки этой статьи. К счастью, на эту тему есть книга '''Linux Kernel in a Nutshell''', ее можно найти в свободном доступе онлайн на http://www.kroah.com/lkn/.&lt;br /&gt;
&lt;br /&gt;
===Задание правил===&lt;br /&gt;
&lt;br /&gt;
Рассмотрим некоторые правила, входящие в требования по стилю. Первое правило велит всем использовать для отступа в коде табуляцию, а не пробелы. Принятая длина табуляции – восемь символов. Вместе с этими восемью длина строки кода не должна превышать 80 символов, чтобы она умещалась до правого края экрана.&lt;br /&gt;
&lt;br /&gt;
Ограничение в 80 символов стало стеснять многих разработчиков, и есть некоторые места, где разрешается за него выйти. Если вы обнаружите, что вам приходится нелепо загибать строки просто ради попадания в 80-символьный размер и весь ваш код теснится у правой части экрана, лучше сначала реформировать логику, чтобы этого избежать.&lt;br /&gt;
&lt;br /&gt;
Требование лимита также принуждает разработчиков разбивать логику своего кода на небольшие, простые для понимания куски, которые легко проверять и которым легко следовать. Так что в этом безумном 80-символьном лимите есть своя метода.&lt;br /&gt;
&lt;br /&gt;
===checkpatch.pl===&lt;br /&gt;
&lt;br /&gt;
Руководствуясь этими несложными правилами пробелов и фигурных скобок, давайте запустим скрипт '''checkpatch.pl''' на каком-нибудь коде и посмотрим, что он нам выдаст:&lt;br /&gt;
&lt;br /&gt;
 $ ./scripts/checkpatch.pl --help&lt;br /&gt;
 Usage: checkpatch.pl [OPTION]... [FILE]...&lt;br /&gt;
 Version: 0.30&lt;br /&gt;
 Options:&lt;br /&gt;
 -q, --quietquiet&lt;br /&gt;
 --no-tree	 run without a kernel tree&lt;br /&gt;
 --no-signoff	 do not check for ‘Signed-off-by’ line&lt;br /&gt;
 --patch		 treat FILE as patchfile (default)&lt;br /&gt;
 --emacs	 emacs compile window format&lt;br /&gt;
 --terse		 one line per report&lt;br /&gt;
 -f, --file	 treat FILE as regular source file&lt;br /&gt;
 --subjective, --strict enable more subjective tests&lt;br /&gt;
 --root=PATH	 PATH to the kernel tree root&lt;br /&gt;
 --no-summary	 suppress the per-file summary&lt;br /&gt;
 --mailback	 only produce a report in case of&lt;br /&gt;
 warnings/errors&lt;br /&gt;
 --summary-file	 include the filename in summary&lt;br /&gt;
 --debug KEY=[0|1] turn on/off debugging of KEY, where&lt;br /&gt;
 KEY is one of ‘values’, ‘possible’, ‘type’, and ‘attr’ (default is&lt;br /&gt;
 all off)&lt;br /&gt;
 --test-only=WORD report only warnings/errors containing&lt;br /&gt;
 WORD literally&lt;br /&gt;
 -h, --help, --version display this help and exit When FILE is -&lt;br /&gt;
 read standard input.&lt;br /&gt;
&lt;br /&gt;
Мы будем чаще всего использовать '''--terse''' и '''--file''': они позволяют видеть проблемы в более простом отчете и работать со всем файлом, а не отдельной поправкой.&lt;br /&gt;
&lt;br /&gt;
Итак, давайте прихватим какой-нибудь файл из ядра и посмотрим, что о нем скажет '''checkpatch.pl''':&lt;br /&gt;
&lt;br /&gt;
 $ ./scripts/checkpatch.pl --file --terse drivers/staging/comedi/&lt;br /&gt;
 drivers/ni_labpc.c drivers/staging/comedi/drivers/ni_&lt;br /&gt;
 labpc.c:4: WARNING: line over 80 characters&lt;br /&gt;
 ...&lt;br /&gt;
 drivers/staging/comedi/drivers/ni_labpc.c:486: WARNING:&lt;br /&gt;
 braces {} are not necessary for single statement blocks&lt;br /&gt;
 ... &lt;br /&gt;
 drivers/staging/comedi/drivers/ni_labpc.c:489: WARNING:&lt;br /&gt;
 braces {} are not necessary for single statement blocks&lt;br /&gt;
 ...&lt;br /&gt;
 drivers/staging/comedi/drivers/ni_labpc.c:587: WARNING:&lt;br /&gt;
 suspect code indent for conditional statements (8, 0)&lt;br /&gt;
 ...&lt;br /&gt;
 drivers/staging/comedi/drivers/ni_labpc.c:743: WARNING:&lt;br /&gt;
 printk() should include KERN_ facility level&lt;br /&gt;
 drivers/staging/comedi/drivers/ni_labpc.c:750: WARNING:&lt;br /&gt;
 kfree(NULL) is safe this check is probably not required&lt;br /&gt;
 ...&lt;br /&gt;
 drivers/staging/comedi/drivers/ni_labpc.c:2028: WARNING:&lt;br /&gt;
 EXPORT_SYMBOL(foo); should immediately follow its&lt;br /&gt;
 function/variable&lt;br /&gt;
 total: 0 errors, 76 warnings, 2028 lines checked&lt;br /&gt;
&lt;br /&gt;
Я удалил из предыдущего вывода множество предупреждений: их целых 76, и все они являются вариантами приведенных выше.&lt;br /&gt;
&lt;br /&gt;
Как видите, инструмент '''checkpatch.pl''' говорит, где код превышает 80-символьный лимит и где используются лишние скобки, а также показывает другие ненужные вещи, которые следует удалить из файла.&lt;br /&gt;
&lt;br /&gt;
Теперь, зная, что нужно делать, откройте свой любимый текстовый редактор и исправьте что-нибудь: например, проблему с фигурными скобками (см. врезку) –&lt;br /&gt;
это нетрудно. Взглянем на исходный код: строки 486–490 выглядят так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
      if (irq) {&lt;br /&gt;
             printk(“, irq %u”, irq);&lt;br /&gt;
      }&lt;br /&gt;
      if (dma_chan) {&lt;br /&gt;
             printk(“, dma %u”, dma_chan);&lt;br /&gt;
      }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Простое удаление лишних фигурных скобок даст нам такой результат:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
      if (irq)&lt;br /&gt;
             printk(“, irq %u”, irq);&lt;br /&gt;
      if (dma_chan)&lt;br /&gt;
             printk(“, dma %u”, dma_chan);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сохраните файл и запустите checkpatch вновь для проверки, что предупреждение исчезло:&lt;br /&gt;
&lt;br /&gt;
 $ ./scripts/checkpatch.pl --file --terse drivers/staging/comedi/drivers/ni_labpc.c | grep 486&lt;br /&gt;
 $&lt;br /&gt;
&lt;br /&gt;
И, конечно, надо собрать файл и проверить, что ничего не сломалось:&lt;br /&gt;
&lt;br /&gt;
 $ make drivers/staging/comedi/drivers/ni_labpc.o&lt;br /&gt;
 CHK include/linux/version.h&lt;br /&gt;
 CHK include/generated/utsrelease.h&lt;br /&gt;
 CALL scripts/checksyscalls.sh&lt;br /&gt;
 CC [M] drivers/staging/comedi/drivers/ni_labpc.o&lt;br /&gt;
&lt;br /&gt;
Отлично, вы только что сделали свое первое исправление кода ядра! Но как переправить такие изменения разработчикам ядра в формате, который они готовы принять?&lt;br /&gt;
&lt;br /&gt;
===Про ''Git''===&lt;br /&gt;
&lt;br /&gt;
Вероятно, главное, что следует помнить, работая с ''Git'' – то, что ни в коем случае нельзя соваться в ту ветку (branch), которой занимается Линус, так называемую ‘master’. Надо создать собственное ответвление и работать в нем. Это гарантирует, что у вас без осложнений применятся изменения, появившиеся в ветви Линуса. Чтобы создать новую ветку с именем ‘tutorial’ и «выписать» ее (check out), выполните следующие действия:&lt;br /&gt;
&lt;br /&gt;
 $ git branch tutorial&lt;br /&gt;
 $ git checkout tutorial&lt;br /&gt;
&lt;br /&gt;
Вот и все. Теперь вы в ветви ‘tutorial’ вашего репозитория ядра, что видно из следующей команды:&lt;br /&gt;
&lt;br /&gt;
 $ git branch&lt;br /&gt;
 master&lt;br /&gt;
 * tutorial&lt;br /&gt;
&lt;br /&gt;
Звездочка '''*''' перед именем ‘tutorial’ показывает, что вы в правильной ветви. Теперь-то и вносите изменения в код ядра!&lt;br /&gt;
&lt;br /&gt;
===Другие радости ''Git''&lt;br /&gt;
&lt;br /&gt;
Если вы редактируете файл внутри репозитория ''Git'', ваши изменения отслеживаются ''Git''. Вы можете видеть это, запустив ''git status'':&lt;br /&gt;
&lt;br /&gt;
 $ git status&lt;br /&gt;
 # On branch tutorial&lt;br /&gt;
 # Changed but not updated:&lt;br /&gt;
 # (use “git add &amp;lt;file&amp;gt;...” to update what will be committed)&lt;br /&gt;
 # (use “git checkout -- &amp;lt;file&amp;gt;...” to discard changes in working directory)&lt;br /&gt;
 #&lt;br /&gt;
 # modified: drivers/staging/comedi/drivers/ni_labpc.c&lt;br /&gt;
 #&lt;br /&gt;
 no changes added to commit (use git add and/or git commit -a)&lt;br /&gt;
&lt;br /&gt;
Данный вывод показывает, что мы находимся в ветви с именем ‘tutorial’ и имеем на текущий момент один модифицированный файл, '''ni_labpc.c'''. Попросив ''Git'' показать нам, что изменилось, мы увидим следующие строки:&lt;br /&gt;
мы увидим следующие строки:&lt;br /&gt;
&lt;br /&gt;
 $ git diff&lt;br /&gt;
 diff ­­git a/drivers/staging/comedi/drivers/ni_labpc.c b/&lt;br /&gt;
 drivers/staging/comedi/drivers/ni_labpc.c&lt;br /&gt;
 index dc3f398..a01e35d 100644&lt;br /&gt;
 ­­­ a/drivers/staging/comedi/drivers/ni_labpc.c&lt;br /&gt;
 +++ b/drivers/staging/comedi/drivers/ni_labpc.c&lt;br /&gt;
 @@ ­483,12 +483,10 @@ int labpc_common_attach(struct&lt;br /&gt;
 comedi_device *dev, unsigned long iobase,&lt;br /&gt;
       printk(“comedi%d: ni_labpc: %s, io 0x%lx”, dev­&amp;gt;minor,&lt;br /&gt;
 thisboard­&amp;gt;name,&lt;br /&gt;
             iobase);&lt;br /&gt;
 ­     if (irq) {&lt;br /&gt;
 +      if (irq)&lt;br /&gt;
              printk(“, irq %u”, irq);&lt;br /&gt;
 ­     }&lt;br /&gt;
 ­     if (dma_chan) {&lt;br /&gt;
 +      if (dma_chan)&lt;br /&gt;
              printk(“, dma %u”, dma_chan);&lt;br /&gt;
 ­     }&lt;br /&gt;
       printk(“\n”);&lt;br /&gt;
       if (iobase == 0) {&lt;br /&gt;
&lt;br /&gt;
Это формат, применяемый инструментом ''patch'' для автоматического внесения изменений в код. '''+''' или '''-''' в начале строк показывают, что строки будут удалены или добавлены. Чтение вывода изменений в формате ''diff'' скоро станет для вас естественным; в этом формате и нужно отправлять правки куратору [maintainer] ядра для их применения.&lt;br /&gt;
&lt;br /&gt;
===Фигурные скобки===&lt;br /&gt;
&lt;br /&gt;
Правила, описывающие использование фигурных скобок в ядре, немного кропотливы. Открывающие скобки следует помещать в ту же строку, что и выражение, к которому они относятся, с одним исключением, показанным ниже. Закрывающие скобки помещаются в отдельной строке. Например:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 if (error != ­ENODEV) {&lt;br /&gt;
       foo();&lt;br /&gt;
       bar();&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если нужно добавить к '''if''' утверждение '''else''', его следует поместить в строке, где находится закрывающая скобка, как показано ниже:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 if (error != ­ENODEV) {&lt;br /&gt;
       foo();&lt;br /&gt;
       bar();&lt;br /&gt;
 } else {&lt;br /&gt;
       report_error();&lt;br /&gt;
       goto exit;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если скобки в утверждении не нужны, не ставьте их совсем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 if (error != ­ENODEV)&lt;br /&gt;
       foo();&lt;br /&gt;
 else&lt;br /&gt;
      goto exit;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Единственное исключение для открывающих скобок – это описание функции; тут их следует помещать в новой строке, вот так:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 int function(int *baz)&lt;br /&gt;
 {&lt;br /&gt;
       do_something(baz);&lt;br /&gt;
       return 0;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Описания, описания, описания===&lt;br /&gt;
&lt;br /&gt;
Неформатированный вывод ''diff'' показывает, что код был изменен, но для принятия любой поправки ядра в основное дерево необходима дополнительная информация. Эти метаданные не менее важны, чем изменения кода: они показывают, кто сделал поправку и почему, и кто ее проверил.&lt;br /&gt;
&lt;br /&gt;
Вот пример изменений, не так давно внесенных в дерево ядра Linux:&lt;br /&gt;
&lt;br /&gt;
 USB: otg: Fix bug on remove path without transceiver&lt;br /&gt;
 In the case where a gadget driver is removed while no&lt;br /&gt;
 transceiver was found at probe time, a bug in otg_put_&lt;br /&gt;
 transceiver() will trigger.&lt;br /&gt;
 Signed-off-by: Robert Jarzmik &amp;lt;robert.jarzmik@free.fr&amp;gt;&lt;br /&gt;
 Acked-by: David Brownell &amp;lt;dbrownell@users.sourceforge.net&amp;gt;&lt;br /&gt;
 Signed-off-by: Greg Kroah-Hartman &amp;lt;gregkh@suse.de&amp;gt;&lt;br /&gt;
 --- a/drivers/usb/otg/otg.c&lt;br /&gt;
 +++ b/drivers/usb/otg/otg.c&lt;br /&gt;
 @@ -43,7 +43,8 @@ EXPORT_SYMBOL(otg_get_transceiver);&lt;br /&gt;
 void otg_put_transceiver(struct otg_transceiver *x)&lt;br /&gt;
 {&lt;br /&gt;
 - put_device(x-&amp;gt;dev);&lt;br /&gt;
 + if (x)&lt;br /&gt;
 + put_device(x-&amp;gt;dev);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Первая строка – краткое описание того, какую часть ядра изменяет правка и, вкратце, что она делает:&lt;br /&gt;
&lt;br /&gt;
 USB: otg: Исправление ошибки, возникающей при удалении устройства без трансивера&lt;br /&gt;
&lt;br /&gt;
Затем идет более подробный параграф, описывающий, зачем нужны изменения:&lt;br /&gt;
&lt;br /&gt;
 Если драйвер устройства удаляется, а трансивер при зондировании обнаружен не был, возникает ошибка в otg_put_ transceiver().&lt;br /&gt;
&lt;br /&gt;
Далее идет несколько строк, показывающих, кто сделал и проверил поправку:&lt;br /&gt;
&lt;br /&gt;
 Signed-off-by: Robert Jarzmik &amp;lt;robert.jarzmik@free.fr&amp;gt;&lt;br /&gt;
 Acked-by: David Brownell &amp;lt;dbrownell@users.sourceforge.net&amp;gt;&lt;br /&gt;
 Signed-off-by: Greg Kroah-Hartman &amp;lt;gregkh@suse.de&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Термин '''‘Signed-off-by:’''' [Подписано к выпуску мной] ссылается на право данного разработчика внести данные изменения, причем они предлагаются под лицензией, приемлемой для добавления в дерево исходных текстов ядра Linux.&lt;br /&gt;
&lt;br /&gt;
Это соглашение называется Developer’s Certificate of Origin [Сертификат разработчика о происхождении]; его полная версия находится в файле '''Documentation/SubmittingPatches''' дерева исходных текстов ядра Linux.&lt;br /&gt;
&lt;br /&gt;
Если коротко, Developer’s Certificate of Origin содержит следующее:&lt;br /&gt;
# Эти изменения создал я; или&lt;br /&gt;
# Основано на предыдущей работе с совместимой лицензией; или&lt;br /&gt;
# Предоставлено мне по (1), (2), или (3) и не модифицировалось&lt;br /&gt;
# Это общественный вклад.&lt;br /&gt;
&lt;br /&gt;
Смысл соглашения очень прост: это гарантия, что все участники знают о легальности внесения изменений. Каждый человек, к которому попадает поправка, по мере прохождения цепочки разработчик–куратор добавляет к ней свой '''‘Signed-off-by’''' до ее внесения в дерево исходных текстов. Так гарантируется, что каждая строка кода в ядре Linux может быть отслежена назад вплоть до разработчика, который ее создал, и разработчика, который ее проверил.&lt;br /&gt;
&lt;br /&gt;
Теперь, зная структуру поправок, мы может создать свою. Сперва велим ''Git'' зафиксировать [commit] сделанные нами изменения:&lt;br /&gt;
&lt;br /&gt;
 $ git commit drivers/staging/comedi/drivers/ni_labpc.c&lt;br /&gt;
&lt;br /&gt;
''Git'' запустит ваш любимый текстовый редактор и переведет вас в него – там уже будет содержаться следующая информация:&lt;br /&gt;
&lt;br /&gt;
 # Please enter the commit message for your changes. Lines&lt;br /&gt;
 starting with ‘#’ will be ignored, and an empty message&lt;br /&gt;
 aborts the commit.&lt;br /&gt;
 # Explicit paths specified without -i nor -o; assuming --only&lt;br /&gt;
 paths...&lt;br /&gt;
 # On branch tutorial&lt;br /&gt;
 # Changes to be committed:&lt;br /&gt;
 # (use “git reset HEAD &amp;lt;file&amp;gt;...” to unstage)&lt;br /&gt;
 #&lt;br /&gt;
 # modified: drivers/staging/comedi/drivers/ni_labpc.c&lt;br /&gt;
&lt;br /&gt;
Задаем для поправки строку описания [все должно быть на английском, – прим. пер.]:&lt;br /&gt;
&lt;br /&gt;
 Staging: comedi: fix brace coding style issue in ni_labpc.c&lt;br /&gt;
 [исправление проблемы стиля использования фигурных скобок в ni_labpc.c]&lt;br /&gt;
&lt;br /&gt;
а затем сообщаем подробности:&lt;br /&gt;
&lt;br /&gt;
 This is a patch to the ni_labpc.c file that fixes up a brace&lt;br /&gt;
 warning found by the checkpatch.pl tool&lt;br /&gt;
 [Это поправка для файла ni_labpc.c, исправляющая проблему&lt;br /&gt;
 с фигурными скобками, найденную инструментом checkpatch.pl]&lt;br /&gt;
&lt;br /&gt;
Затем добавляем строку '''Signed-off-by''':&lt;br /&gt;
&lt;br /&gt;
 Signed-off-by: Greg Kroah-Hartman &amp;lt;gregkh@suse.de&amp;gt;&lt;br /&gt;
&lt;br /&gt;
и уже после этого сохраняем файл. ''Git'' должен внести изменения, напечатав следующее:&lt;br /&gt;
&lt;br /&gt;
 [tutorial 60de825] Staging: comedi: fix brace coding style issue in ni_labpc.c&lt;br /&gt;
 1 files changed, 2 insertions(+), 4 deletions(-)&lt;br /&gt;
&lt;br /&gt;
Если вы вызовете команду ''git show HEAD'' для просмотра самых последних изменений, она должна показать ваш «коммит» полностью:&lt;br /&gt;
&lt;br /&gt;
 $ git show HEAD&lt;br /&gt;
 commit 60de825964d99dee56108ce4c985a7cfc984e402&lt;br /&gt;
 Author: Greg Kroah­Hartman &amp;lt;gregkh@suse.de&amp;gt;&lt;br /&gt;
 Date: Sat Jan 9 12:07:40 2010 ­0800&lt;br /&gt;
     Staging: comedi: fix brace coding style issue in ni_labpc.c&lt;br /&gt;
     This is a patch to the ni_labpc.c file that fixes up a brace&lt;br /&gt;
 warning found by the checkpatch.pl tool&lt;br /&gt;
 Signed­off­by: My Name &amp;lt;my_name@my_email_domain&amp;gt;&lt;br /&gt;
 diff ­­git a/drivers/staging/comedi/drivers/ni_labpc.c b/&lt;br /&gt;
 drivers/staging/comedi/drivers/ni_labpc.c&lt;br /&gt;
 index dc3f398..a01e35d 100644&lt;br /&gt;
 ­­­ a/drivers/staging/comedi/drivers/ni_labpc.c&lt;br /&gt;
 +++ b/drivers/staging/comedi/drivers/ni_labpc.c&lt;br /&gt;
 @@ ­483,12 +483,10 @@ int labpc_common_attach(struct&lt;br /&gt;
 comedi_device *dev, unsigned long iobase,&lt;br /&gt;
 printk(“comedi%d: ni_labpc: %s, io 0x%lx”, dev­&amp;gt;minor,&lt;br /&gt;
 thisboard­&amp;gt;name,&lt;br /&gt;
      iobase);&lt;br /&gt;
 ­      if (irq) {&lt;br /&gt;
 +       if (irq)&lt;br /&gt;
 printk(“, irq %u”, irq);&lt;br /&gt;
 ­      }&lt;br /&gt;
 ­      if (dma_chan) {&lt;br /&gt;
 +       if (dma_chan)&lt;br /&gt;
 printk(“, dma %u”, dma_chan);&lt;br /&gt;
 ­      }&lt;br /&gt;
 printk(“\n”);&lt;br /&gt;
 if (iobase == 0) {&lt;br /&gt;
&lt;br /&gt;
Итак, вы создали свою первую поправку к ядру!&lt;br /&gt;
&lt;br /&gt;
===Внесем поправку в дерево ядра===&lt;br /&gt;
&lt;br /&gt;
А как внести созданную поправку в дерево ядра? Разработка ядра Linux по прежнему осуществляется через электронную почту, включая и поправки, и рецензирование.&lt;br /&gt;
&lt;br /&gt;
Сперва экспортируем нашу поправку в формат, используемый в письмах куратору, ответственному за их внесение. Для этого в ''Git'' опять-таки есть команда, '''format-patch'''; ею и воспользуйтесь:&lt;br /&gt;
&lt;br /&gt;
 $ git format-patch master..tutorial&lt;br /&gt;
 0001-Staging-comedi-fix-brace-coding-style-issue-in-ni_la.patch&lt;br /&gt;
&lt;br /&gt;
Этой командой мы создадим все поправки, содержащие различия между веткой ‘master’ (та самая ветка Линуса – помните, что я говорил в начале?) и вашей частной веткой ‘tutorial’.&lt;br /&gt;
&lt;br /&gt;
Там содержится только одно изменение – наша поправка. Теперь она в файле '''0001-Staging-comedi-fix-brace-coding-style-issue-in-ni_la.patch''' в нашей директории в формате, пригодном к пересылке.&lt;br /&gt;
&lt;br /&gt;
Прежде чем посылать поправку, следует проверить, что она в правильном формате и не добавит ошибок в дерево ядра, а также не имеет проблем со стилем кода. Для этого снова вызовем скрипт '''checkpatch.pl''':&lt;br /&gt;
&lt;br /&gt;
 $ ./scripts/checkpatch.pl 0001-Staging-comedi-fix-brace-&lt;br /&gt;
 coding-style-issue-in-ni_la.patch&lt;br /&gt;
 total: 0 errors, 0 warnings, 14 lines checked&lt;br /&gt;
 0001-Staging-comedi-fix-brace-coding-style-issue-in-ni_la.patch has no obvious style problems and is ready for submission.&lt;br /&gt;
&lt;br /&gt;
===Все прекрасно…===&lt;br /&gt;
&lt;br /&gt;
… но кому посылать поправку? Разработчики ядра весьма упростили и это, предусмотрев скрипт, который сообщает, кого оповестить. Он называется '''get_maintainer.pl''' и содержится в той же поддиректории '''scripts/''' в дереве исходных кодов ядра. Скрипт изучает файлы, которые вы модифицировали поправкой, и сравнивает их с файлом '''MAINTAINERS''' в дереве исходных текстов ядра (который описывает, кто за какую часть ядра отвечает), а также просматривает историю предыдущих изменений файла. На основе этого он магически генерирует список людей, которых следует оповестить о поправке, вместе с их адресами электронной почты.&lt;br /&gt;
&lt;br /&gt;
Осталось только запустить свой любимый почтовый клиент и послать поправку всем адресатам, выданным '''get_maintainer.pl''', верно? Э, не спешите. Почти все обычные почтовые клиенты вредят файлам исправлений, разрывая строки, где не надо, заменяя табуляцию на пробелы, съедая пробелы и делая прочие пакости.&lt;br /&gt;
&lt;br /&gt;
Чтобы получить информацию об этих проблемах и узнать, как правильно сконфигурировать большинство почтовых клиентов, загляните в файл '''Documentation/email-clients.txt''' в дереве исходных кодов ядра. Он должен помочь вам, если вы намерены отсылать поправки через свой обычный почтовый клиент. Но мы пойдем другим путем...&lt;br /&gt;
&lt;br /&gt;
''Git'' сам умеет посылать поправки, созданные с помощью ''git format-patch'', соответствующим разработчикам. Нужна лишь команда ''git send-email'':&lt;br /&gt;
&lt;br /&gt;
 $ git send-email --to gregkh@suse.de --to wfp5p@virginia.edu \&lt;br /&gt;
  --cc devel@driverdev.osuosl.org \&lt;br /&gt;
  --cc linux-kernel@vger.kernel.org \&lt;br /&gt;
 0001-Staging-comedi-fix-brace-coding-style-issue-in-ni_la.patch&lt;br /&gt;
&lt;br /&gt;
которая пошлет нашу поправку по должным адресам, и копии – в необходимые почтовые рассылки.&lt;br /&gt;
&lt;br /&gt;
===Что дальше?===&lt;br /&gt;
&lt;br /&gt;
Итак, вы создали поправку и отослали ее; разработчик, кому она была адресована, должен через пару дней ответить по почте нечто приятное типа «спасибо за поправку, я ее применил» [“thanks for the patch, I have applied it”] либо комментарии по поводу того, что нужно доделать, чтобы поправка была принята. Не получив ответа за неделю, пошлите поправку снова. Не бойтесь, что это обозлит разработчика: настойчивость – ключ к привлечению внимания занятого куратора подсистемы ядра.&lt;br /&gt;
&lt;br /&gt;
Теперь вы изучили простые шаги по созданию, применению и отсылке поправок к ядру Linux. Надеюсь, это означает, что каждый, прочитавший эту статью, в ближайшее время направит свою поправку к ядру, и, войдя во вкус, станет и дальше вносить свой вклад в крупнейшей программный проект в истории вычислительной техники.&lt;/div&gt;</description>
			<pubDate>Mon, 11 Apr 2011 11:27:53 GMT</pubDate>			<dc:creator>Crazy Rebel</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF129:kernelhack</comments>		</item>
	</channel>
</rss>