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

把驱动编译进内核和驱动传递参数和内核模块导出

结合上次代码,驱动传递参数有三个函数

分别是

module_param() module_param_array(); module_param_string(); //函数参数为变量名字,变量类型,和权限

驱动传递参数代码

#include <linux/module.h> #include <linux/kernel.h> int my_add(int x, int y); // 声明外部函数 my_add EXPORT_SYMBOL(my_add); // 导出函数 my_add,使其可以被其他模块调用 int a; int b[10]; int b_count; static char str1[20]; static char *p; module_param(a, int, S_IRUGO); // 定义一个整数参数 a,权限为只读 module_param_array(b, int, &b_count, S_IRUGO); // 定义一个整数数组参数 b,权限为只读,b_count 用于存储数组元素的数量 module_param_string(str,str1, sizeof(str1), S_IRUGO); // 定义一个字符串参数 str1,权限为只读 module_param(p, charp, S_IRUGO); // 定义一个字符串指针参数 p,权限为只读 static int __init helloworld_init(void) { // 驱动入口函数 printk(KERN_EMERG "helloworld_init\r\n"); // 内核打印用 printk 而不是 printf printk(KERN_EMERG "a = %d\r\n", a); // 打印整数参数 a printk(KERN_EMERG "b_count = %d\r\n", b_count); // 打印数组元素的数量 int i; for (i = 0; i < b_count; i++) { printk(KERN_EMERG "b[%d] = %d\r\n", i, b[i]); // 打印数组参数 b 的每个元素 } printk(KERN_EMERG "str1 = %s\r\n", str1); // printk(KERN_EMERG "p = %s\r\n", p); // 打印字符串指针参数 p return 0; } static void __exit helloworld_exit(void) { // 驱动出口函数 printk(KERN_EMERG "helloworld_exit\r\n"); } module_init(helloworld_init); module_exit(helloworld_exit); MODULE_LICENSE("GPL v2"); MODULE_AUTHOR("topeet"); int my_add(int x, int y) { return x + y+100; }

可以在模块加载的时候打印出来看看

insmod helloworld.ko a=100 b=1,2,3,4,5 str="hello" p="world"

打印结果

这样就可以了

内核符号表

符号表就是记录模块的函数名,变量名等等,可以让其他模块来调用

导出函数

EXPORT_SYMBOL(符号); EXPORT_SYMBOL_GPL(符号);//只适合包含GPL模块 //一般用第一个
//在开头加上这些代码 extern int add(int a,int b); int add(int a,int b) { return a+b; } EXPORT_SYMBOL(add);

然后编译模块,编译完后会生成Module_symvers

现在进入b文件模块源码,把a文件的Module_symvers这个文件复制到b模块,就能用了,这些说明b模块依赖a模块,卸载的时候要先卸载b在卸载a

内核一些文件

Kconfig:总菜单

.config:点的菜单

比如我想把我的模块编译进内核的话,我首先是不是要让菜单里面加菜呢,

就是首先让我的模块加载进Kconfig文件

你有菜单的话,你是不是开始会选择一些菜呢,已经选好的配置,就是根据这个config文件来选择的

把驱动编译进内核:

1:创建存放驱动的目录

如把helloworld 驱动放在drivers/char/hello 目录下,把驱动程序考进来

cd drivers/char mkdir hello cp /home/topeet/nfs/helloworld.c ./

2:创建Kconfig文件

config HELLO tristate "hello world" help hello hello
在drivers/char/hello 目录下使用 touch Makefile 命令创建 Makefile文件
obj-$(CONFIG_HELLO) +=helloworld.o
接下来修改上一级目录的Kconfig文件和Makefile文件
obj-y += hello/
source "drivers/char/hello/Kconfig"
3:配置.config文件

修改内核配置,在device/char下面有hello

make menuconfig

cp ./config arch/arm64/configs/rockchip_linux_defconfig ./build.sh

完成

http://www.jsqmd.com/news/618795/

相关文章:

  • DVWA文件上传漏洞通关实录:从Low到High,手把手教你三种绕过姿势(附Burp Suite实战)
  • 2026雅思听力提分app推荐:精选高效工具助你冲刺高分 - 品牌2025
  • 基于 Helm + Argo CD 的 Kubernetes GitOps 多环境( dev/test/prod)自动化部署实践
  • 聊一聊 C# 中的闭包陷阱:foreach 循环的坑你还记得吗?夯
  • 告别粗放营销,用绿色积分搭建门店长效经营体系
  • 把用户主数据放到该放的位置,聊透 SAP NetWeaver AS ABAP 里的 User Data Synchronization
  • 二次元游戏模组管理革命:为什么你需要一个统一的启动器平台?
  • 2026年光辉海棠树木厂家推荐:美国红枫/紫叶稠李/青仟云杉树木厂家——开原市小松苗圃 - 品牌推荐官
  • 国产知识库软件哪个好?8 款类 Confluence 工具横向对比
  • 5分钟让Windows 11焕然一新:极速系统加速与性能优化终极指南
  • GitHub汉化插件终极指南:3步让GitHub界面全面中文化
  • 软考 系统架构设计师历年真题集萃(237)
  • AidLux远程SSH连接实战 | 密钥与密码双模式详解
  • 理想汽车又孵化一家具身公司......
  • 2026年4月SEM原位纳米压痕仪的技术架构与供应商核心技术边界——从超高真空兼容到亚微牛级力反馈的工程实现 - 品牌推荐大师1
  • HarmonyOS音频播放核心规范:从“能响”到“专业”
  • Switch第三方控制器终极指南:用sys-con解锁全平台手柄支持 [特殊字符]
  • ROS2 Jazzy/Rollin连接PX4仿真与实机切换指南:一个Launch文件搞定两种模式
  • Piggy_Packages V2026.1 帮助文档(一)开箱即用
  • ABAP 平台里的用户认证与单点登录,从密码登录到 SAML 2.0 的落地路径
  • 千帆竞发:126颗卫星升空背后的全球卫星互联网竞速
  • 2026雅思听力素材App推荐:精选高效备考神器助你提分 - 品牌2025
  • 如何快速解决Windows热键冲突:Hotkey Detective终极使用指南
  • 无人机多模态火灾图像识别 多光谱野火识别 智慧林业火灾识别 火灾识别图像数据集 多模态数据集 可见光+红外图像对其数据集第10652期
  • 终极键盘防抖指南:如何彻底解决机械键盘连击问题
  • Windows系统部署工具终极指南:3大优势实现自动化安装方案
  • 2026年云南有实力的钢管、钢板、无缝管、钢结构、钢材厂家选型推荐手册 - 深度智识库
  • LeetCode 删除无效的括号:python 题解诜
  • 告别虚拟机!在WSL2的Ubuntu里5分钟跑通LVGL v9.2图形界面(附SDL2配置避坑)
  • C++11新特性 智能指针