Выполнение ioctl из пространства ядра - PullRequest
3 голосов
/ 17 марта 2011

Я пишу драйвер ядра, который должен выполнять ioctl на другом устройстве. Я понимаю, что это не лучший способ обработки кода, но пока это временное исправление. Я получаю код ошибки -22 (неверный аргумент) из моего вызова ioctl в функции, но я не вижу, что может быть не так с аргументами. Вот соответствующие разделы кода.

#define GPIO74 "/dev/gpio/74"

struct file* gpio74FD;
  .
  .
  .
gpio74FD = filp_open(GPIO74,O_RDWR,0)
  .
  .
  .
int device_ioctl(struct inode* inode,struct file *file, unsigned int ioctl_num,unsigned long ioctl_param)
{
  .
  .
  .
ret_val = gpio74FD->f_op->ioctl(inode, gpio74FD, GPIO_CONFIG_AS_INP, 0); //returns error code -22 (Invlaid Argument)
  .
  .
  .
return ret_val;
}

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

1 Ответ

1 голос
/ 18 марта 2011

Поскольку вы теперь очень глубоко разбираетесь в хакерской территории «не делайте этого», добавление нескольких printk в драйвер gpio может дать вам некоторую ценную информацию.

Другой вариант - избежать этого ужасного взлома,и переключитесь на менее вредную: добавьте экспортированную функцию в драйвер gpio, которую вы можете вызывать из своего собственного модуля

...