我正在尝试使用 Linux,刚刚遇到了模块堆栈的概念。它可用于使用其他模块导出的符号。意味着我们可以使用某个模块中已经制作的东西,这样我们就不必做已经完成的事情。但我仍然不明白我们在 Linux 中实时看到这种类型的概念。
我正在点击奥莱利书中的相同链接 -http://www.makelinux.net/ldd3/chp-2-sect-5.shtml
并行端口子系统中的堆叠如图2-2所示:
我无法理解这个数字。
您能否提供一些实时示例应用程序,我们可以在其中使用模块堆叠的概念,这将增加我的视野?
答案1
堆栈只是意味着某个模块调用另一个模块中定义的函数。您引用的页面上有一个示例。如图所示,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
这是一个小脚本,可为您已加载的模块生成依赖关系图。你需要有图形可视化(在大多数发行版中可用)。
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
答案2
通常有一组与与计算机交互的物理设备相关的功能。例如,与磁盘驱动器相关的功能包括文件系统、加密、冗余等。组织和提供各种功能的方法之一是堆叠。
这是Linux内核的总图,您可以在其中注意到“堆栈”/“函数”(沿垂直方向)和“层”(沿水平方向):
这是上图的更详细版本:
以下是 Linux 中设备驱动程序堆栈的示例:
输入/输出堆栈
概念:
以及更多细节: