驱动基础——带参数的内核模块

2024-04-20 14:32

本文主要是介绍驱动基础——带参数的内核模块,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 0. 引言
  • 1. 带参数的内核模块
    • 1.1 传入参数
    • 1.2 内核模块代码
    • 1.3 修改Makefile
    • 1.4 模块编译
    • 1.5 加载/卸载模块
  • 2. 小结
  • 参考

本文使用环境:

内核版本:Linux 3.0.15 / iTop4412_Kernel_3.0

硬件平台:armv7 / itop-4412

编译环境:Ubuntu Linux 12.04 LTS / gcc version 4.4.1 (Sourcery G++ Lite 2009q3-67)

0. 引言

在上一篇文章中简要说明了linux内核模块的使用,simple_module.c中仅分别在模块加载函数模块卸载函数中添加了调用打印,linux内核还提供了给内核模块传入参数的机制,该机制和使用c语言在main函数中通过命令行传入参数一样简单。

1. 带参数的内核模块

1.1 传入参数

linux内核中,可以借助module_parammodule_param_array函数完成参数传递,前者支持单个参数传递,后者支持多个参数传递。形式如下:

module_param(name, type, perm)
module_param_array(name, type, nump, perm)

各参数意义如下表:

参数参数意义
name模块参数名
type模块参数数据类型,可以为:
byteshortushortintuintlongulongcharpbool
nump参数数量(数组元素个数,类型为指针)
perm模块参数访问权限,具体定义可以查看include/linux/stat.h文件
常见权限参数:
S_IRUSR 00400 文件所有者可读
S_IWUSR 00200 文件所有者可写
S_IXUSR 00100 文件所有者可执行

1.2 内核模块代码

使用module_parammodule_param_array函数可以传递定义在模块文件中的参数,也可以在加载时通过命令行传入,以下模块para_simple_module.c包含了这两种方式:

#include <linux/init.h>
#include <linux/module.h>static const char* module_name = "para_simple_module";
module_param(module_name, charp, S_IRUSR);static int input_number;
module_param(input_number, int, S_IRUSR);static int input_array[10];
module_param_array(input_array, int, &input_number, S_IRUSR);static int __init para_module_init(void)
{int i;printk(KERN_INFO "%s called\n", __FUNCTION__);printk(KERN_INFO "\ninput param: \n");printk(KERN_INFO "module_name = %s\n", module_name);printk(KERN_INFO "input_number = %d\n", input_number);for(i = 0; i < input_number; i++){printk(KERN_INFO "input_array[%2d] = %d\n", i, input_array[i]);}return 0;
}static int __exit para_module_exit(void)
{printk(KERN_INFO "%s called\n", __FUNCTION__);return 0;
}module_init(para_module_init);
module_exit(para_module_exit);MODULE_AUTHOR("ryan");
MODULE_LICENSE("GPL v2");

该模块定义了3个参数:module_nameinput_numberinput_array[10]module_name为模块内置的静态参数;input_numberinput_array[10]为模块加载时输入的动态参数,input_number会随输入的input_array元素个数变化,因此第11行中module_param_array函数需要传入input_number的指针&input_number

1.3 修改Makefile

修改当前para_simple_module.c源码路径下Makefile文件,该Makefile将调用内核目录中的Makefile完成para_simple_module模块编译

#!/bin/bash
#将simple_module.c这个文件编译成中间文件simple_module.o
obj-m += para_simple_module.o #linux内核源码路径
KDIR := /home/topeet/android4.0/iTop4412_Kernel_3.0#当前目录变量
PWD ?= $(shell pwd)#make命名默认寻找第一个目标
#make -C就是指调用执行的路径
#$(KDIR)Linux源码目录,当前环境指的是/home/topeet/android4.0/iTop4412_Kernel_3.0
#$(PWD)当前目录变量
#modules要执行的操作
all:make -C $(KDIR) M=$(PWD) modules
#make clean执行的操作是删除后缀为o的文件
clean:rm -rf *.o *.ko *.mod.c *.order *.symvers

1.4 模块编译

Makefile修改完成后,在para_simple_module.c源码路径下执行make命令编译模块,编译完成后将在para_simple_module.c源码路径下产生para_simple_module.ko文件,该文件即待加载的模块文件。最后,将模块文件拷贝到NFS根文件系统目录下备用。

para_kernel_module_make

1.5 加载/卸载模块

启动开发板,进入/system/drvbin/路径执行insmod para_simple_module.ko input_array=1,2,3,4,5,6,7,8,9,10命令安装模块,然后执行rmmod para_simple_module命令卸载模块。

image-20201020122301566

模块加载时首先打印了模块内置的module_name参数,随后分别打印了input_number参数和input_array数组参数。

当输入的参数个数超过了input_array数组成员数时,加载执行将失败;当输入参数存在空格时,加载执行也会失败。

image-20201020123520989

2. 小结

本文首先介绍了linux内核模块传入参数的方式:module_parammodule_param_array宏,并基于这两个宏实现了带参数的内核模块,最后通过实际运行验证带参数内核模块的可行性。

参考

  • 《Linux设备驱动开发详解-基于最新的Linux4.0内核》第4章
  • 《itop-4412开发板之精英版使用手册_v4.0》第11章

这篇关于驱动基础——带参数的内核模块的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/920505

相关文章

详解Spring Boot接收参数的19种方式

《详解SpringBoot接收参数的19种方式》SpringBoot提供了多种注解来接收不同类型的参数,本文给大家介绍SpringBoot接收参数的19种方式,感兴趣的朋友跟随小编一起看看吧... 目录SpringBoot接受参数相关@PathVariable注解@RequestHeader注解@Reque

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的

java如何调用kettle设置变量和参数

《java如何调用kettle设置变量和参数》文章简要介绍了如何在Java中调用Kettle,并重点讨论了变量和参数的区别,以及在Java代码中如何正确设置和使用这些变量,避免覆盖Kettle中已设置... 目录Java调用kettle设置变量和参数java代码中变量会覆盖kettle里面设置的变量总结ja

spring 参数校验Validation示例详解

《spring参数校验Validation示例详解》Spring提供了Validation工具类来实现对客户端传来的请求参数的有效校验,本文给大家介绍spring参数校验Validation示例详... 目录前言一、Validation常见的校验注解二、Validation的简单应用三、分组校验四、自定义校

SpringBoot中Get请求和POST请求接收参数示例详解

《SpringBoot中Get请求和POST请求接收参数示例详解》文章详细介绍了SpringBoot中Get请求和POST请求的参数接收方式,包括方法形参接收参数、实体类接收参数、HttpServle... 目录1、Get请求1.1 方法形参接收参数 这种方式一般适用参数比较少的情况,并且前后端参数名称必须

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

4B参数秒杀GPT-3.5:MiniCPM 3.0惊艳登场!

​ 面壁智能 在 AI 的世界里,总有那么几个时刻让人惊叹不已。面壁智能推出的 MiniCPM 3.0,这个仅有4B参数的"小钢炮",正在以惊人的实力挑战着 GPT-3.5 这个曾经的AI巨人。 MiniCPM 3.0 MiniCPM 3.0 MiniCPM 3.0 目前的主要功能有: 长上下文功能:原生支持 32k 上下文长度,性能完美。我们引入了