Ядерное программирование → Пишем первый драйвер
В этой статье я расскажу как написать модуль ядра для символьного устройства. Назовем его chardev. Это устройство будет выполнять несколько функций: нам будет предоставлена возможность открывать файл устройства на чтение функцией open() из другой программы и читать его содержимое утилитой cat. Устройство не будет поддерживать запись, но будет детектировать попытки обращения к нему на запись и возвращать ошибку. Файл устройства необходимо будет создать вручную и программа нас об этом предупредит.
Читать дальше
Ядерное программирование → Файлы символьныx устройств. Структура file_operatons и file
Структура file_operations определена в файле linux/fs.h и содержит указатели на функции драйвера, которые отвечают за выполнение различных операций с устройством. Например, практически любой драйвер символьного устройства реализует функцию чтения данных из устройства. Адрес этой функции, среди всего прочего, хранится в структуре file_operations. Ниже приводится определение структуры, взятое из исходных текстов ядра 2.6.30:
Читать дальше
Ядерное программирование → Драйверы устройств
Драйверы устройств являются одной из разновидностей модулей ядра. Они играют особую роль. Это настоящие «черные ящики», которые полностью скрывают детали, касающиеся работы устройства, и предоставляют четкий программный интерфейс для работы с аппаратурой. В Unix каждое аппаратное устройство представлено псевдофайлом (файлом устройства) в каталоге /dev. Этот файл обеспечивает средства взаимодействия с аппаратурой. Так, например, драйвер звуковой платы es1370.ko связывает файл устройства /dev/sound со звуковой платой Ensoniq IS1370. Пользовательское приложение, например mp3blaster может использовать для своей работы /dev/sound, ничего не подозревая о типе установленной звуковой платы.
Читать дальше
Ядерное программирование → Передача модулю параметров командной строки
Имеется возможность передачи модулю дополнительных параметров командной строки, но делается это не с помощью argc/argv.
Для начала вам нужно объявить глобальные переменные, в которые будут записаны входные параметры, а затем вставить макрос MODULE_PARAM(), для запуска механизма приема внешних аргументов. Значения параметров могут быть переданы модулю с помощью команд insmod или modprobe. Например: insmod mymodule.ko myvariable=5. Для большей ясности, объявления переменных и вызовы макроопределений следует размещать в начале модуля. Пример кода прояснит мое, по общему признанию, довольно неудачное объяснение.
Читать дальше
Для начала вам нужно объявить глобальные переменные, в которые будут записаны входные параметры, а затем вставить макрос MODULE_PARAM(), для запуска механизма приема внешних аргументов. Значения параметров могут быть переданы модулю с помощью команд insmod или modprobe. Например: insmod mymodule.ko myvariable=5. Для большей ясности, объявления переменных и вызовы макроопределений следует размещать в начале модуля. Пример кода прояснит мое, по общему признанию, довольно неудачное объяснение.
Читать дальше
Ядерное программирование → Как грузится Linux?
Очень многие любят пользоваться вещами, не зная, как они устроены и работают. Но мы ведь не из них верно? Поэтому я задался вопросом — что происходит после включения компьютера и выбора соответствующего ядра в Grub.
Читать дальше
Ядерное программирование → Программируем модули ядра Linux
Что такое модуль ядра?
Модуль ядра — это некий код, который может быть загружен и выгружен из ядра по мере необходимости. Модули ядра расширяют его функциональность без необходимости перезагрузки. Читать дальше
Модуль ядра — это некий код, который может быть загружен и выгружен из ядра по мере необходимости. Модули ядра расширяют его функциональность без необходимости перезагрузки. Читать дальше
