zl程序教程

您现在的位置是:首页 >  硬件

当前栏目

内核与内核模块:depmod,lsmod,modinfo,insmod,rmmod,mdprobe

内核 内核模块
2023-09-27 14:29:31 时间
内核与内核模块:depmod,lsmod,modinfo,insmod,rmmod,mdprobe   首先,我们得知道内核与内核模块放在哪里。 内核:/boot/vmlinuz或/boot/vmlinuz-version; 内核解压缩所需RAMDisk:/boot/initrd(/boot/...

内核与内核模块:depmod,lsmod,modinfo,insmod,rmmod,mdprobe

  首先,我们得知道内核与内核模块放在哪里。 内核:/boot/vmlinuz或/boot/vmlinuz-version; 内核解压缩所需RAMDisk:/boot/initrd(/boot/initrd-version); 内核模块:/lib/modules/version/kernel或/lib/modules/$(uname -r)/kernel; 内核源码:/usr/src/linux 或 /usr/src/kernels;   如果内核顺利被加载了,会有以下几个信息记录: 内核版本:/proc/version 系统内核功能:/proc/sys/kernel   假如我有个新硬件,偏偏我的系统不支持,要这样做: 重新编译内核,并加入最新的硬件驱动程序源码; 将该硬件的驱动程序编译成为模块,在启动时加载该模块。   下面我们着重讲一下内核模块 一、内核模块与依赖性   基本上,内核模块放置处是在 /lib/modules/$(uname -r)/kernel当中,里面的几个目录主要为: arch 与硬件平台有关的选项 crypto 内核所支持的加密的技术 drivers 一些硬件的驱动程序 fs 内核所支持的文件系统 lib 一些函数库 net 与网络有关的各项协议数据,还有防火墙模块等 sound 与音效有关的各项模块   还有文件/lib/modules/$(uname -r)/modules.dep ,记录了内核支持的模块的依赖性。那么如何创建该文件呢?如下: #depmod [-Ane]   -A:不加任何参数时,depmod会主动去分析目前内核的模块,并且重新写入/lib/modules/$(uname -r)/ modules.dep当中。如果加-A参数,则会查找比modules.dep内还要新的模块,如果真找到,才会更新。   -n:不写入modules.dep,而是将结果输出到屏幕上。   -e:显示出目前已加载的不可执行的模块名称。   例子:我做好一个网卡驱动程序a.ko(内核模块名以.ko结尾),该如何更新内核的依赖性? #cp a.ko /lib/modules/$(uname -r)/kernel/drivers/net #depmod 二、内核模块的查看   查看目前模块加载了多少的模块。 #lsmod 模块名称     模块的大小  此模块是否被其他模块使用 查阅每个模块信息 #modinfo [-adln] [module_name|filename]   -a:仅列出作者名   -d:仅列出该modules的说明   -l:仅列出授权   -n:仅列出该模块的详细路径   例子:#modinfo mii 三、内核模块的加载与删除   最好使用modprobe这个命令加载模块,因为modprobe会主动查找modules.dep的内容,解决了依赖性后,才决定需要加载的模块有哪些。   insmod则完全由用户自行加载一个完整文件名的模块,并不会主动分析模块依赖性。 #insmod [/full/path/module_name] [parameters]   例子:尝试载入cifs.ko这个文件系统模块 #insmod /lib/modules/$(uname -r)/kernel/fs/cifs/cifs.ko   记住,一定要是完整的文件名。 #rmmod [-fw] module_name   -f:强制将该模块删除掉,不论是否正在被使用   -w:若该模块正在被使用,则等待该模块被使用完毕后再删除   insmod与rmmod的问题时,你必须自行找到模块的完整文件名才行。所以,我们一般使用modprobe. #modprobe [-lcfr] module_name   -c:列出目前系统上面所有的模块   -l:列出目前在/lib/modules/`uname -r`/kernel当中的所有模块完整文件名   -f:强制加载该模块   -r:删除某个模块   例子:加载cifs模块    #modprobe cifs   很方便,因为我们根本不用知道完整的模块文件名 内核模块的额外参数配置:/etc/modprobe.conf   如果你想修改某些模块的额外参数设置,就在这个文件内。   #vi /etc/modprobe.conf
Linux内核模块 在模块A编译好后会生成符号表文件Module.symvers, 里面有函数地址和函数名对应关系,把这个文件拷贝到需要调用的模块B的源代码下,替换模块B的该文件。 然后重新编译B模块.这样就能够让模块B调用模块A的函数,以后加载模块顺序也必须先A后B,卸载相反。
内核模块-实现一个简单的设备 上一篇文章讲了如何实现基于内核模块的“helloworld”,相信大家通过这个例子对于内核模块有了一个基本的了解。当然,内核模块绝不仅仅只能实现这点功能,其最大的应用就是实现硬件的驱动程序。其实,linux内核中很大一部代码都是硬件处理相关的,比如,设备-总线-驱动框架,USB框架、spi框架、i2c框架等等,对应于各种不同的硬件设备,相应的就会有设备驱动程序,从最简单的按键、LED驱动,到十分复杂的USB子系统驱动,可以好不夸张的说,Linux内核可以适配绝大多数的硬件设备。
16.4 Linux内核(内核模块)的加载 GRUB 加载了内核之后,内核首先会再进行二次系统的自检,而不一定使用 BIOS 检测的硬件信息。这时内核终于开始替代 BIOS 接管 Linux 的启动过程了。
linux内核sysfs详解【转】 转自:http://blog.csdn.net/skyflying2012/article/details/11783847 sysfs is a ram-based filesystem initially based on ramfs.