понедельник, 19 ноября 2012 г.

Драйверы и модули ядра Linux

Ещё относительно недавно программированием модулей ядра для Linux мало кого занимало. Во многом это было обусловлено и тем, что отсутствовала достаточная информация по вопросу. Когда я начал заниматься этим занятием, по необходимости, в реальных проектах (а было это где-то году в 2005-м), то оказалось, что из публикаций на то время в мире существовало два обстоятельных источника:



Самая старая, небольшая (112 стр.), очень известная и популярная книга, изданная, в том числе, и в переводе на русский язык: Ори Померанц, «Ядро Linux. Программирование модулей», издана в 2000 г. изд. Кудиц-Образ (ISBN 5-93378-008-1). Этот текст многократно растиражирован в сети, его неоднократно пытались адаптировать к последующим версиям ядра другие авторы, но дело не пошло дальше ядер 2.4.






Очень обстоятельное, но местами изрядно путанное, изложение от группы авторов Jonathan Corbet, Alessandro Rubini, Greg Kroah-Hartman: «Linux Device Drivers» (1-я редакция - 1998г., 2-я редакция - 2001г., 3-я редакция - 2005г., ISBN: 0-596-00590-3). Этот текст также правился от редакции к редакции, но также не пошёл в описаниях дальше ядра 2.6.10. В сети выложен достаточно хороший полный перевод книги на русский язык: в формате для чтения, или для сохранения в PDF. Доступен полный архив кодов примеров к книге (архив лежит на самом сайте издательства O'Reilly, издавшего книгу, но находят его с трудом: авторы в самой книге не указали ссылку на архив, ни даже вообще не упомнили о его наличии). Оригинал книги может быть скачан здесь.





На сегодня мне известно ещё в литературе 2-3 издания относительно драйверов и модулей ядра, и ещё 3-4 книги по самому ядру, замечательно полезные при работе над модулями (позже я планирую находить и добавить ссылки в сети на эти издания, но делать это именно редактируя эту страницу).





Sreekrishnan Venkateswaran, «Essential Linux Device Drivers», Prentice Hall, 2008, стр.714. Ядро (согласно аннотации автора) до 2.6.23/2.6.24 включительно. Создан отдельный авторский сайт книги (откуда и взят вид обложки), и где могут быть взяты полные примеры программного кода к книге.









2-х томник одного из непосредственных участников команды разработки ядра Linux: Jerry Cooperstein, «Linux Device Drivers», 2009. 1-й том «A guide with exercises», стр. 372 - как понятно и из подзаголовка, это описательная часть, разбитая по темам.








Том 2: «Lab Solutions», стр. 259 - это параллельная 1-му тому лабораторная часть, иллюстрирующие примеры кода. Полный архив кодов доступен для скачивания свободно доступен здесь, что примечательно, что примеры кода обновляются автором регулярно, и последний (на сегодня) архив (13-Apr-2012) откорректирован под версию ядра Linux 3.3.






Оригиналы большинства изданий вы сможете найти и свободно скачать по ссылке к подборке материалов по ядру Linux. Там же можно взять для изучения одно из лучших изданий по 2-й из названных категорий (собственно по архитектуре ядра, не по модулям):




Wolfgang Mauerer, «Professional Linux Kernel Architecture», 2008, 1370 стр.









И тем не менее (при недостаточной освещённости), техника программирования модулей ядра Linux заметно проще, чем можно было бы ожидать, или же, сравнительно, чем техника написания драйверов во многих других, более ранних операционных системах (MS-DOS, Windows ...) и может быть использована с большой пользой не только для драйверов реальных устройств, но и для более широких классах задач (например, сетевых подсистем и протоколов, или разнообразных псевдоустройств самой широкой функциональности). 

Поэтому, когда мне предложили подготовить и прочитать учебный курс по этому предмету для сотрудников одной из крупнейших международной компании по разработке программного обеспечения Global Logic, это не могло не вызвать встречного энтузиазма и интереса. Такой курс был сделан, и "прокатан" на нескольких учебных группах. Позже материалы курса были значительно расширены (до 2-х - 3-х раз по объёму) и дополнены соответствующими примерами. Так возник проект книги...

Для тех, кого может заинтересовать техника программирования модулей ядра, показываю общедоступные ссылки где я выложил результаты этой работы (последние результаты, они ещё дополняются)...

на Google:
Это сам текст (в формате OpenOffice), и архив примеров к нему.

В первоначальном (и представленном) варианте текста полностью отсутствует раздел относительно программирования драйверов блочных устройств. Я до сих пор уверен, что программирование именно блочных устройств является частной, редко востребованной работой, свойственной, главным образом, самим разработчикам новых моделей таких накопительных устройств (вот пусть они и разрабатывают!). Тем не менее, ко мне, вопреки ожиданиям, несколько раз обращались разработчики с проблемами именно по таким устройствам. В итоге, новый большой раздел относительно блочных устройств был написан, а примеры к нему созданы, отлажены и выверены. Пока это совершенно сырой отдельный текст, не вошедший в общий объём книги. Но и он может быть взят здесь на рассмотрение. В самое ближайшее время этот материал будет ещё дополнен, и включен в общий текст книги (и, соответственно, примеры). Как только это произойдёт, я добавлю сюда в блог ссылки на обновлённый вариант.


(эта страница находится в правке, так что не обессудьте!)