linux驱动insmod、rmmod错误解决:no such file or directory

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33611327/article/details/81750248

insmod错误

当我们用insmod 加载驱动,然后在应用程中调用open 驱动文件,有时候会出现这个错误:cannot open ***:no such file or directory.

出现这个问题的原因很简单。你执行ls /dev命令看下在设备文件下面是否有你要打开的设备文件名(比如/dev/led),如果没有的话,那么错误的原因就是没有创建设备节点。通过cdev创建的字符设备是不能自动创建设备节点的。这个时候可以使用命令mknod去创建设备节点,如:

mknod  /dev/led  c  253  0(假设的)。

这样再执行自己的应用程序的时候就不会报错了。

另外一种方法,也是我要推荐的方法,就是用udev指令去动态的创建节点,自动创建节点之后每次只要insmod加载模块,应用程序就可以打开设备,而不是每次调试的时候都mknod。方法如下:

static struct class *led_class;

在模块初始化函数:int xxx_init(void)中添加这两句:

led_class = class_create(THIS_MODULE, "led_class");

device_create(led_class, NULL, MKDEV(major, 0), NULL,"led_device");

在模块卸载函数void xxx_exit(void)中添加这两句:

unregister_chrdev(major,"led");

device_destroy(led_class,MKDEV(major, 0));

主要思路:先创建一个类,在类下创建设备!这样我们就不需要在开发板上查看主设备号,然后手动创建设备节点了!在开发板上:ls /sys/class/会看到我们创建的类,ls /sys/class/led_class/会看到我们在类下创建的设备!不过真正的设备节点在/dev目录下面,通过命令:ls /dev可以查看到!

需要注意的是,我们在编写应用程序的时候,open函数里面的设备名字要跟驱动里面device_create指定的设备名字相一致!

rmmod错误

 在开发板上烧录了新移植的文件系统后,使用rmmod命令来卸载一个调试的驱动时,出现无法卸载驱动的错误,提示如下:

rmmod: chdir(/lib/modules): No such file or directory

    用lsmod查看时发现hixx模块并没有被卸载掉。
    查看/lib目录,果然没有modules这个目录存在,于是在/lib/目录下手动创建了modules目录。
    再次执行卸载命令时,又提示:

rmmod: chdir(3.0.8): No such file or directory

    于是又在modules目录下再新建目录3.0.8,再次执行卸载命令时,提示:

rmmod: module 'hixx' not found

    此时再用lsmod查看,发现hixx驱动模块已经卸载掉了。
    上面提示: module 'hixx' not found,是因为编译内核时开启了如下选项:

【*】Enable loadable module support --->

    所以系统在运行时会自动到/lib/modules/目录下去搜索相关的模块。

    如果在制作文件系统时,把hixx.ko放置到/lib/modules/目录下,则在任意目录下执行rmmod命令来卸载相应驱动模块时都不会提示这个错误的。

    另外一种方法是,在系统启动脚本里加上如下一行创建modules目录的命令也可以:

mkdir -p /lib/modules/$(uname -r)

猜你喜欢

转载自blog.csdn.net/qq_33611327/article/details/81750248
今日推荐