Автор: Пользователь скрыл имя, 03 Октября 2011 в 19:49, курсовая работа
Модуль - это некий код, который может быть загружен или выгружен ядром по мере необходимости[1]. Модули расширяют функциональные возможности ядра без необходимости перезагрузки системы. Например, одна из разновидностей модулей ядра, драйверы устройств, позволяют ядру взаимодействовать с аппаратурой компьютера. При отсутствии поддержки модулей пришлось бы писать монолитные ядра и добавлять новые возможности прямо в ядро. При этом, после добавления в ядро новых возможностей, пришлось бы перезагружать систему.
Задание 4
Особенности реализации модуля ядра 5
Методы 5
Вывод информации 5
Пространство пользователя и пространство ядра 5
Сборка 6
Загрузка и выгрузка ядра 6
Файлы символьных устройств 7
Структура file_operations 7
Регистрация устройства 8
Отключение устройства 8
Создание файла устройства 8
Работа пользовательского приложения с модулем ядра 9
Разработка модуля ядра 10
Разработка простейшего модуля ядра 10
Создание прототипов функций 10
Реализация функций 11
Организация обмена данных с пространством пользователя 11
Реализация политики безопасности 12
Организация работы с модулем ядра 14
Заключение 15
Библиографический список 16
Приложение 17
Структура file_operations для ядра Linux 2.6.38 17
Код модуля ядра 18
Для
обеспечения возможности
mknod char_dev c 100 0
Где char_dev – имя файла, а 100 – номер который возвращает функция register_chrdev() при подключении модуля.
Для работы с модулем ядра необходимо подключиться к файлу устройства с помощью функции open. Далее работа с модулем ядра ничем не отличается от работы с обычным файлом, естественно, учитывая специфику модуля и реализованные функции.
Пример программы для работы с модулем:
Функция ioctl – определяет в какой буфер происходит запись. В 17 строке выбираем буфер под номером 1. В следующей строке происходит запись в выбранный буфер. Далее происходит запись в буфер под номером 2. Команда lseek передвигает указатель чтения на +3 байта. Функция read в итоге вернет «lo there!».
Разработка модуля ядра проходит в несколько этапов:
Для
простейшего модуля ядра достаточно
реализовать функцию
Данный
код является полностью работоспособным
и выводит сообщения при
Для модуля понадобятся функции: open, close, write, read, ioctl и lseek. Создадим прототипы этих функций. Аргументы и возвращаемые значения можно найти в struct file_operations.
Прототипы реализованы, но как можно заметить, их имена не совпадают и именами нужных нам функций, и даже если бы совпадали, их было бы невозможно вызвать. Для того чтобы иметь возможность вызывать описанные функции необходимо определить экземпляр структуры file_operations, где должны быть указаны ссылки на эти методы:
Следующий
шаг это регистрация
Теперь можно быть уверенным, что функции будут вызваны. Но при выгрузке модуля, но все равно останется зарегистрированным, что может привести к ошибке. Чтобы этого избежать, нужно вызвать метод unregister_chrdev(MAJOR_NUM, DEVICE_NAME) в методе cleanup_module.
На данном этапе реализуется логика модуля ядра, пример организации которой подробно рассматривается в главе «Работа пользовательского приложения с модулем ядра». Но некоторые функции не будут работать правильно, пока не будет организована передача данных между пространством пользователя и ядра.
Примером функций для которых необходим обмен данными между пространством пользователя и пространством ядра могут служить функции write и read: