没有合适的资源?快使用搜索试试~ 我知道了~
首页Linux内核动态加载模块
一、安装内核模块: 一般步骤: (1) 在/usr/src/linux/下运行make menuconfig把需要编译成模块的项打上(M),保存并退出。 (2) 运行make modules,这一步将在/usr/src/linux/下生成*.o或*.ko文件。 (3) 运行make modeules_install来安装,这步会把生成的.o或ko文件拷贝到/lib/modules/`uname -r`/下。 如果你只要编译某一个或几个模块,可以用下面这个快速的方法: (1) 找到编译内核所需要的.config文件。 在/usr/src/linux/ar
资源详情
资源评论
资源推荐

Linux内核动态加载模块内核动态加载模块
一、安装内核模块:
一般步骤:
(1) 在/usr/src/linux/下运行make menuconfig把需要编译成模块的项打上(M),保存并退出。
(2) 运行make modules,这一步将在/usr/src/linux/下生成*.o或*.ko文件。
(3) 运行make modeules_install来安装,这步会把生成的.o或ko文件拷贝到/lib/modules/`uname -r`/下。
如果你只要编译某一个或几个模块,可以用下面这个快速的方法:
(1) 找到编译内核所需要的.config文件。
在/usr/src/linux/arch目录下有若干编译内核所用的配置。选择我们想要的配置,将它复制到/usr/src/linux目录下,改名
为.config。
cp /usr/src/linux/arch/x86/xxconfig /usr/src/linux/.config
(2) 修改.config文件,去掉不用的模块,加上自己想要的模块。
打开.config,有许多XXXX=m的项,这些都是要被编译为模块 的项,因为我们不希望编译这些模块,所以要把XXXX=m
的项统统去掉。然后再加上我们想要的模块,例如将# CONFIG_NTFS_FS is not set 改为CONFIG_NTFS_FS=m 当然,可以
用你熟悉各种工具来做这件事。
(3) 编译NTFS模块。
在/usr/src/linux目录下运行命令make modules来编译我们想要的模块。
(4) 安装模块。
编译后得到的.o文件在/usr/src/linux/目录下,手动将它复制到正确的目录下。
例如cp /usr/src/linux/fs/ntfs/ntfs.o /lib/modules/2.2.16-22/fs/
注意:千万不能运行命令make modules_install,否则将带来严重的后果,它会删除你系统中的所有模块,只安装刚刚编
译的模块(ntfs.o)。
二:安装完成以后,我们可以加载模块了:
和linux中加载模块有关的几个命令分别如下:
depmod, modprobe, lsmod
先来看看depmod命令:
depmod是一个 用来产生modules.dep和map文件的程序。在modules.dep文件中空白行和以’#'开头的行将被忽
略.depmod通过读取/lib /modules/version目录下的每一个模块来创建一个记录模块相依性的列表。这个列表
是/lib/modules/version目录下的 modules.dep。depmod也会在/lib/modules/version目录下创建许多map文件,例如
modules.dep,modules.isapnpmap,modules.pcimap,modules.alias这些文件将会被hotplug 用到。
OPTIONS:
-a –all Probe all modules. This option is enabled by default if no
file names are given in the command-line.
检查所有的模块,这个命令是默认的如果你没有指定模块名字的话。
-A –quick This option scans to see if any modules are newer than the
modules.dep file before any work is done%3
再来看看modprobe命令:
modprobe 命令是根据depmod -a的输出/lib/modules/version/modules.dep来加载全部的所需要模块。可以通过modprobe
-l来显示可以当前可以加载的模块。modprobe 在挂载模块是不用指定模块文件的路径,也不用带文件的后缀.o 或.ko, 而
insmod 需要的是模块的所在目录的路径,并且一定要带有模块文件名后缀的(modulefile.o 或modulesfile.ko )。 insmod比较
重要的用途是用来测试模块的正确性,加载一般都是依靠modprobe。
用法:modprobe xxx.ko #加载某个模块
modprobe -r xxx.ko #卸载某个模块
lsmod:
lsmod 显示当前加载的所有 模块,相当于cat /proc/modules,假设你没有设定开机加载某个模块,比如ntfs,那么开机后
执行lsmod,列表里不会有ntfs这个模块的,这时你再执行 mount -t ntfs xxx后,执行lsmod后列表里会有ntfs这个模块了。
还要注意的是lsmod显示的是模块名,而不是别名(alias)。
三、在内核中有一个“Automatic kernel module loading”功能被编译到了内核中。当用户尝试打开某类型的文件时,内核
会根据需要尝试加载相应的模块。我们来看看驱动程序自动加载是怎么实现的:
每一个设备都有Verdon ID, Device ID, SubVendor ID等信息。而每一个设备驱动程序,必须说明自己能够为哪些
Verdon ID, Deviece
ID, SubVendor ID的设备提供服务。以PCI设备为例,它是通过一个pci_device_id的数据结构来实现这个功能的。例
如:RTL8139的pci_device_id定义为:
static struct pci_device_id rtl8139_pci_tbl[] = {
{0x10ec, 0×8139, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
{0x10ec, 0×8138, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },
……
}
在模块安装的时候,depmod会根据模块中的rtl8139_pci_tbl的信息,生成下面的信息,保存到/lib/modules/uname-r
/modules.alias文件中,其内容如下:
alias pci:v000010ECd00008138sv*sd*bc*sc*i* 8139too
alias pci:v000010ECd00008139sv*sd*bc*sc*i* 8139too
……
另外在/lib/modules/uname-r /modules.dep文件中还保存这模块之间的依赖关系,其内容如下:
(这里省去了路径信息。)
8139too.ko:mii.ko













安全验证
文档复制为VIP权益,开通VIP直接复制

评论0