【问题标题】:NULL pointer dereference in Linux input driverLinux 输入驱动程序中的 NULL 指针取消引用
【发布时间】:2016-03-03 04:52:02
【问题描述】:
//Init Module
...
set_bit(EV_ABS, joystick_dev->evbit);

set_bit(ABS_X, joystick_dev->absbit);
set_bit(ABS_Y, joystick_dev->absbit);
set_bit(ABS_Z, joystick_dev->absbit);
...

//Kernel Thread
...
int g[3];

g[0] = -1;
g[1] = 0;
g[2] = 0;

input_report_abs(joystick_dev, ABS_X, g[0]);
input_report_abs(joystick_dev, ABS_Y, g[1]);
input_report_abs(joystick_dev, ABS_Z, g[2]);

input_sync(joystick_dev);
...

执行突然停止在

input_report_abs(joystick_dev, ABS_Y, g[1]);

执行后

input_report_abs(joystick_dev, ABS_X, g[0]);

并抛出以下异常 -

BUG: unable to handle kernel NULL pointer dereference...

可能是什么错误?谢谢。

【问题讨论】:

  • 请显示input_report_abs() 的原型、g[] 的声明以及分配给g[0 .. 2] 的位置。
  • 首先,您需要发布MCVE。其次,问题正是它听起来的样子:您正在使用一个 NULL 指针并尝试使用它,就好像它指向有效数据一样,但事实并非如此。我们也不知道除了名称之外还有什么东西,这不一定能说明它们所拥有的实际内容。

标签: c linux input linux-kernel linux-device-driver


【解决方案1】:

我想你忘了给g[0]赋值。

// Kernel Thread ... int g[3];

g[1] = -1; g[2] = 0; g[3] = 0;

int g[3] 表示g[0],g[1],g[2] 对吗?解决这个问题,希望你能得到你想要的。

【讨论】:

    【解决方案2】:

    问题在于,在 Linux 中,在注册 ABS 事件时,我们需要设置它们的参数,而相对事件和键盘事件不是。所以我们需要添加这个。

    input_set_abs_params(joystick_dev, ABS_X, 0, 255, 4, 8);
    input_set_abs_params(joystick_dev, ABS_Y, 0, 255, 4, 8);
    input_set_abs_params(joystick_dev, ABS_Z, 0, 255, 4, 8);
    

    现在它可以正常工作了。这记录在这里:

    https://www.kernel.org/doc/Documentation/input/input-programming.txt

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多