当前位置: 首页 > article >正文

Linux Kernel Programming 8

目录

传递参数给我们的内核

验证我们的参数


传递参数给我们的内核

先说我们怎么传递给已经写好的模块,首先呢,我们传递模块必须要使用的是显著的键值对格式——也就是<key>=<value>,比如说pass=20的方式传递给我们的内核

对于我们写模块的人而言,需要做的是使用一个宏标注,叫做module_params,这里看一个非常小的例子:

#include <linux/init.h>
#include <linux/module.h>
​
MODULE_AUTHOR("Charliechen");
MODULE_DESCRIPTION("This is a params passer demo");
MODULE_LICENSE("GPL");
MODULE_VERSION("0.2");
​
static int pass;
module_param(pass, int, 0660);
MODULE_PARM_DESC(pass, "A Interger waiting passed");
​
​
static int __init params_init(void)
{
    pr_info("inserted the params\n");
    pr_info("The module you passed for the params:"
        "pass=%d\n", pass
    );
    return 0;
}
​
static void __exit params_exit(void)
{
    pr_info("Good Bye!\n");
}
​
module_init(params_init);
module_exit(params_exit);

可以看到,我们的参数声明就多了这三行:

static int pass;
module_param(pass, int, 0660);
MODULE_PARM_DESC(pass, "A Interger waiting passed");

分别是——参数本身这个变量,module_paramMODULE_PARM_DESC着三个部分。

module_param 就是一个用来声明模块参数的宏:

module_param(name, type, perm);
  • name: 参数的名称,通常是一个变量的名称。

  • type: 参数的类型,可以是 int, charp(字符串指针), bool, ushort, uint, ulong 等。

  • perm: 参数的权限,用于控制该参数在 /sys/module/<module_name>/parameters/ 目录下的访问权限。常见的权限值包括:

    • S_IRUGO: 只读权限,所有用户可读。

    • S_IWUSR: 写权限,仅 root 用户可写。

    • S_IRUGO | S_IWUSR: 所有用户可读,仅 root 用户可写。

MODULE_PARM_DESC 宏用于为模块参数提供描述信息。我们可以使用modinfo工具查看我们手头的参数:

charliechen@charliechen-VMware-Virtual-Platform:~/kernel_test/4$ modinfo params.ko
filename:       /home/charliechen/kernel_test/4/params.ko
version:        0.2
license:        GPL
description:    This is a params passer demo
author:         Charliechen
srcversion:     EBDAB9DA969412E0DB52D9F
depends:        
retpoline:      Y
name:           params
vermagic:       6.11.0-17-generic SMP preempt mod_unload modversions 
parm:           pass:A Interger waiting passed (int)

我们编译一下这个小项目:

KDIR ?= /lib/modules/$(shell uname -r)/build
PWD            := $(shell pwd)
FNAME_C         := params
obj-m          += ${FNAME_C}.o
​
all:
    make -C $(KDIR) M=$(PWD) modules
.PHONY: clean
​
clean:
    make -C $(KDIR) M=$(PWD) clean

然后按照我们喜欢的方式挂载上去

sudo insmod params.ko pass=20
sudo dmesg
[  594.303070] inserted the params
[  594.303074] The module you passed for the params:pass=100

关于参数,我们还可以去/sys/module/下看看:

charliechen@charliechen-VMware-Virtual-Platform:/sys/module$ ls | grep params
params

进入我们的params后,你会发现有不少东西,我们关心的文件夹是parameters,进入这个文件夹,就会看到

charliechen@charliechen-VMware-Virtual-Platform:/sys/module/params/parameters$ ls -l
total 0
-rw-rw---- 1 root root 4096 Mar  8 18:42 pass

我们可以读取这个文件,看看里面写着啥:

charliechen@charliechen-VMware-Virtual-Platform:/sys/module/params/parameters$ sudo cat pass
100

啊哈,就是我们传递给这个模块的值

验证我们的参数

我们可以验证参数,办法是我们手动检查(这是一种办法)我们的参数是不是合法的,请看:

#include <linux/init.h>
#include <linux/module.h>
​
MODULE_AUTHOR("Charliechen");
MODULE_DESCRIPTION("This is a params passer demo");
MODULE_LICENSE("GPL");
MODULE_VERSION("0.2");
​
static int pass;
module_param(pass, int, 0660);
MODULE_PARM_DESC(pass, "A Interger waiting passed");
​
static int check;
module_param(check, int, 0660);
MODULE_PARM_DESC(check, "Authentics");
​
static int __init params_init(void)
{
    pr_info("inserted the params\n");
    pr_info("The module you passed for the params:"
        "pass=%d\n", pass
    );
​
    if (check < 1 || check > 100)
    {
        pr_warn("Wrong Password, die!");
        return -EINVAL;
    }
    
    return 0;
}
​
static void __exit params_exit(void)
{
    pr_info("Good Bye!\n");
}
​
module_init(params_init);
module_exit(params_exit);
参数不合法时,我们直接返回-EINVAL表达参数非法,当我们没有指定正确的参数的时候:
charliechen@charliechen-VMware-Virtual-Platform:~/kernel_test/4$ sudo insmod params.ko
insmod: ERROR: could not insert module params.ko: Invalid parameters

可以看到我们会触发检查。


http://www.kler.cn/a/578367.html

相关文章:

  • IO多路复用(epoll)/数据库(sqlite)
  • 【Go每日一练】统计字符出现的次数
  • 基于SRAM型FPGA的软错误修复SEM加固技术
  • 【AI深度学习网络】Transformer时代,RNN(循环神经网络)为何仍是时序建模的“秘密武器”?
  • Android中的Loader机制
  • 批量删除 Excel 中的空白行、空白列以及空白表格
  • 力扣刷题125. 验证回文串
  • 如何找到合适的项目管理工具
  • Linux16-数据库、HTML
  • CSDN博客:Markdown编辑语法教程总结教程(中)
  • 【技术干货】三大常见网络攻击类型详解:DDoS/XSS/中间人攻击,原理、危害及防御方案
  • 三、Java-封装playwright UI自动化(一些注解类与工具类的封装,包括定位器,page操作的封装等)
  • Windsuf 连接失败问题:[unavailable] unavailable: dial tcp...
  • 万字总结数据分析思维
  • MAC-禁止百度网盘自动升级更新
  • 前端打包优化相关 Webpack
  • 邮件发送器:使用 Python 构建带 GUI 的邮件自动发送工具
  • 【语料数据爬虫】Python爬虫|批量采集征集意见稿数据(1)
  • 基于Ollama安装deepseek-r1模型搭建本地知识库(Dify、MaxKb、Open-WebUi、AnythingLLM、RAGFlow、FastGPT)
  • 高阶哈希算法