Разработване на модули на ядрото на Linux, част 1
Серия съдържание:
Това съдържание е част 1 от # от поредицата: Разработване на модули на ядрото на Linux
Това съдържание е част 1 от 2 от поредицата: Разработка на модул на ядрото на Linux
Следете за още статии от тази поредица.
- подробности за вътрешната структура и функциониране на ядрото на Linux, както и проблеми, които излизат наяве в него. Тези въпроси са в рамките на екипа за разработка на ядрото, воден от Линус Торвалдс.
- помощни програми и библиотеки, доставени с Linux. Достатъчно е разработчикът да може да използва тези инструменти при изграждането на модули на ядрото, но по-задълбочените познания вече са прерогатива на общностите на GNU, FSF и разработчиците на независими проекти.
- интеграция на модула, който се създава, в дървото на източника на Linux или някое от неговите дистрибуции Тези въпроси трябва да бъдат разрешени от системни инженери или изпълнители, които поемат отговорността за по-нататъшната съдба на разработвания проект. Следователно демонстрираните примерни модули ще бъдат създадени не в системното дърво на източника, а в отделни директории на целеви проекти.
Разработчикът на модули на ядрото трябва да се интересува изключително от въпросите за създаването на собствен модул (драйвер) за използване в рамките на определен целеви приложен софтуерен проект. Следователно всички въпроси извън обхвата на тази практическа задача няма да бъдат разгледани в тази поредица от статии.
Това кратко, но необходимо въведение обяснява какво да очаквате от тази и следващите статии и на какви въпроси те може да не могат да отговорят.
Създаване на първия модул на ядрото
Листинг 1. Извикваем модул на ядрото на Linux
Листинг 2. Модул за извикване на ядрото на Linux
Също така, всички модули включват заглавния файл (просто предоставящ синтактичната им връзка), даден по-долу:
Както при изграждането на всеки проект, в този случай се нуждаете от файл с скрипт за изграждане с име Makefile, показано в Листинг 3. Опитните потребители лесно ще разберат, че той изгражда 3 независими модула.
Листинг 3. Типичен скрипт за изграждане
Забележка. Синтаксисът за make е, че всеки ред с отстъп в Листинг 3, който не започва с първия знак на реда, трябва да започва с един или повече символи TAB, никога с интервали.
По-подробни опции за съдържание Makefile за различни случаи сглобяването на модули ще бъде разгледано по-късно, но предоставената информация вече е достатъчна за успешно изпълнение на командата за сглобяване.
Листинг 4. Резултат от успешно изграждане на модул
Листинг 4 показва пример за успешно изграждане на модул (предупреждение на ред 14 от файла md1.c не е от съществено значение), резултатите от сглобяването на други модули трябва да изглеждат сходни. Това завършва цялата работа по програмиране и монтаж и можете да продължите към по-нататъшни експерименти и наблюдения. Всички ключови концепции и термини, възникващи по време на тези експерименти, които са от съществено значение за разбирането на същността и технологията на модулите, ще бъдат подчертани с такъв шрифт.
В резултат на сглобяването бяха създадени три файла на модула на ядрото:
Това са файловете на обектния формат на компилатора на gcc, разширени с някои допълнителни символи (в терминологията на обектните модули):
Нека се опитаме да инсталираме (заредим) един от новите модули в системата:
Възникна грешка, тъй като модулът съдържа препратки към имена, неизвестни на ядрото (въпреки че е известно, че тези липсващи имена се дефинират в друг модул md1). За тази грешка в системния дневник ще се покаже следната информация:
Трябва да заредите модулите в различен, този път правилен, ред:
Всичко мина добре, но в разработените модули имаше извиквания на функцията printk (), която все още не е разгледана, но по аналогия с printf () трябва да има изходни текстови съобщения при зареждането на модулите. Всичко това е вярно, но в потребителско пространство, когато приложението стартира и се извика printf (), изходът се извършва на контролен терминал, и такъв терминал е текстово базирана конзола или графично терминално приложение, ако се изпълнява в X Window System. Зареждането на модули от своя страна беше извършено в пространството на ядрото, където няма и не може да има управляващ терминал, така че изходът printk () се изпраща на демона за регистриране на системата, което го поставя по-специално в системния дневник (/ var/log/messages). Този проблем ще бъде обсъден по-късно, но засега просто използвайте командата read syslog (dmesg), както е показано по-долу: