1、Linux驱动动态加载的两种方式
linux设备驱动的动态加载可以使用insmod或modprobe两种方式,insmod一次只能加载一个特定的驱动,且需要驱动的绝对路径,而modprobe则可以一次性将有依赖关系的驱动全部加载到内核,不需要驱动的具体地址。但需要将驱动拷贝到/lib/modules/$(uname -r)/目录下。
示例:
insmod XXX.ko
modprobe xxx.ko
1
2
2、modprobe加载驱动时的问题
modprobe xxx.ko
modprobe: can't change directory to '/lib/modules': No such file or directory
1
2
3
这里提示找不到/lib/modules目录,和前面介绍的一样,它需要在指定目录下加载ko。
解决:创建/lib/modules目录:
mkdir /lib/modules
1
重新执行上面的指令:
modprobe xxx.ko
modprobe: can't change directory to '4.4.194': No such file or directory
1
2
3
这里提示找不到4.4.194目录,它对应linux内核的名称,可以使用uname –r指令查询。
uname -r
4.4.194
1
2
3
解决:创建4.4.194目录
cd /lib/modules/
mkdir 4.4.194
1
2
重新执行加载命令:
modprobe xxx.ko
modprobe: can't open 'modules.dep': No such file or directory
1
2
3
这里提示找不到modules.dep文件。我们不需要手动创建该文件,使用depmod指令即可自动生成。
depmod
-sh: depmod: command not found
1
2
3
这里提示depmod指令找不到,这是因为默认情况下根文件系统不支持该指令,需要我们自己添加。
depmod可以通过配置busybox来添加这个功能。但是我们是用buildroot自动完成根文件系统的制作,busybox也随之自动生成,这时和一般的配置就有所区别了:
1、进入buildroot目录下,执行make menuconfig,发现第一栏有关于busybox的配置选项,如下图所示:
cd buildroot/
make menuconfig
1
2
可见,我们只需要配置完busybox后,保存到这里就可以了。在busybox的编译目录配置完成后,用busybox当前目录的配置文件.config替换掉package/busybox/busybox.config文件就可以了。
2、找到output下的busybox目录,我的是output/rockchip_rk1808/build/busybox-1.27.2/,进入目录并执行make menuconfig进行busybox的配置:
cd output/rockchip_rk1808/build/busybox-1.27.2/
make menuconfig
1
2
选中depmod,这里选中modinfo是为了后面方便查看ko的依赖关系,配置完成后,保存退出,然后将当前目录下的.config文件覆盖掉buildroot/package/busybox/busybox.config文件,之后重新编译buildroot,busybox将会自动更新并打包到文件系统镜像里面。
3、测试depmod
将最新的文件系统烧写到开发板后,我们就可以使用depmod指令了。在没有执行该指令时,在/lib/modules/ 4.4.194下是没有任何文件的,执行depmod命令后,该目录下将会生成三个文件:
modules.alias modules.dep modules.symbols
1
我们再尝试执行modprobe指令加载驱动:
modprobe xxx.ko
modprobe: module x4412-beep.ko not found in modules.dep
1
2
3
这里提示在modules.dep文件中没有发现我们加载的ko文件,我们尝试查看一下modules.dep的内容:
cat modules.dep
1
可见,里面的内容为空。实际上,depmod指令会自动分析/lib/modules/$(uname -r)目录下的可加载模块,并按照固定的格式填入modules.dep中。因此,我们可以先将需要加载的ko文件拷贝到对应的目录,再执行depmod指令就ok了。
————————————————
https://blog.csdn.net/GCQ19961204/article/details/108580049