以下内容总结自《understanding the linux kernel》
在Linux系统中一个包括但不限于驱动模块,可能需要一个或者多个其他的模块,这些模块又可能需要其他的模块。为了内核能够自动链接模块,内核需要创建一个内核线程来执行modprobe程序,该线程要考虑由于模块依赖所引起的所有可能因素。
modprobe外部程序和insmod类似,链接在命令行中指定的一个模块。然而,modprobe还可以递归的链接命令行中模块所使用所有模块。实际上,modprobe只是检查模块的依赖关系,每个模块的实际链接工作是通过创建一个进程并执行insmod命令来实现的。
modprobe外部程序的原理:在系统启动时会自动执行一个depmod的外部命令,该程序查找为正在运行的内核所编译的所有模块,这些编译的模块一般存放在/lib/modules的目录下。然后depmod这个程序就可以把所有的模块之间的依赖关系写进一个名为modules.dep文件中。这样modprobe外部程序就可以读取modules.dep文件的信息内容并将其和/proc/modules文件产生的链接模块链表进行比较。
有的时候,内核可以通过调用request_module()函数来试图自动链接一个模块。这个函数将需要链接的模块名作为参数,并电泳kernel_thread()来创建一个新的内核线程并等待,直到这个内核线程结束为止。而此内核线程又接收待链接的模块名作为参数,并调用exeve()系统调用函数来执行modprobe外部程序,并向modprobe外部程序传递参数名。modprobe程序链接所请求的模块以及这个模块所依赖的其它模块。