Драйвер символьного устройства (Драйвер символьного устройства)

Взгляд изнутри

Модератор: Модераторы разделов

Аватара пользователя
netelis
Сообщения: 95
ОС: Debian Wheezy i686

Драйвер символьного устройства

Сообщение netelis »

Пишу драйвер режима ядра для символьного устройства в виде модуля ядра. Для начала пробую как пример из Linux device drivers Chapter 3.
У меня устройство файл /dev/mydev , я хочу чтобы в него можно было писать через перенаправление ввода и вывода ls >> /dev/mydev. В том примере из книги данные берутся из портов ввода и вывода там имеет место функция request_region которая резервирует диапазон портов, у меня самого устройства нету есть только файл и драйвер модуль ядра, и я хочу чтоб например при ls >> /dev/mydev записало в файл и при cat /dev/mydev выдало всё что я записал при использовании моих функций read и write заданных через структуру file_operations указанных при регистрации символьного устройства в ядре. Вот мои функции:

Код: Выделить всё

static char dev_buffer[MAX_FILE_SIZE];
ssize_t mydev_read(struct file *filp, const char *buff,ssize_t len,loff_t pos)
{
  printk(KERN_INFO DEV_NAME "read");
  struct inode *in;
  int count=len;
  struct dev_state *devst;
  printk("Kernel: try to read %d bytes \n",len);
  in=filp->f_dentry->d_inode;
  printk("Kernel: minor number is %d",MINOR(in->i_rdev));
  devst=&STATE[MINOR(in->i_rdev)];
  char tmp_buffer[100];
  strcpy(tmp_buffer,&dev_buffer[pos+poss]);
  unsigned long nlen=copy_to_user(&dev_buffer[pos+poss],buff,len);
  devst->dev_read+=nlen;
  strcat(dev_buffer,tmp_buffer);
  printk(KERN_INFO"Kernel: read "DEV_NAME" %d bytes",nlen);
  printk(KERN_INFO"kernel %s\n",dev_buffer);
  return nlen;
};

ssize_t mydev_write(struct file *filp, char *buff, ssize_t len,loff_t pos)
{
  printk(KERN_INFO DEV_NAME "write");
  struct inode *in;
  int count=len;
  unsigned char byte;
  struct dev_state *devst;
  printk(KERN_INFO"Kernel: try to write %d bytes\n",len);
  in=filp->f_dentry->d_inode;
  printk(KERN_INFO"Kernel: minor number %d\n",MINOR(in->i_rdev));
  devst=&STATE[MINOR(in->i_rdev)];
  unsigned long nlen=copy_from_user(&dev_buffer[pos+poss],buff,len);
  devst->dev_write +=len;
  poss+=len;
  printk(KERN_INFO"Kernel: "DEV_NAME " written %d bytes\n",len);
  return len;

};

STATE это массив где хранятся статистика использования устройства, тоесть открыто ли стройство и количество записанных и прочитанных данных индексом в массиве является минор данного устройства. Что у меня не так? У меня есть предположение что можно использовать внутренний буффер драйвера при записи писать туда при чтении возвращать пользователю.
Написал пользовательскую програмку чтения и записи в файл устройства вроде работает, но когда просматриваю лог файл через dmesg нет обращения к функциям моего драйвера как при использовании команды cat /dev/mydev или записи при перенаправлении потоков. Почему так может быть?
Спасибо сказали: