The website "dmilvdv.narod.ru." is not registered with uCoz.
If you are absolutely sure your website must be here,
please contact our Support Team.
If you were searching for something on the Internet and ended up here, try again:

About uCoz web-service

Community

Legal information

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

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

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