use*_*363 5 linux kernel-modules
我正在尝试使用 Linux,只是遇到了模块堆叠的概念。它可用于使用其他模块导出的符号。意味着我们可以使用某个模块中已经制作的东西,所以我们不必做已经做过的事情。但是我仍然没有实时了解我们在 Linux 中看到的这种类型的概念。
我正在关注 o'reilly 书中的相同链接 - http://www.makelinux.net/ldd3/chp-2-sect-5.shtml
并口子系统中的堆叠如图2-2所示:

我无法理解这个数字。
您能否提供一些实时示例应用程序,我们可以在其中使用模块堆叠的概念,这将增加我的视野范围?
堆栈只是意味着某个模块调用另一个模块中定义的函数。您引用的页面上有一个示例。如图所示,lp是并行端口打印机的驱动程序。它调用通用并行端口驱动程序parport。有几种不同类型的并行端口,每种都有自己的低级驱动程序;最常见的是parport_pc. 在当前的内核上,实际上是parport_pc调用 中定义的函数parport,而不是如图所示的相反。当然,它们都调用基本的内核功能(不在模块中)。
类似的案例还有很多。例如,大多数存储(磁盘)驱动程序与 SCSI 协议(的变体)通信,因此它们调用通用scsi_mod模块。该usb_storage模块同时调用sci_mod(针对存储方面)和usbcore(针对 USB 方面)。
您可以看到已安装的所有模块的依赖关系(即哪些模块从其他模块调用函数)/lib/modules/*/modules.dep(会有很多)。您可以查看当前加载的模块的依赖关系lsmod;例如,以下输出行显示parport_pc,ppdev并且lp全部依赖于parport:
parport 27954 3 parport_pc,ppdev,lp
Run Code Online (Sandbox Code Playgroud)
这是一个小脚本,可为您已加载的模块生成依赖关系图。您需要有graphviz(在大多数发行版中都可用)。
lsmod | awk '
BEGIN {print "digraph modules {"}
END {print "}"}
NR != 1 {split($4, a, ","); for (i in a) print a[i], "->", $1;}
' | dot -Tpdf >lsmod.pdf
Run Code Online (Sandbox Code Playgroud)