亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標題: insmod驅(qū)動模塊時 內(nèi)核會自動重啟 提示:kernel BUG at kernel/timer.c:662! [打印本頁]

作者: 牡丹巖    時間: 2014-08-27 17:56
標題: insmod驅(qū)動模塊時 內(nèi)核會自動重啟 提示:kernel BUG at kernel/timer.c:662!
本帖最后由 牡丹巖 于 2014-08-27 17:59 編輯

# insmod inputk2_drv.ko    Linux內(nèi)核2.6.35.7 加載驅(qū)動模塊時直接導致系統(tǒng)自動重啟,請教為何?

有高手請速回!小弟急死了。。。
input: gec_input as /devices/virtual/input/input1
kernel BUG at kernel/timer.c:662!
[ 1051.330588] Unable to handle kernel NULL pointer dereference at virtual address 00000000


作者: amarant    時間: 2014-08-28 08:49
這是kernel通過BUG()打印出來的,你看看源代碼。也可對比主線上的代碼,可能問題已經(jīng)修復了
作者: 牡丹巖    時間: 2014-08-28 13:26
本帖最后由 牡丹巖 于 2014-08-28 13:30 編輯

這是我的bug代碼,不是每次insmod都會出錯的,問題真心難找,麻煩各位大仙看看!謝過~
  1. [size=6][size=5][code]
  2. #include <linux/module.h>
  3. #include <linux/init.h>
  4. #include <linux/input.h>
  5. #include <linux/interrupt.h>
  6. #include <asm/gpio.h>
  7. #include <linux/timer.h>


  8. static struct input_dev *p_button_dev = NULL;//定義輸入設備

  9. struct timer_list my_timer;//定義定時器


  10. //定義定時器超時處理函數(shù)
  11. void timer_func(unsigned long data)
  12. {
  13.         int key_value = gpio_get_value(S5PV210_GPH2(0));

  14.         //上報事件給input核心層
  15.         input_report_key(p_button_dev, KEY_A, !key_value);//按下為1,釋放為0

  16.              //告訴input子系統(tǒng)上報已經(jīng)完成
  17.         input_sync(p_button_dev);
  18. }

  19. //中斷處理函數(shù)
  20. static irqreturn_t button_interrupt(int irq, void *dev_id)
  21. {
  22.              mod_timer(&my_timer, jiffies + 5);//啟動定時器以及設置超時時間
  23.    
  24.         return IRQ_HANDLED;
  25. }

  26. //初始化按鈕
  27. static int __init button_init(void)
  28. {
  29.         int ret;
  30.         ret = gpio_request(S5PV210_GPH2(0), "key2");
  31.         if (ret)
  32.              {
  33.                 printk(KERN_ERR "gpio_request Failed to register device\r\n");

  34.                           goto error1;
  35.         }
  36.    
  37.              //為新輸入設備分配內(nèi)存并初始化
  38.         p_button_dev = input_allocate_device();
  39.         if (!p_button_dev)
  40.              {
  41.                 printk(KERN_ERR "can't allocate input mem!\r\n");

  42.                          goto error2;
  43.         }
  44.    
  45.         p_button_dev->name = "gec_input";
  46.         p_button_dev->id.bustype = 0x1;
  47.         p_button_dev->id.product = 0x2;
  48.         p_button_dev->id.vendor  = 0x3;
  49.         p_button_dev->id.version = 0x4;
  50.         p_button_dev->evbit[BIT_WORD(EV_KEY)] = BIT_MASK(EV_KEY);       
  51.              p_button_dev->keybit[BIT_WORD(KEY_A)] = BIT_MASK(KEY_A);   
  52.              //注冊一個輸入設備
  53.         ret = input_register_device(p_button_dev);
  54.         if (ret)
  55.              {
  56.                 printk(KERN_ERR "Failed to register device\r\n");

  57.                           goto error3;
  58.         }
  59.    
  60.                //申請中斷注冊中斷處理函數(shù)
  61.         ret = request_irq(IRQ_EINT(16), button_interrupt,
  62.                                  IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING | IRQF_DISABLED,
  63.                                       "button", NULL);
  64.         if (ret)
  65.         {
  66.                 printk(KERN_ERR "Can't request irq %d\r\n", IRQ_EINT(16));

  67.                           goto error4;
  68.         }   
  69.    
  70.         //定時器
  71.         init_timer(&my_timer);//初始化定時器
  72.         my_timer.function = timer_func;//注冊定時器超時處理函數(shù)

  73.          return 0;
  74.    

  75. error4:
  76.             free_irq(IRQ_EINT(16), NULL);//釋放分配給已定中斷的內(nèi)存
  77.          input_unregister_device(p_button_dev);
  78.    
  79. error3:
  80.             input_free_device(p_button_dev);

  81. error2:
  82.            ret = -ENOMEM;

  83. error1:
  84.            gpio_free(S5PV210_GPH2(0));
  85.    
  86.            return ret;
  87. }

  88. static void __exit button_exit(void)
  89. {
  90.         gpio_free(S5PV210_GPH2(0));       
  91.         free_irq(IRQ_EINT(16), NULL);
  92.         input_unregister_device(p_button_dev);
  93.         del_timer(&my_timer);//刪除內(nèi)核定時器
  94. }

  95. module_init(button_init);
  96. module_exit(button_exit);

  97. MODULE_LICENSE("Dual BSD/GPL");
  98. MODULE_LICENSE("GPL");

復制代碼
[/code]
作者: zszkismet    時間: 2014-08-28 13:54
應該先初始化定時器,然后再注冊中斷處理函數(shù)
如果注冊完中斷,中斷就來了,這個時候定時器還沒初始化,就會出錯
作者: 牡丹巖    時間: 2014-08-28 15:48
zszkismet 發(fā)表于 2014-08-28 13:54
應該先初始化定時器,然后再注冊中斷處理函數(shù)
如果注冊完中斷,中斷就來了,這個時候定時器還沒初始化,就 ...


我的中斷是通過按按鍵產(chǎn)生的,不太可能出現(xiàn)你說的情況哦。
insmod 導致自動重啟的情況 也不是每次都會出現(xiàn),這是最蛋碎的地方,
等測試確定了再交流!
謝了!
作者: madang    時間: 2014-09-04 09:14
回復 4# zszkismet


    說的有道理,或者終端注冊完成以后,先把irq disable掉,等timer初始化以后再enable irq。




歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2