linux 内核学习11-内核模块参数

内核模块作为一个可拓展的动态模块,为Linux内核提供灵活性,所以需要依据不同的场景来传递不同的参数,实现不同的功能

1. 准备工作

#define module_param(name,type,perm)module_param_named(name,name,type,perm)#define MODULE_PARM_DESC(_parm,desc)  \__MODULE_INFO(parm,_parm,#_parm ":" desc)

module_params() 宏一共有三个参数

参数 含义
name 参数名
type 参类型数
perm 参数的读写等权限

MODULE_PARM_DESC()宏为这个参数的简单说明,参数类型可以为byte,ushort,int,uint,long,ulong,char和bool等类型。perm指定sysfs中相应文件的访问权限,如设置为0表示不会出现在sysfs文件系统中;如果设置为S_IRUGO(0444)可以被所有人读取,但是不能修改,如果设置为S_IRUGO|S_IWUSR(0644),说明可以让root权限修改这个参数。

举个例子

<driver/misc/altera-stapl/altera.c>
static int debug=1
module_param(debug,int,0644);
MODULE_PARM_DESC(debug,"enable debugging infomation");
#define dprink(args...) \if(debug){ \printk(KERN_DEBUG args); \}

这个例子定义了一个模块参数debug,类型是int,初始化值为1,访问权限是0644.也就是说root用户可以修改这个值,这个参数的用途是打开调试信息。其实这个是比较常用的内核调用手法,可以通过模块参数调试功能。

2.实战

下面这个例子定义了两个内核参数,一个是debug,一个是静态全局变量mytest

2.1 源代码

  • my_test.c
#include <linux/module.h>
#include <linux/init.h>static int debug=1;
module_param(debug,int,0644);
MODULE_PARM_DESC(debug,"enable debugging infomation");#define dprintk(args...)\if(debug){   \printk(KERN_DEBUG args);   \}static int mytest=100;
module_param(mytest,int,0644);
MODULE_PARM_DESC(mytest,"test for module parameter");static int __init my_test_init(void)
{dprintk("my first kernel module init\n");dprintk("module parameter=%d\n",mytest);return 0;}static void __exit my_test_exit(void)
{printk("goodbye\n");
}module_init(my_test_init);
module_exit(my_test_exit);// 使用接受的软件许可协议
MODULE_LICENSE("GPL");
// 描述模块的作者信息
MODULE_AUTHOR("xiao");
// 简单描述该模块的用途或者功能
MODULE_DESCRIPTION("kernel module parameter test");
//为用户控件提供一个合适的别名
MODULE_ALIAS("module paramter test");
  • Makefile
  1 BASEINCLUDE ?=/lib/modules/`uname -r`/build2 3 mytest-objs  :=my_test.o4 obj-m  :=mytest.o5 6 all :7         $(MAKE) -C      $(BASEINCLUDE)  M=$(PWD)        modules;8 clean:9         $(MAKE)  -C $(BASEINCLUDE)  SUBDIRS=$(PWD) clean;10         rm -f *.ko;11
~

2.2 编译

进行编译

$ make
make -C      /lib/modules/`uname -r`/build  M=/home/groot/test        modules;
make[1]: Entering directory '/usr/src/linux-headers-5.0.0-27-generic'CC [M]  /home/groot/test/my_test.oLD [M]  /home/groot/test/mytest.oBuilding modules, stage 2.MODPOST 1 modulesCC      /home/groot/test/mytest.mod.oLD [M]  /home/groot/test/mytest.ko
make[1]: Leaving directory '/usr/src/linux-headers-5.0.0-27-generic'

看一下编译的结果

$ ls
Makefile  modules.order  Module.symvers  my_test.c  mytest.ko  mytest.mod.c  mytest.mod.o  my_test.o  mytest.o

主要是mytest.ko模块

3.使用

  1. 装载内核
sudo insmod mytest.ko
  1. 查看内核打印日志
 dmesg
[ 8958.896047] my first kernel module init
[ 8958.896048] module parameter=100
  1. 修改内核参数
sudo rmmod mytest  //卸载内核
sudo insmod mytest.ko mytest=200  // 安装内核 携带参数[ 9463.507540] my first kernel module init
[ 9463.507541] module parameter=200
  1. 显示是否加载
lsmod  |grep mytest
mytest                 16384  0
  1. 查看效果
cd /sys/module/mytest
tree -a
.
├── coresize
├── holders
├── initsize
├── initstate
├── notes
│   └── .note.gnu.build-id
├── parameters
│   ├── debug
│   └── mytest
├── refcnt
├── sections
│   ├── .data
│   ├── .exit.text
│   ├── .gnu.linkonce.this_module
│   ├── .init.text
│   ├── __mcount_loc
│   ├── .note.gnu.build-id
│   ├── .note.Linux
│   ├── __param
│   ├── .rodata
│   ├── .rodata.str1.1
│   ├── .rodata.str1.8
│   ├── .strtab
│   └── .symtab
├── srcversion
├── taint
└── uevent
  1. 查看新增的参数
$ cd /sys/module/mytest    //mytest是自己定义的内核模块名称
$  cd parameters
$  ls
debug  mytest$  tree -a
.
├── debug
└── mytest0 directories, 2 files

linux 内核学习11-内核模块参数相关推荐

  1. Linux内核开发:内核模块参数

    目录 使用参数加载模块 module_param宏 读取和更改参数值 验证参数值 声明模块参数数组 有关模块参数的一些说明 在本文中,我们将向模块添加参数.使用参数,您可以在加载模块时访问模块全局变量 ...

  2. Linux内核0.11学习

    Linux内核0.11学习 文章目录 Linux内核0.11学习 一.计算机开机的过程 1.启动BIOS 2.BIOS 在内存中加载中断向量表和中断服务程序 Linux内核最新已经版本已经到5.18了 ...

  3. Linux 内核学习知识:浅析 offsetof 宏以及内核开发学习的所思所想(内核开发人员必读)

    最近一头扎进了 Linux 内核的学习中,Linux 内核的学习,需要的基础知识太多太多了:C 语言.汇编语言.数据结构与算法.操作系统原理.计算机组成原理.计算机体系结构.在囫囵吞枣补完一些计算机基 ...

  4. Linux内核学习--内存管理模块

    Linux内核学习--内存管理模块 首先,Linux内核主要由五个部分组成,他们分别是:进程调度模块.内存管理模块.文件系统模块.进程间通信模块和网络接口模块. 本部分所讲的内存是内存管理模块,其主要 ...

  5. linux内核学习之三:linux中的32位与64位

    linux内核学习之三:linux中的"32位"与"64位" 在通用PC领域,不论是windows还是linux界,我们都会经常听到"32位" ...

  6. linux 内核 课程,Linux内核分析课程-全面剖析Linux内核技术 揭开Linux内核的面纱 Linux内核学习视频教 ......

    课程名称 Linux内核分析课程-全面剖析Linux内核技术 揭开Linux内核的面纱 Linux内核学习视频 课程目录 (1)\1, 计算机是如何工作的?:目录中文件数:0个 (2)\2, 操作系统 ...

  7. Linux内核学习路线

    [推荐阅读] 手把手教你如何编写一个Makefile文件 一文讲解,Linux内核--内存管理(建议收藏) 当Linux内存耗尽时,改如何处理! 一文看懂页面置换算法 内核学习路线 很多同学接触Lin ...

  8. Linux内核学习(三):Bootloader的特种兵-Uboot(一)

    Linux内核学习(三):Bootloader的特种兵-Uboot(一) 内容全部来自–><嵌入式应用开发完全手册> 1.什么是U-Boot U-Boot,全称为Universal ...

  9. 【转载】linux内核学习书籍

    [转载]linux内核学习书籍 1, 关于操作系统理论的最初级的知识.不需要通读并理解<操作系统概念><现代操作系统>等巨著,但总要知道分时(time-shared)和实时(r ...

最新文章

  1. R语言data.table导入数据实战:data.table使用字符向量创建新的数据列
  2. Python基础---线程
  3. 网站不同优化时段的优化方法介绍
  4. 实现全屏轮播,并且轮播div中的文字盒子一直自动垂直居中
  5. 扣押游戏android,恐怖探索游戏「扣押(DISTRAINT)」
  6. spring ref historydesign philosophy
  7. ural(Timus) 1019 Line Painting
  8. golang mysql大量连接_golang mysql 如何设置最大连接数和最大空闲连接数
  9. 【Elasticsearch】class_cast_exception KeywordFieldMapper cannot be cast to ObjectMapper
  10. Python写数据结构:单向循环链表
  11. loadrunner使用system()函数调用Tesseract-OCR识别验证码遇到的问题
  12. Debian8安装TeamViewer远程协助软件
  13. 计算机日期函数公式大全,Excel技巧: 根据日期汇总月份的计算公式
  14. Python 办公自动化之全网最强最详细PDF 文件操作手册
  15. php 微信公众号跳转小程序,PHP微信公共号H5页面跳转小程序。
  16. php实现智能音箱播放内容,海尔小优智能音箱有这些功能 用好它更方便
  17. java实现捕鱼达人
  18. openstack placement
  19. 计算机二级pptword建立大纲级别,计算机等级考试二级Office考点汇总!(PPT篇)...
  20. MATLAB笔记1:sub2ind;ind2sub;删除矩阵某行或者某列元素;改变矩阵的形状reshape函数

热门文章

  1. Python进行股票分析
  2. mysql安装简书_MySQL 安装和配置
  3. iphone 手机尺寸_iPhone是新的黑莓手机
  4. 地层破裂压力预测方法
  5. 【微信小程序】wx.showModal模态弹窗
  6. LoRa点对点系统3 与PC接口
  7. poj2421修建道路
  8. 谷歌浏览器关于滚动事件警告去除
  9. 电子工程师踩过的这些坑,你踩过几个?
  10. 销售财务出身的创业者,占了95%,未来却可能被他打败