0

所以,我正在尝试修改 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

4

3 回答 3

0

问题是我使用了错误版本的内核源代码。2.6.38 而不是 2.6.35,所以标题和源没有很好地混合。

于 2011-04-02T20:46:14.013 回答
0
struct evdev_client __rcu *grab;

这个声明有效吗?(在我看来不像,除非 __rcu 用于预处理器)。

似乎此声明使您的其余部分变得struct evdev乱码。这可以解释编译器无法识别client_listclient_lock

于 2011-04-01T12:02:19.057 回答
0

__rcu 在 include/linux/compiler.h 中定义为

# define __rcu          __attribute__((noderef, address_space(4)))
于 2018-09-28T08:49:20.970 回答