Linux - статьи


              

I was assigned major number


printk("<1> I was assigned major number %d. To talk to\n", Major); printk("<1>the driver, create a dev file with\n"); printk("'mknod /dev/chardev c %d 0'.\n", Major); printk("<1>Try various minor numbers. Try to cat and echo to\n"); printk("the device file.\n"); printk("<1>Remove the device file and module when done.\n");

return 0; }

void cleanup_module(void) { /* * Отключение устройства */ int ret = unregister_chrdev(Major, DEVICE_NAME); if (ret < 0) printk("Error in unregister_chrdev: %d\n", ret); }

/* * Обработчики */

/* * Вызывается, когда процесс пытается * открыть файл устройства, например командой * "cat /dev/chardev" */ static int device_open(struct inode *inode, struct file *file) { static int counter = 0; if (Device_Open) return -EBUSY; Device_Open++; sprintf(msg, "I already told you %d times Hello world!\n", counter++); msg_Ptr = msg; try_module_get(THIS_MODULE);

return SUCCESS; }

/* * Вызывается, когда процесс закрывает файл устройства. */ static int device_release(struct inode *inode, struct file *file) { Device_Open--; /* Теперь мы готовы обслужить другой процесс */

/* * Уменьшить счетчик обращений, иначе, после первой * же удачной попытки открыть файл устройства, * вы никогда не сможете выгрузить модуль. */ module_put(THIS_MODULE);

return 0; }

/* * Вызывается, когда процесс пытается * прочитать уже открытый файл устройства */ /* см. include/linux/fs.h */ static ssize_t device_read(struct file *filp, /* буфер, куда надо положить данные */ char *buffer, /* размер буфера */ size_t length, loff_t * offset) { /* * Количество байт, фактически записанных в буфер */ int bytes_read = 0;

/* * Если достигли конца сообщения, * вернуть 0, как признак конца файла */ if (*msg_Ptr == 0) return 0;

/* * Перемещение данных в буфер */ while (length && *msg_Ptr) {

/* * Буфер находится в пространстве * пользователя (в сегменте данных), * а не в пространстве ядра, поэтому * простое присваивание здесь недопустимо. * Для того, чтобы скопировать данные, * мы используем функцию put_user, * которая перенесет данные из пространства * ядра в пространство пользователя. */ put_user(*(msg_Ptr++), buffer++);

length--; bytes_read++; }

/* * В большинстве своем, функции чтения * возвращают количество байт, записанных в буфер. */ return bytes_read; }

/* * Вызывается, когда процесс пытается записать в устройство, * например так: echo "hi" > /dev/chardev */ static ssize_t device_write(struct file *filp, const char *buff, size_t len, loff_t * off) { printk("<1>Sorry, this operation isn't supported.\n"); return -EINVAL; }

Пример 4-2. Makefile

obj-m += chardev.o


Содержание  Назад  Вперед