insmod和modprobe有什么区别?
insmod和modprobe之间有什么区别吗?
每人man insmod
:
大多数用户都希望使用modprobe,它更聪明,可以处理模块依赖。
modprobe
从/lib/modules/$(uname -r)/modules.dep.bin
读取模块(如果另一个文件不可用,则不读取.bin
后缀)。 从同一文件中加载依赖项。
modprobe
接受/lib/modules/$(uname -r)
中的.ko
文件的名称(例如,文件dkms/nvidia-current.ko
nvidia-current
)和别名( modules.alias.bin
)。 Builtins( modules.alias.bin
)也被识别,但由于这些模块是默认加载的,因此修改这种模块没有意义。
另一方面, insmod
接受文件路径。 该模块不必驻留在/lib/modules/$(uname -r)
,但不会自动加载依赖项。 这是modprobe
用于加载模块的较低程序。
与模块相关的其他程序是rmmod
和modinfo
。
rmmod
根据/proc/modules
的名称删除内核名称。 此名称不一定必须与传递给modprobe
名称相同(对于nvidia-current
文件,例如nvidia
)。
modinfo
接受文件名,或/lib/modules/$(uname -r)
没有.ko
后缀的文件名。
modprobe
是一个智能命令,它在加载模块时查找依赖项。 假设,如果我加载了一个模块,该模块在其他模块中定义了符号(该模块路径在主模块内部给出)。 因此, modprobe
加载主模块和从属模块。
但是如果使用insmod
,它将不会加载依赖项,因此它会产生像Unresolved symbols
这样的编译错误。 在这种情况下,我们必须手动查找依赖模块并需要加载它们以解决错误。
modprobe实用程序值得一提。 与insmod一样,modprobe将一个模块加载到内核中。 它的不同之处在于它将查看要加载的模块,以查看它是否引用了当前未在内核中定义的任何符号。 如果找到任何此类引用,modprobe将在当前模块搜索路径中查找定义相关符号的其他模块。 当modprobe找到那些模块(正在加载模块所需的模块)时,它也会将它们加载到内核中。 如果在这种情况下使用insmod,则命令失败,并在系统日志文件中留下“未解析的符号”消息