Linux 设备驱动程序中的模块堆栈

Linux 设备驱动程序中的模块堆栈

我正在尝试使用 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_pcppdev并且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 中设备驱动程序堆栈的示例:

输入/输出堆栈

概念:

在此输入图像描述

以及更多细节:

在此输入图像描述

图形堆栈

在此输入图像描述

相关内容