27 Nov 2013 01:20:51

Пробуем создать свой первый модуль для ядра Linux

Пример написания модуля для ядра Linux и мысли о том что это такое и зачем это нужно


Для начала хочется отметить что руководствами и материалами для чтения я обзавелся на сайте https://wiki.archlinux.org/index.php/Kernel_modules а также здесь есть очень хороший и понятный материал для понимания модулей http://tldp.org/LDP/lkmpg/2.6/html/index.html

Что такое модуль ядра?

модуль это кусок скомпилированного объектного си кода, который может подгружаться в операционную систему во время работы и предоставлять дополнительный функционал (например драйвер для работы с видео картой).

Почему нельзя работать с железом из пространства пользователя или почему нельзя обойтись без модуля?

задача операционной системы - распределение ресурсов (они же железяки) между процессами и управление ими.
Из этого можно сделать вывод что процессы подчиняются ОС и недолжны мочь много, чтобы предотвратить неумышленные или умышленные приченения вреда экосистема железа и его работоспособности.
Это достигается за счет такого механизма как кольца безопасности процессоров. Процессор имеет режимы работы (кольца) внутри которых доступ к портам ввода вывода и еще каким-либо физическим возможностям процессора ограничен. Соответсвенно ваша программа написанная на си не может напрямую обратиться к портам физических устройств (послать ток на контакты контроллеров, считать данные с регистров) до тех пор пока ей не разрешит это операционная система (io_perms) или если она не попросит операционную систему с помощью API (грубо говоря библиотеки которая юзает прерывание, записывает данные в регистры процессора и передает управление (прерыванием) операционной системе, чтобы та сменила кольцо безопасности, обратилась к портам и отдала программе полученные данные, предворительно вернув предыдущее кольцо, чтобы предотвратить несанкионированный доступ).

Иными словами модуль нужен чтобы мочь всё что физически может ваше физическое утройство, его тразисторы, многочисленные контроллеры, его процессор(ы), видео  карта, DMA, доступ к любой памяти не ограниченной картой вашего процесса и т.д. и т.п.

 

Трудно ли написано модуль?

Вовсе нет. Для этого нужно всего лишь определить две функции, и использовать подготовленный makefile из исходников ядра который сделает всю работу за вас. Делов на 5 минут. Конечно чтобы написать чтото годное нужно больше времени но это уже другая история с: 

Впечатления

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

Для примера кода модуля и пробы его компиляции смотрите гайд ссылку на который я дал в начале. А также о том что есть такие вещи как структуры данных с указателями на функции и зарезервированными именами, о том что ОС к модулю в зависимости от его типа обращается через установленный интерфейс, о том что устройства бывают символьными и блочными или о том что модуль может регистрировать файл - типа устройво (/dev/) и все операции при обращении к этому файлу будут прогоняться через фукции связанные через структуры данных - например cat <<< 'x' > /dev/mydevice и многое другое.

Comments:

add comment