Компиляция модуля Linux: член структуры evdev не найден - PullRequest
0 голосов
/ 01 апреля 2011

Итак, я пытаюсь изменить evdev.c, который является драйвером обработчика событий для устройств ввода, таких как мышь на Linux.

Проблема, с которой я сталкиваюсь, заключается в том, что при попытке скомпилировать модуль, яполучите массу ошибок, говорящих, что члены evdev не могут быть найдены.

/home/mousedev_dbl.c:215: error: ‘struct evdev’ has no member named ‘client_lock’
/home/mousedev_dbl.c:216: error: ‘struct evdev’ has no member named ‘client_list’
/hom/mousedev_dbl.c:217: error: ‘struct evdev’ has no member named ‘client_lock’
/home/mousedev_dbl.c: In function ‘evdev_detach_client’:
/home/mousedev_dbl.c:224: error: ‘struct evdev’ has no member named ‘client_lock’
/home/mousedev_dbl.c:226: error: ‘struct evdev’ has no member named ‘client_lock’
/home/mousedev_dbl.c: In function ‘evdev_open_device’:
/home/mousedev_dbl.c:234: error: ‘struct evdev’ has no member named ‘mutex’
/home/mousedev_dbl.c:238: error: ‘struct evdev’ has no member named ‘exist’

Это только малая часть ошибок.

Структура evdev явно присутствует в файлах mousedev_dbl.c, которые я компилирую.

struct evdev {
      int open;
      int minor;
      struct input_handle handle;
      wait_queue_head_t wait;
      struct evdev_client __rcu *grab;
      struct list_head client_list;
      spinlock_t client_lock; /* protects client_list */
      struct mutex mutex;
      struct device dev;
      bool exist;
};

В качестве примера, вот как это используется в строке 215.

spin_lock(&evdev->client_lock);
list_add_tail_rcu(&client->node, &evdev->client_list);
spin_unlock(&evdev->client_lock);
synchronize_rcu();

Что может вызвать эти ошибки ??Весь файл можно найти здесь: http://lxr.free -electrons.com / source / drivers / input / evdev.c

Ответы [ 3 ]

0 голосов
/ 03 апреля 2011

Проблема заключалась в том, что я использовал исходный код ядра из неправильной версии. 2.6.38, а не 2.6.35, поэтому заголовки и источник плохо смешивались.

0 голосов
/ 28 сентября 2018

__rcu определяется в include / linux / compiler.h как

# define __rcu          __attribute__((noderef, address_space(4)))
0 голосов
/ 01 апреля 2011
struct evdev_client __rcu *grab;

Является ли эта декларация действительной? (Не похоже на меня, если __rcu не для препроцессора).

Похоже, что это объявление делает остаток вашего struct evdev искаженным. Что могло бы объяснить, что компилятор не идентифицировал client_list, client_lock и т. Д.

...