Метод IOCTL - Linux

У меня есть экзаменационный вопрос, и я не совсем понимаю, как его решить. Водитель, который нуждается в ioctl метод, который будет реализован и проверен.

Я должен написать ioctl() метод, связанная программа испытаний, а также общий IOCTL определения. ioctl() Метод должен обрабатывать только одну команду. В этой команде мне нужно передать структуру данных из пространства пользователя в область ядра. Ниже показана структура:

struct data
{

     char label [10];

     int value;

}
  • Водитель должен распечатать IOCTL данные команды, используя printk();
  • Имя устройства "/dev/mydevice"

Тестовая программа должна проверить режим драйвера, используя инициализированную структуру данных.

Надеюсь, что есть некоторые, которые могут помочь заранее спасибо

Мое предложение:

static int f_on_ioctl(struct inode *inode, struct file *file,  unsigned int cmd,
unsigned long arg)
{
     int ret;

    switch (cmd) 
    {
    case PASS_STRUCT:
            struct data pass_data;
            ret = copy_from_user(&pass_data, arg, sizeof(*pass_data));
            if(ret < 0) 
            {
                printk("PASS_STRUCT\n");
                return -1;
            }
            printk(KERN ALERT "Message PASS_STRUCT : %d and %c\n",pass_data.value, pass_data.label);
            break;

    default: 
            return ENOTTY;
}

return 0;

}

Определения: Common.h

#define SYSLED_IOC_MAGIC 'k'
#define PASS_STRUCT _IOW(SYSLED_IOC_MAGIC, 1, struct data)

Тестовая программа:

int main()
{
  int fd = open("/dev/mydevice", O_RDWR);

  data data_pass;
  data_pass.value = 2;
  data_pass.label = "hej";

  ioctl(fd, PASS_STRUCT, &data_pass); 

  close(fd);

  return 0;
}

Это совершенно неправильно?

0 ответов

Другие вопросы по тегам