linux 内核学习11-内核模块参数
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.使用
- 装载内核
sudo insmod mytest.ko
- 查看内核打印日志
dmesg
[ 8958.896047] my first kernel module init
[ 8958.896048] module parameter=100
- 修改内核参数
sudo rmmod mytest //卸载内核
sudo insmod mytest.ko mytest=200 // 安装内核 携带参数[ 9463.507540] my first kernel module init
[ 9463.507541] module parameter=200
- 显示是否加载
lsmod |grep mytest
mytest 16384 0
- 查看效果
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
- 查看新增的参数
$ cd /sys/module/mytest //mytest是自己定义的内核模块名称
$ cd parameters
$ ls
debug mytest$ tree -a
.
├── debug
└── mytest0 directories, 2 files
linux 内核学习11-内核模块参数相关推荐
- Linux内核开发:内核模块参数
目录 使用参数加载模块 module_param宏 读取和更改参数值 验证参数值 声明模块参数数组 有关模块参数的一些说明 在本文中,我们将向模块添加参数.使用参数,您可以在加载模块时访问模块全局变量 ...
- Linux内核0.11学习
Linux内核0.11学习 文章目录 Linux内核0.11学习 一.计算机开机的过程 1.启动BIOS 2.BIOS 在内存中加载中断向量表和中断服务程序 Linux内核最新已经版本已经到5.18了 ...
- Linux 内核学习知识:浅析 offsetof 宏以及内核开发学习的所思所想(内核开发人员必读)
最近一头扎进了 Linux 内核的学习中,Linux 内核的学习,需要的基础知识太多太多了:C 语言.汇编语言.数据结构与算法.操作系统原理.计算机组成原理.计算机体系结构.在囫囵吞枣补完一些计算机基 ...
- Linux内核学习--内存管理模块
Linux内核学习--内存管理模块 首先,Linux内核主要由五个部分组成,他们分别是:进程调度模块.内存管理模块.文件系统模块.进程间通信模块和网络接口模块. 本部分所讲的内存是内存管理模块,其主要 ...
- linux内核学习之三:linux中的32位与64位
linux内核学习之三:linux中的"32位"与"64位" 在通用PC领域,不论是windows还是linux界,我们都会经常听到"32位" ...
- linux 内核 课程,Linux内核分析课程-全面剖析Linux内核技术 揭开Linux内核的面纱 Linux内核学习视频教 ......
课程名称 Linux内核分析课程-全面剖析Linux内核技术 揭开Linux内核的面纱 Linux内核学习视频 课程目录 (1)\1, 计算机是如何工作的?:目录中文件数:0个 (2)\2, 操作系统 ...
- Linux内核学习路线
[推荐阅读] 手把手教你如何编写一个Makefile文件 一文讲解,Linux内核--内存管理(建议收藏) 当Linux内存耗尽时,改如何处理! 一文看懂页面置换算法 内核学习路线 很多同学接触Lin ...
- Linux内核学习(三):Bootloader的特种兵-Uboot(一)
Linux内核学习(三):Bootloader的特种兵-Uboot(一) 内容全部来自–><嵌入式应用开发完全手册> 1.什么是U-Boot U-Boot,全称为Universal ...
- 【转载】linux内核学习书籍
[转载]linux内核学习书籍 1, 关于操作系统理论的最初级的知识.不需要通读并理解<操作系统概念><现代操作系统>等巨著,但总要知道分时(time-shared)和实时(r ...
最新文章
- R语言data.table导入数据实战:data.table使用字符向量创建新的数据列
- Python基础---线程
- 网站不同优化时段的优化方法介绍
- 实现全屏轮播,并且轮播div中的文字盒子一直自动垂直居中
- 扣押游戏android,恐怖探索游戏「扣押(DISTRAINT)」
- spring ref historydesign philosophy
- ural(Timus) 1019 Line Painting
- golang mysql大量连接_golang mysql 如何设置最大连接数和最大空闲连接数
- 【Elasticsearch】class_cast_exception KeywordFieldMapper cannot be cast to ObjectMapper
- Python写数据结构:单向循环链表
- loadrunner使用system()函数调用Tesseract-OCR识别验证码遇到的问题
- Debian8安装TeamViewer远程协助软件
- 计算机日期函数公式大全,Excel技巧: 根据日期汇总月份的计算公式
- Python 办公自动化之全网最强最详细PDF 文件操作手册
- php 微信公众号跳转小程序,PHP微信公共号H5页面跳转小程序。
- php实现智能音箱播放内容,海尔小优智能音箱有这些功能 用好它更方便
- java实现捕鱼达人
- openstack placement
- 计算机二级pptword建立大纲级别,计算机等级考试二级Office考点汇总!(PPT篇)...
- MATLAB笔记1:sub2ind;ind2sub;删除矩阵某行或者某列元素;改变矩阵的形状reshape函数