Полноценный драйвер “memory”: часть инициализации драйвера |
Предыдущая Содержание Следующая |
Сейчас я покажу, как создать полный драйвер устройства: memory.c. Это устройство позволит читать из него символ или записывать в него. Это устройство, хотя вообще-то и не очень полезное, представляет собой весьма наглядный пример, так как это законченный драйвер; оно также легко реализуется, так как это не интерфейс к реальному аппаратному устройству (за исключением самого компьютера).
Для разработки этого драйвера должны быть добавлены несколько новых команд #include, которые часто появляются в драйверах устройств:
<memory initial> =
/* Необходимые подключения для драйверов устройств */
#include <linux/init.h> #include <linux/config.h> #include <linux/module.h> #include <linux/kernel.h> /* printk() */ #include <linux/slab.h> /* kmalloc() */ #include <linux/fs.h> /* всё самое важное... */ #include <linux/errno.h> /* коды ошибок */ #include <linux/types.h> /* size_t */ #include <linux/proc_fs.h> #include <linux/fcntl.h> /* O_ACCMODE */ #include <asm/system.h> /* cli(), *_flags */ #include <asm/uaccess.h> /* copy_from/to_user */
MODULE_LICENSE("Dual BSD/GPL");
/* Декларация функций для memory.c */ int memory_open(struct inode *inode, struct file *filp); int memory_release(struct inode *inode, struct file *filp); ssize_t memory_read(struct file *filp, char *buf, size_t count, loff_t *f_pos); ssize_t memory_write(struct file *filp, char *buf, size_t count, loff_t *f_pos); void memory_exit(void); int memory_init(void);
/* Структура, которая декларирует обычный файл */ /* функции доступа */ struct file_operations memory_fops = { read: memory_read, write: memory_write, open: memory_open, release: memory_release };
/* Декларация функций init и exit */ module_init(memory_init); module_exit(memory_exit);
/* Глобальные переменные драйвера */ /* Старший номер */ int memory_major = 60; /* Буфер для сохранения данных */ char *memory_buffer;
После #include файлов, объявлены функции, которые будут определены позже. Общие функции, которые обычно используются для манипулирования файлами, объявлены в определении структуры file_operations. Они также будут подробно объяснены позже. Далее, для ядра задекларированы функции инициализации и выхода, используемые при загрузке и удалении модуля. Наконец, объявлены глобальные переменные драйвера: одна из них является старшим номером драйвера, а другая является указателем на область памяти, memory_buffer, который будет использоваться как хранилище для данных драйвера. |
Предыдущая Содержание Следующая |