Полноценный драйвер “memory”: часть инициализации драйвера

Предыдущая  Содержание  Следующая V*D*V

Сейчас я покажу, как создать полный драйвер устройства: 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, который будет использоваться как хранилище для данных драйвера.

Предыдущая  Содержание  Следующая