- PVSM.RU - https://www.pvsm.ru -

Как написать свой первый Linux device driver. Часть 3

Добрый вечер, хаброчитатели!

В предыдущих статьях (один [1], два [2]) мы определили понятие символьного устройства и написали простейший пример символьного драйвера. Последняя часть посвещена проверки его работоспособности. На Хабре уже есть примеры как можно протестировать драйвер, например: тык [3].

Я попытаюсь рассмотреть данный вопрос чуть подробнее, надеюсь, вам понравится.

Как написать свой первый Linux device driver. Часть 3 - 1

Пожалуйста, если у вас есть мысли, что можно добавить/исправить, то жду ваших комментариев или писем в ЛС, спасибо.

Сборка модуля ядра

Для того чтобы собрать наш модуль, нам понадобится написать маленький Makefile. Прочитать, что такое Makefile, можно тут: раз [4], два [5], три [6]. Также я писал как-то пример Makefile для студентов, можно посомтреть тут: клик [7].

Если вкратце, то Makefile это набор инструкций для программы make, а make это утилита, автоматизирующая процесс преобразования файлов из одной формы в другую. После беглого знакомства с Makefile можно посмотреть на код:

Makefile:

obj-m += fake.o

all:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

Давайте взгялнем на команду:

make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

Она начинается со смены каталога (в моем случае на: /lib/modules/4.4.0-93-generic/build), в этом каталоге находятся исходные тексты ядра, а также Makefile, который утилита make прочитает. Переменная M, позволяет указать где находится наш проект и вернуться назад, по указанному в нем пути. Т.е на самом деле мы используем другой Makefile, чтобы выполнить сборку нашего модуля.

Пишем в командной строке make и поулчаем вывод:

make -C /lib/modules/4.4.0-93-generic/build M=/home/alexey/Desktop/drivers/character modules
make[1]: Entering directory '/usr/src/linux-headers-4.4.0-93-generic'
  CC [M]  /home/alexey/Desktop/drivers/character/fake.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/alexey/Desktop/drivers/character/fake.mod.o
  LD [M]  /home/alexey/Desktop/drivers/character/fake.ko
make[1]: Leaving directory '/usr/src/linux-headers-4.4.0-93-generic'

После сборки, на выходе получился скомпилированный моудль fake.ko. Его то мы и будем загружать с помощью команды insmod.

Далее нужно выполнить следующую последовательность действий:

  1. Загрузить модуль в ядро
    Выполнить: sudo insmod fake.ko
  2. Проверить, с помощью команды dmesg, ожидаемый вывод модуля
    Пример: scull: register device major = 243 minor = 0
  3. Создать файл нашего устройства в файловой системе
    Пример: sudo mknod /dev/scull c 243 0
  4. Изменить права доступа
    Пример: sudo chmod 777 /dev/scull

Осталось дело за малым, пишем маленькую программу, которая позволит просто считывать/записывать данные.

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

#define DEVICE "/dev/scull"
#define BUFF_SIZE 100

int main()
{
        int fd;
        char ch, write_buf[BUFF_SIZE], read_buf[BUFF_SIZE];

        fd = open(DEVICE, O_RDWR);

        if (!fd)
                return -1;

        printf("r - read, w - writen");
        scanf("%c", &ch);

        switch (ch) {
                case 'w':
                        printf("enter data: ");
                        scanf(" %[^n]", write_buf);
                        write(fd, write_buf, sizeof(write_buf));
                        break;
                case 'r':
                        read(fd, read_buf, sizeof(read_buf));
                        printf("scull: %sn", read_buf);
                        break;
        }

        return 0;
}

Проверка работоспособности:

  1. Компилируем: gcc test.c -o test
  2. Вызываем исполняемый файл: ./test
  3. Записываем в устройство: Hello world!
  4. Повторно вызываем исполняемый файл: ./test
  5. Считываем данные: scull: Hello world!

На этом наше наше тестирование простого символьного драйвера завершено, теперь вы можете придумать новый функционал, реализовать и выполнить проерку самостоятельно:)

В конце предыдущей статье я проводил опрос, хочу сказать спасибо всем, кто принял в нем участие! В скором времени начну писать о процессе портирования драйверов устройств с одной версии ядра на другую.

P.S. Если вы нашли неточности в статье, буду ждать ваших сообщений, спасибо!

Автор: Alexey Ivanov

Источник [8]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/linux/268599

Ссылки в тексте:

[1] один: https://habrahabr.ru/post/337946/

[2] два: https://habrahabr.ru/post/338118/

[3] тык: https://habrahabr.ru/post/106702/

[4] раз: https://habrahabr.ru/post/155201/

[5] два: https://habrahabr.ru/post/211751/

[6] три: https://habrahabr.ru/post/111691/

[7] клик: https://github.com/A1exrebys/Makefiles/tree/master/subdir_makefiles

[8] Источник: https://habrahabr.ru/post/342668/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best