pp电子

深入学习 Linux 内核模块

pp电子

10eafcdfb11e42568b2054b0c799d7e9

lsmod命令告诉您当前系统上加载了哪些内核模块以及有关使用它们的一些有趣细节。

- Sandra Henry-stocker(作者)

内核模块是可以根据需要加载到内核或从内核卸载的代码块,因此您可以在不重新引导的情况下扩展内核的功能。实际上,除非用户使用像lsmod这样的命令来查询模块信息,否则用户不太可能知道内核中的任何更改。

重要的是要知道Linux系统上总有很多可用的模块,如果你可以深入研究它,那么有很多细节。

lsmod的主要用途之一是在系统不能正常工作时检查模块。但是,在大多数情况下,模块会根据需要加载,用户无需知道它们的工作方式。

显示内核模块的最简单方法是使用lsmod命令。虽然此命令包含许多详细信息,但输出非常用户友好。

$ lsmod

使用的模块大小

Snd_hda_codec_realtek 114688 1

Snd_hda_codec_generic 77824 1 snd_hda_codec_realtek

Ledtrig_audio 16384 2 snd_hda_codec_generic,snd_hda_codec_realtek

Snd_hda_codec_hdmi 53248 1

Snd_hda_intel 40960 2

Snd_hda_codec 131072 4 snd_hda_codec_generic,snd_hda_codec_hdmi,snd_hda_intel

,snd_hda_codec_realtek

Snd_hda_core 86016 5 snd_hda_codec_generic,snd_hda_codec_hdmi,snd_hda_intel

,snd_hda_codec,snd_hda_codec_realtek

Snd_hwdep 20480 1 snd_hda_codec

Snd_pcm 102400 4 snd_hda_codec_hdmi,snd_hda_intel,snd_hda_codec,snd_hda

_Core

Snd_seq_midi 20480 0

Snd_seq_midi_event 16384 1 snd_seq_midi

Dcdbas 20480 0

Snd_rawmidi 36864 1 snd_seq_midi

Snd_seq 69632 2 snd_seq_midi,snd_seq_midi_event

Coretemp 20480 0

snd_seq_device 16384 3 snd_seq,snd_seq_midi,snd_rawmidi

snd_timer 36864 2 snd_seq,snd_pcm

kvm_intel 241664 0

kvm 626688 1 kvm_intel

radeon 1454080 10

irqbypass 16384 1 kvm

joydev 24576 0

input_leds 16384 0

ttm 102400 1 radeon

drm_kms_helper 180224 1 radeon

drm 475136 13 drm_kms_helper,radeon,ttm

snd 81920 15 snd_hda_codec_generic,snd_seq,snd_seq_device,snd_hda

_codec_hdmi,snd_hwdep,snd_hda_intel,snd_hda_codec,snd

_hda_codec_realtek,snd_timer,snd_pcm,snd_rawmidi

i2c_algo_bit 16384 1 radeon

fb_sys_fops 16384 1 drm_kms_helper

xxxxsyscopyarea 16384 1 drm_kms_helper

serio_raw 20480 0

sysfillrect 16384 1 drm_kms_helper

sysimgblt 16384 1 drm_kms_helper

soundcore 16384 1 snd

mac_hid 16384 0

sch_fq_codel 20480 2

parport_pc 40960 0

ppdev 24576 0

lp 20480 0

parport 53248 3 parport_pc,lp,ppdev

ip_tables 28672 0

x_tables 40960 1 ip_tables

autofs4 45056 2

raid10 57344 0

raid456 155648 0

async_raid6_recov 24576 1 raid456

async_memcpy 20480 2 raid456,async_raid6_recov

async_pq 24576 2 raid456,async_raid6_recov

XXAsync_xor 20480 3 async_pq,raid456,async_raid6_recov

Async_tx 20480 5 async_pq,async_memcpy,async_xor,raid456,async_raid6_re

COV

Xor 24576 1 async_xor

Raid6_pq 114688 3 async_pq,raid456,async_raid6_recov

Libcrc32c 16384 1 raid456

Raid1 45056 0

Raid0 24576 0

多路径20480 0

线性20480 0

Hid_generic 16384 0

Psmouse 151552 0

I2c_i801 32768 0

Pata_acpi 16384 0

Lpc_ich 24576 0

Usbhid 53248 0

隐藏126976 2 usbhid,hid_generic

E1000e 245760 0

软盘81920 0

在上面的输出中:

模块显示每个模块的名称。大小显示每个模块的大小(不是它们占用的内存量)。用于显示每个模块的使用次数和使用它们的模块

显然,这里有很多模块。加载的模块数取决于您的系统和版本以及正在运行的内容。我们可以算这样:

$ lsmod | wc -l

67

要查看系统中可用的模块数(不仅仅是运行),请尝试以下命令:

$ modprobe -c | wc -l

41272

用于列出,加载和卸载,测试和检查模块状态的Linux命令。

Depmod生成modules.dep并映射文件insmod用于将模块插入Linux内核的程序lsmod显示Linux内核中的模块状态modinfo显示Linux内核模块信息modprobe添加或删除Linux内核模块rmmod一从模块

以外的Linux内核程序移动

如前所述,lsmod命令是显示内核模块的最方便的命令。但是,还有其他方法可以显示它们。内核中内置的所有模块都列在modules.builtin文件中,并在modprobe命令尝试在文件中添加模块时使用。请注意,以下命令中的$(uname -r)提供了内核版本的名称。

$ more/lib/modules/$(uname -r)/modules.builtin |头-10 -

内核/拱/86 /加密/CRC32C-intel.ko

内核/拱/86 /活动/英特尔/Intel的uncore.ko

内核/拱/86 /平台/英特尔/iosf_mbi.ko

内核/毫米/zpool.ko

内核/毫米/zbud.ko

内核/毫米/zsmalloc.ko

内核/FS/binfmt_script.ko

内核/FS/mbcache.ko

内核/FS/CONFIGFS/configfs.ko

内核/FS /加密/fscrypto.ko

您可以使用modinfo获取有关模块的更多详细信息,但没有模块提供的服务的简要说明。下面的输出中省略了冗长的签名。

$ modinfo floppy |头-16

文件名: /lib/modules/5.0.0-13-generic/kernel/drivers/block/floppy.ko

别名: block-major-2 - *

许可证: GPL

作者: Alain L. Knaff

Srcversion: EBEAA26742DF61790588FD9

别名: acpi *: PNP0700: *

别名: pnp: dPNP0700 *

取决于:

Reppoline: Y

Intree: Y

名称:软盘

Vermagic: 5.0.0-13-generic SMP mod_unload

Sig_id: PKCS#7

签名者:

Sig_key:

Sig_hashalgo: md4

您可以使用modprobe命令,找到与特定模块关联的内核对象:

$ find/lib/modules/$(uname -r)-name floppy *

/lib/modules/5.0.0-13-generic/kernel/drivers/block/floppy.ko

如果要加载模块,可以使用以下命令:

$ sudo modprobe floppy

显然,内核模块的加载和卸载非常重要。它使Linux系统比使用通用内核运行时更加灵活和高效。这也意味着您可以在不重新启动的情况下进行重大更改,例如添加硬件。

通过:

作者:Sandra Henry-Stocker lujun9972译者:LazyWolfLin校对:wxy

本文由LCTT编写,由Linux China推出