Empilhamento significa apenas que algumas funções de chamada de módulo definidas em outro módulo. Há um exemplo na página que você cita. De acordo com a figura, lp
é um driver para impressoras em portas paralelas. Faz chamadas no driver de porta paralela genérica parport
. Existem vários tipos diferentes de portas paralelas e cada uma tem seu próprio driver de baixo nível; o mais comum é parport_pc
. Nos kernels atuais, na verdade é parport_pc
que chama funções definidas em parport
, e não o oposto, como sugere a figura. Claro, todos eles fazem chamadas para recursos básicos do kernel (que não estão em módulos).
Existem muitos casos semelhantes. Por exemplo, a maioria dos drivers de armazenamento (disco) se comunica com (uma variante do) protocolo SCSI, portanto, eles fazem chamadas no módulo scsi_mod
genérico. O módulo usb_storage
faz chamadas em sci_mod
(para os aspectos de armazenamento) e usbcore
(para os aspectos de USB).
Você pode ver as dependências de todos os módulos que você instalou (ou seja, quais módulos chamam funções de outros módulos) em /lib/modules/*/modules.dep
(haverá muitos deles). Você pode ver as dependências dos módulos atualmente carregados com lsmod
; por exemplo, a seguinte linha de saída mostra que parport_pc
, ppdev
e lp
dependem de parport
:
parport 27954 3 parport_pc,ppdev,lp
Aqui está um pequeno script que gera um gráfico de dependência para os módulos que você carregou. Você precisa ter graphviz (disponível na maioria das distribuições).
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