歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> linux驅動加載後不能再卸載

linux驅動加載後不能再卸載

日期:2017/2/25 10:37:54   编辑:Linux教程

  在編寫驅動程序的時候有時候會出現這種情況,模塊加載之後不能卸載或卸載之後不能在加載,cat /proc/devices 後發現設備還占用著設備號,這種情況下,再次加載驅動模塊肯定不會成功,必須重新啟動才可以解決。最近仔細看書後發現自己在驅動程序的卸載函數中少寫了兩個函數調用,以至於在加載模塊的時候申請或添加的設備沒有被釋放或刪除。

  解決方案:

  第一步、在/lib/modules/目錄中建立與當前內核版本號一致的目錄 如 uname -r 得到 2.6.31.6則mkdir -p /lib/modules/2.6.31.6 否則會出現“rmmod: chdir(2.6.31.6): No such file or directory”類似的錯誤,而模塊也沒有被卸載;

  第二步、在驅動模塊卸載函數__exit中的cdev_del(struct cdev *)函數調用後即注銷字符設備後調用 unregister_chrdev_region(dev_t devno, unsigned count)函數釋放在驅動加載函數__init中通過register_chrdev_region、alloc_chrdev_region,注冊的主設備號。(cdev_del函數、unregister_chrdev_region函數缺一不可);

  經過以上兩步操作後,rmmod 模塊名稱 卸載模塊就不會錯誤了,而且cat /proc/devices也不會再有已經卸載的模塊的信息,這樣再次加載模塊也不會出錯了!

  這個問題,我也遇到過,那要看人的模塊名,和設備名是不是一樣, 要是一樣的話,就直接rmmod *.ko 如果不是一樣的話,就得,rmmod 設備名.ko,主要是在模塊名,和設備名,這二者之間。

  至於mini2440開發板,是需要建立/lib/modules/2.6.29.4-Friendlyarm

  但是還得看你的內核的版本,所以2.6.29.4不一定和你的一樣,你需要

  #uname -r

  查看一下你的內核版本,替換掉才行。

Copyright © Linux教程網 All Rights Reserved