内核模块

Posted forsake-dream

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内核模块相关的知识,希望对你有一定的参考价值。

内核参数说明

/proc目录介绍详见链接

内核参数目录及配置文件:

  1. /proc/*
  2. /usr/lib/sysctl.d/*
  3. /etc/sysctl.d/*.conf
  4. /etc/sysctl.conf #开机读取的内核参数文件:

修改内核参数的注意事项

  1. Sysctl命令用来配置与显示在/proc/sys目录中的内核参数.如果想使参数长期保存,可以通过编辑/etc/sysctl.conf文件来实现。
  2. 修改/proc下内核参数文件内容,不能使用编辑器来修改内核参数文件,理由是由于内核随时可能更改这些文件中的任意一个,另外,这些内核参数文件都是虚拟文件,实际中不存在,因此不能使用编辑器进行编辑,而是使用echo命令,然后从命令行将输出重定向至 /proc 下所选定的文件中。参数修改后立即生效,但是重启系统后,该参数又恢复成默认值。因此,想永久更改内核参数,需要修改/etc/sysctl.conf文件。
    1. echo 1 > /proc/sys/net/ipv4/ip_forward
    2. sysctl -w net.ipv4.ip_forward=1
    3. 永久的方法:
    4. echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
  3. 如果想使参数马上生效,也可以执行如下命令sysctl -p

模块说明

全称为动态可加载内核模块(Loadable Kernel Module,LKM),简称为模块

模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。它在运行时被链接到内核作为内核的一部分在内核空间运行,这与运行在用户空间的进程是不同的。模块通常由一组函数和数据结构组成,用来实现一种文件系统、一个驱动程序或其他内核上层的功能。

总之,模块是一个为内核(从某种意义上来说,内核也是一个模块)或其他内核模块提供使用功能的代码块。

模块存放目录以及配置文件:

  1. /etc/modprobe.d/*.conf | /run/modprobe.d/*.conf| /usr/lib/modprobe.d/*.conf #依次从/etc/,/run/,/usr/lib/目录读取,模块的额外参数
  2. /etc/modules-load.d/*.conf | /run/modules-load.d/*.conf | /usr/lib/modules-load.d/*.conf #依次从/etc/,/run/,/usr/lib/目录读取,读取开机加载的模块

 

    1. 该目录格式为每个模块一行
    2. 注意不要给模块名加任何后缀
    3. 具体效果可以详见右图
  • /usr/lib/modules/$(uname -r)/kernel/ #注:不同版本内核的模块目录不同,所有安装的模块都在该目录下,如果需要把模块加载到内核中,则可以通过命令来加载该目录下的对应模块即可
    1. arch #与硬件平台有关的项目,例如CPU的等级等等
    2. crypto #核心所支持的加密的技术,例如md5或者des等等
    3. drivers #一些硬件的驱动程序,例如显卡、网卡、PCI相关硬件等等
    4. fs #核心所支持的filesystems,例如vfat、reiserfs、nfs等等
    5. lib #一些函数库
    6. net #与网络有关的各项协定数据,还有防火墙模块
    7. sound #与音效有关的各项模块

模块之间的依赖性

使用depmod命令读取/lib/modules/$(uname -r )/kernel/目录下每个模块并分析,然后把分析结果写入/lib/modules/$(uname -r)/modules.dep文件中。

语法结构

内核参数控制命令

sysctl [OPTIONS] [variable[=value]] [...] #在运行环境中配置内核参数

  1. OPTIONS
    1. -a #显示所有变量
    2. -p #从文件中读取值
    3. -w #写一个值到变量中
  2. EXAMPLE

模块控制命令

depmod #输出适用于modprobe可用性的依赖列表,然后把分析结果写入/lib/modules/$(uname -r)/modules.dep文件中。

  1. EXAMPLE
    1. depmod -n #可以不写入文件而把结果输出到屏幕上
    2. depmod -e #显示出目前已载入的不可执行的模块名称

lsmod #显示当前系统下已经加载了哪些模块。共三列信息Module(模块名)、size(模块的大小)、Used by(此模块被哪个模块所使用)

  1. EXAMPLE
    1. lsmod ##显示当前系统下已经加载了哪些模块

modinfo [OPTIONS] <ModuleName|FileName...> #通过模块名或者模块文件名来查看模块信息

  1. OPTIONS
    1. -a #仅列出作者名称
    2. -d #仅列出该module的description
    3. -l #仅列出该module的license
    4. -n #仅列出该module的filename项(module的文件所在路径)
  2. EXAMPLE

modprobe [OPTIONS] ModuleName #通过module的名字管理module(不能通过文件名);如果用该命令不加任何OPTIONS则是加载module,重启后消失

modprobe(module探针)(自动处理可载入模块)是linux的一个命令,可载入指定的个别模块,或是载入一组相依的模块。modprobe会根据depmod.dep文件的相依关系,决定要载入哪些模块。若在载入过程中发生错误,在modprobe会卸载整组的模块

  1. OPTIONS
    1. -c #列出目前系统所有的模块
    2. -f #强制载入该模块
    3. -r #移除摸个module
  2. EXAMPLE

 

以上是关于内核模块的主要内容,如果未能解决你的问题,请参考以下文章

linux安装内核模块问题

inux内核模块编程入门

内核模块和内核参数

Linux内核配置编译以及模块开发

Linux内核配置编译以及模块开发

内核模块编译