Как compo ioctl вызывается из пространства пользователя?Кто-нибудь может привести несколько примеров? - PullRequest
5 голосов
/ 07 июня 2011

Предположим, я определил следующее.

#define MY_IOCTL_CMD1 _IOR(MAGIC_NUMBER, 0x01, arg1)
#define MY_IOCTL_CMD2 _IOW(MAGIC_NUMBER, 0x02, arg2)
#ifdef CONFIG_COMPAT
#define MY_COMPAT_IOCTL_CMD1 _IOR(MAGIC_NUMBER, 0x01, compat_arg1)
#define MY_COMPAT_IOCTL_CMD2 _IOW(MAGIC_NUMBER, 0x02, compat_arg2)
#endif

Теперь, когда мы делаем ioctl из пространства пользователя, мы обычно делаем

ioctl(fd, MY_IOCTL_CMD1, &arg1)

Q: Нам действительно нужен ioctl с MY_COMPAT_IOCTL_CMD1 в качестве запроса?

В коде devide у меня есть обработчики, определенные следующим образом. ioctl: device_ioctl

#ifdef CONFIG_COMPAT
compat_ioctl: device_compat_ioctl
#endif

Кто-нибудь может дать некоторые объяснения по этому поводу?

1 Ответ

6 голосов
/ 26 сентября 2011

Этот компат - материал для запуска 32-битной программы в 64-битном ядре. Когда вы вызываете ioctl(fd, MY_IOCTL_CMD1, &arg1) из 32-битной программы в 64-битном ядре, ядро ​​будет перенаправлять ioctl в функцию .compat_ioctl в структуре file_operations. Эта compat_ioctl функция отвечает за копирование пользовательского аргумента arg1, как если бы он был compat_arg1, который использует 32-битную разметку. Typedef compat_arg1 определен в ядре, поэтому при компиляции для 64-битной структуры структура будет точно такой же, как у arg1, скомпилированной для 32-битной.

Определение MY_IOCTL_CMD1 будет учитывать sizeof arg1 при создании идентификатора cmd. Когда вы компилируете программу для 32-битного компьютера, значение для MY_IOCTL_CMD1 будет отличаться от значения, скомпилированного для 64-битного компьютера. 32-битный MY_IOCTL_CMD1 должен иметь то же значение, что и 64-битный MY_COMPAT_IOCTL_CMD1 в ядре.

Нет необходимости использовать compat_arg1 или MY_COMPAT_IOCTL_CMD1 в приложении из пользовательского пространства. Это только для кода, скомпилированного в ядре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...