当前位置: 首页 > 科技观察

深入学习Linux内核模块

时间:2023-03-18 15:27:28 科技观察

lsmod命令可以告诉您当前系统上加载了哪些内核模块,以及有关使用它们的一些有趣细节。什么是Linux内核模块?内核模块是可以根据需要加载到内核或从内核卸载的代码块,从而无需重新启动即可扩展内核的功能。事实上,除非用户使用类似lsmod的命令来查询模块信息,否则用户不太可能知道内核的任何更改。要知道的重要一点是,在您的Linux系统上总是有很多可用的模块,如果您能够深入研究它们,您可以了解很多细节。lsmod的主要用途之一是在系统运行不正常时检查模块。然而,在大多数情况下,模块是按需加载的,用户不需要知道它们是如何工作的。显示内核模块显示内核模块最简单的方法是使用lsmod命令。尽管此命令包含许多细节,但输出非常人性化。$lsmodModuleSizeUsedbysnd_hda_codec_realtek1146881snd_hda_codec_generic778241snd_hda_codec_realtekledtrig_audio163842snd_hda_codec_generic,snd_hda_codec_realteksnd_hda_codec_hdmi532481snd_hda_intel409602snd_hda_codec1310724snd_hda_codec_generic,snd_hda_codec_hdmi,snd_hda_intel,snd_hda_codec_realteksnd_hda_core860165snd_hda_codec_generic,snd_hda_codec_hdmi,snd_hda_intel,snd_hda_codec,snd_hda_codec_realteksnd_hwdep204801snd_hda_codecsnd_pcm1024004snd_hda_codec_hdmi,snd_hda_intel,snd_hda_codec,snd_hda_coresnd_seq_midi204800snd_seq_midi_event163841snd_seq_mididcdbas204800snd_rawmidi368641snd_seq_midisnd_seq696322snd_seq_midi,snd_seq_midi_eventcoretemp204800snd_seq_device163843snd_seq,snd_seq_midi,snd_rawmidisnd_timer368642snd_seq,snd_pcmkvm_intel2416640kvm6266881kvm_intelradeon145408010irqbypass163841kvmjoydev245760input_leds163840ttm1024001radeondrm_kms_helper1802241radeondrm47513613drm_kms_helper,radeon,ttmsnd8192015snd_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_rawmidii2c_algo_bit163841radeonfb_sys_fops163841drm_kms_helpersyscopyarea163841drm_kms_helperserio_raw204800sysfillrect163841drm_kms_helpersysimgblt163841drm_kms_helpersoundcore163841sndmac_hid163840sch_fq_codel204802parport_pc409600ppdev245760lp204800parport532483parport_pc,lp,ppdevip_tables286720x_tables409601ip_tablesautofs4450562raid10573440raid4561556480async_raid6_recov245761raid456async_memcpy204802raid456,async_raid6_recovasync_pq245762raid456,async_raid6_recovasync_xor204803async_pq,raid456,async_raid6_recovasync_tx204805async_pq,async_memcpy,async_xor,raid456,async_raid6_recovxor245761async_xorraid6_pq1146883async_pq,raid456,async_raid6_recovlibcrc32c163841raid456raid1450560raid0245760multipath204800linear204800hid_generic163840psmouse1515520i2c_i801327680pata_acpi163840lpc_ich245760usbhid532480hid1269762usbhid,hid_generice1000e2457600floppy819200在上面的输出中:Module显示每个模块的名称Size显示每个模块的大小(并不是它们UsedbyshowsthenumberoftimeseachmoduleisusedandthemodulesthatusethemObviouslytherearemanymoduleshereThenumberofmodulesloadeddependsonyoursystemandversionandwhatisrunning.Wecancountlikethis:$lsmod|wc-l67Toseehowmanymodulesareavailableonthesystem(notjustrunning),trythiscommand:$modprobe-c|wc-l41272OthercommandsrelatedtokernelmodulesLinuxprovidesseveralCommandsforlisting,loadingandunloading,testing,andcheckingmodulestatus.depmod-generatemodules.depandmappingfilesinsmod-aprogramtoinsertmodulesintotheLinuxkernellsmod-displaythestatusofmodulesintheLinuxkernelmodinfo-displayinformationaboutLinuxkernelmodulesmodprobe-addorremoveLinuxkernelmodulesrmmod-—AprogramthatremovesmodulesfromtheLinuxkernelshowsbuilt-inkernelmodulesAsmentionedearlier,thelsmodcommandisthemostconvenientcommandtoshowkernelmodules.However,thereareotherwaystodisplaythemaswell.modules.builtin文件列出了内核中内置的所有模块,并在modprobe命令尝试将模块添加到文件中时使用。请注意,以下命令中的$(uname-r)提供了内核版本的名称。$更多/lib/modules/$(uname-r)/modules.builtin|head-10kernel/arch/x86/crypto/crc32c-intel.kokernel/arch/x86/events/intel/intel-uncore.kokernel/arch/x86/platform/intel/iosf_mbi.kokernel/mm/zpool.kokernel/mm/zbud.kokernel/mm/zsmalloc.kokernel/fs/binfmt_script.kokernel/fs/mbcache.kokernel/fs/configfs/configfs.kokernel/fs/crypto/fscrypto.ko您可以使用modinfo获取有关模块的更多详细信息,尽管没有对模块提供的服务进行简单的描述。下面的输出省略了冗长的签名。$modinfo软盘|head-16文件名:/lib/modules/5.0.0-13-generic/kernel/drivers/block/floppy.koalias:block-major-2-*license:GPLauthor:AlainL.Knaffsrcversion:EBEAA26742DF61790588FD9alias:acpi*:PNP0700:*alias:pnp:dPNP0700*depends:retpoline:Yintree:Yname:floppyvermagic:5.0.0-13-genericSMPmod_unloadsig_id:PKCS#7signer:sig_key:sig_hashalgo:md4您可以使用modprobe命令加载或卸载模块。您可以使用以下命令找到与特定模块关联的内核对象:$find/lib/modules/$(uname-r)-namefloppy*/lib/modules/5.0.0-13-generic/kernel/drivers/block/floppy.ko如果要加载模块,可以使用这个命令:$sudomodprobefloppy总结可见,内核模块的加载和卸载非常重要。它使Linux系统比使用通用内核运行时更加灵活和高效。这也意味着您可以在不重新启动的情况下进行重大更改,例如添加硬件。