From:https://blog.csdn.net/good5101/article/details/
来源
初期linux的驱动程序是必须编译在内核之中的(相应地驱动程序提供的是源程序以符合GNU规则,例如DFE530TX网卡的驱动就是ftp://www.scyld.com/pub/network/via-rhine.c),后来推广使用以后一则感觉不方便、二则普通用户也没有能力自己编译内核、三则当时内核不能太大,里面驱动程序太多超过1M的话会瘫掉,于是发明了模块(modules),就是事先将驱动程序编译成module,使用时再将他们装载到系统里以避免重新编译内核。再经过发展以后,几乎内核里的大多数功能都能以模块形式存在,例如读写NTFS、支持PPP协议等等,所以模块功能已经不局限于驱动程序了。
modprobe功能就是,对系统里的模块进行增、减、安装、删除等等操作。
简介
内容
modprobe 与 insmod 命令的区别:
linux设备驱动有两种加载方式insmod和modprobe,下面谈谈它们用法上的区别
1、insmod一次只能加载特定的一个设备驱动,且需要驱动的具体地址。写法为:
insmod drv.ko
2. modprobe则可以一次将有依赖关系的驱动全部加载到内核。不加驱动的具体地址,但需要在安装文件系统时是按照make modues_install的方式安装驱动模块的。驱动被安装在/lib/modules/$(uname -r)/…下。写法为:
modprob drv
想要卸载module。使用rmmod
用modprobe 加载模块时,提示模块找不到的问题
与内核模块操作相关的命令还有:lsmod modinfo depmod rmmod inmod modprobe
内核模块的开机自动挂载模块一般是位于一个配置文件,一般的Linux发行版本都有 /etc/modules.conf 或 /etc/modprobe.conf
加载内核驱动的通常流程:
1.先将.ko文件拷贝到/lib/module/uname -r(内核版本号)/kernel/driver/…目录下,
根据具体用途的区别分为net、ide、scsi、usb、video、parport、md、block、ata等等。
2.运行depmod -a,更新模块依赖新,主要是更新modules.dep文件
3.运行modprobe加载内核模块
lsmod
其它:
(1)lsmod 显示当前加载的所有模块,相当于cat /proc/modules,
假设你没有设定开机加载某个模块,比如ntfs,那么开机后执行lsmod,列表里不会有ntfs这个模块的, 这时你再执行 mount -t ntfs xxx后,执行lsmod后列表里就会有ntfs这个模块了。 还要注意的是lsmod显示的是模块名,而不是别名(alias)。
(2) modprobe与insmod
modprobe -l #显示当前可以加载的模块 modprobe xxx.ko #加载某个模块 modprobe -r xxx.ko #卸载某个模块 通过了解modprobe的manpage我们知道,我可以通过modprobe -l来显示可以当前可以加载的模块,所谓当前可以加载的模块, 实际上就是modules.dep文件中包含的那些模块,而不是manpage里说的modprobe会加载/lib/modules/`uname -r`下的所有模块(也许是我理解错误),下面我们将会证明这一点. insmod 与 modprobe 都是载入 kernel module,不过一般差别于 modprobe 能够处理 module 载入的相依问题。
比方你要载入 a module,但是 a module 要求系统先载入 b module 时,直接用 insmod 挂入通常都会出现错误讯息,不过 modprobe 倒是能够知道先载入 b module 后才载入 a module,如此相依性就会满足。
不过 modprobe 并不是大神,不会厉害到知道 module 之间的相依性为何,该程式是读取 /lib/modules/2.6.xx/modules.dep 档案得知相依性的。而该档案是透过 depmod 程式所建立。
(3)上面(1)中提到modprobe加载某个模块是根据/lib/modules/uname -r目录下的modules.dep文件中的模块列表,这个文件中有的模块modprobe会正确加载,否则就会出错。
我们还拿ntfs这个模块来举例:
vi /lib/modules/uname -r/modules.dep
注释掉/lib/modules/2.6.18-4-k7/kernel/fs/ntfs/ntfs.ko这一行,就是加个#号.
这个修改是即使生效的。
modinfo ntfs
modinfo: could not find module ntfs
modprobe ntfs
FATAL: Module ntfs not found.
重启机器,执行同样的命令会得到同样的结果,说明开机不会自动执行depmod的,而
locate ntfs.ko
/lib/modules/2.6.18-4-k7/kernel/fs/ntfs/ntfs.ko
证明我们并没有转移ntfs模块。
注意如果重启机器之前进行mount还是可以的,重启之后就会报错了,而上边的都是即时生效的。
还有如果modules.dep里注释掉了ntfs,那么在/etc/modules里写上也是不起作用的,说明这个和mount一样都是依赖 modprobe来完成加载模块命令的。而insmod是可以的,因为insmod后面跟的是绝对路径,它和modules.dep没什么关系。 insmod比较重要的用途是用来测试模块的正确性,加载一般都是依靠modprobe。(这个可能也不起作用了,都用modprobe吧)
这一切只是因为我们注释掉了modules.dep中关于ntfs.ko的那一行,而模块并没有删除或转移。既然modules.dep文件如此重要,那么它是怎么生成的呢?这就和下一个命令有关了,depmod。
(4)depmod
实例
- 加载RAID1阵列级别模块:
[root@root]# modprobe raid1
- 显示已加载的RAID1阵列级别模块:
[root@root]# lsmod |grep raid1
- 删除RAID1阵列级别模块:
[root@root]# modprobe -r raid1
- 显示RAID1阵列级别模块:
[root@root]# lsmod |grep raid1
insmod 和 modprobe使用方法
From:https://blog.csdn.net/hktkfly6/article/details//
insmod 和 modprobe 都是载入 kernel module,不过一般差别于 modprobe 能够处理 module 载入的相依问题。
1、2.6.29.4这个版本号是是uboot在做uimage的时候加上的,看arch/arm/boot/Makefile:
2、对比,可见2.6.29.4-FriendlyARM就是 = ( K E R N E L R E L E A S E ) , 因 此 我 们 需 要 找 到 (KERNELRELEASE),因此我们需要找到 (KERNELRELEASE),因此我们需要找到(KERNELRELEASE)怎么定义的。
3、搜索可以知道$(KERNELRELEASE)在include/config/kernel.release定义,但是改了以后重新make又还有FriendlyARM。
4、看内核顶层的makefile,约872行有说明:
Build the kernel release string
。。。
$(localver-auto) (only if CONFIG_LOCALVERSION_AUTO is set)
./scripts/setlocalversion (SCM tag, if one exists)
$(LOCALVERSION) (from make command line if provided)
仔细对比,原来这个FriendlyARM是$(LOCALVERSION)!,搜索下,发现autoconf.h有,哈哈,这就是内核图形配置出来的嘛
5、马上make menuconfig,搜索$(LOCALVERSION),乖乖,原来在Gernel Setup。。。,马上去掉,重新编译。这下没了!
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/215405.html原文链接:https://javaforall.net
