Linux编译内核模块生成.KO驱动示例

        现在的Linux内核十分庞大,驱动繁多,但是仍有一些是内核所不包含的,或者我们前期进行了内核裁剪,但后面又需要添加一些驱动,但是又不想重新烧录内核,这时候就可以使用内核模块功能,对内核驱动进行动态的调整。

        下面描述一种最简单的模块编译安装示例,主要参考linux学习笔记(五)编译内核模块生成ko驱动文件_ko文件编译-CSDN博客,但该博客不够完善,特补充说明。

        我们先准备一个文件夹,用于测试,比如就叫hello。里面有两个文件hello.c和Makefile。

        hello.c的内容如下


#include <linux/init.h>
#include <linux/module.h>static int __init hello_init(void)
{printk(KERN_INFO "Hello World enter\n");return 0;
}
module_init(hello_init);static void __exit hello_exit(void)
{printk(KERN_INFO "Hello World exit\n ");
}
module_exit(hello_exit);MODULE_AUTHOR("mushike");
MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("A simple Hello World Module");
MODULE_ALIAS("a simplest module");

        Makefile 的内容如下

KVERS = $(shell uname -r)
CURDIR= $(shell pwd)obj-m += hello.obuild: kernel_modules
kernel_modules:make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modulesclean:make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean

        这个时候其实还有问题,会提示找不到文件,因为我们的hello文件夹位置是自定义的,而头文件是使用的相对路径,所以找不到。

        我们需要添加头文件的路径,以VSCODE为例,我们打开hello文件夹。按下“CTRL+SHIFT+P”,然后找到C/C++:Edit configuration(JSON),添加上路径如下所示,我这里使用的是绝对路径,因为是在PC虚拟机上用的,所以架构是X86,如果你是在ARM上开发,记得调整。

        接下来使用make就可以编译生成.KO文件了。 

        使用modinfo查看信息,与我们hello.c中设置的一样。

 

        接下来我们使用insmod进行安装,安装完毕后可以使用lsmod查看 ,可以看到多出了hello模块。

     因为我们注册hello时使用printk进行了打印,我们可以查看下内核日志 ,输入dmesg -T,可以看到日志信息,最后一条即为内核模块hello安装时的打印。

        以上只是个示例,如果是实际的驱动,比如点亮一个灯这种,那么我们需要将它做成一个字符设备,要做的内容包括跟具体硬件相关的引脚配置,时钟配置,引脚电平操作等。跟linux设备框架相关的需要分配设备名称,内存映射,设备操作函数,创建设备节点等。

        全部完成之后通过ls /dev/就可以看到新增的设备,能够对设备进行操作了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/670372.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动力电池热管理方案介绍与发展方向

摘要 随着电动汽车的快速发展&#xff0c;高性能的动力电池系统成为推动电动汽车产业发展的重要因素。然而&#xff0c;伴随着能量密度提高和放电深度增加&#xff0c;电池热管理问题逐渐凸显。良好的热管理方案能够提高电池的寿命&#xff0c;保障电池性能&#xff0c;延长电…

ASRPRO

https://gitee.com/gitee-128/ASR-PRO-U8G2/tree/main 不下载模型 语音就是天问51唤醒我 u8g2的移植过程 第一步 下载u8g2的源代码 第二步 修改 delay and 函数 第三步 添加头文件 显示 显示 动画 SPI I2C(SOFT SPI ;SOFT I2C U8G2 移植过程&#xff08;移植过程参考…

外贸知识篇 | 免堆期和免箱期,一次分清楚!

免箱期和免堆期这两个期限 对于货代人或者货主来说都是十分重要的 一不留神就会产生额外的异常费用 但很多人还是有些傻傻分不清楚 今天我们就简单的聊下 一、深入解读免堆期 免堆期&#xff0c;英文称为Free Demurrage&#xff0c;是指在码头堆场或内陆堆场允许集装箱免…

图像处理-图像平滑

图像平滑 前言一、概念介绍1.1 图像的平滑1.2 图像中噪声的分类1.3 MATLAB的添加噪音代码 二、空间域平滑滤波2.1 均值滤波2.2 原理计算 总结 前言 在图像的获取、传输和存储过程常常收到各种噪声的干扰和影响&#xff0c;使得图像的质量下降&#xff0c;为了获得高质量的数字…

C语言—控制语句

控制语句就是用来实现对流程的选择、循环、转向和返回等控制行为。 分支语句 if语句 基本结构 if(表达式) { 语句块1&#xff1b; } else { 语句块2&#xff1b; } 执行顺序&#xff1a; 如果表达式判断成立&#xff08;即表达式为真&#xff09;&#xff0c;则执行语句块…

2024测试员最佳跳槽频率是多少?进来看看你是不是符合!

最近笔者刷到一则消息&#xff0c;一位测试员在某乎上分享&#xff0c;从月薪5K到如今的20K&#xff0c;他总共跳了10次槽&#xff0c;其中还经历过两次劳动申诉&#xff0c;拿到了大几万的赔偿&#xff0c;被同事们称为“职场碰瓷人”。 虽说这种依靠跳槽式的挣钱法相当奇葩&…

【GameFi】链游 | Seraph | 区块链上的动作角色扮演 NFT 装备收集和掠夺游戏

官网下载 新赛季公告&#xff1a;https://www.seraph.game/#/news/357 开始时间&#xff1a;2024年4月19日 11:00 (UTC8&#xff09; discard会有人发送一些激活码&#xff0c;或者有一些活动&#xff0c;只需要填表格关注账号&#xff0c;参与了就会将激活码发到你的邮箱 …

记一次动态规划的采坑之旅, 741摘樱桃 https://leetcode.cn/problems/cherry-pickup/description/

首次看题目时&#xff0c;发现是困难。立马想到了&#xff0c;动态规划。 再看题目&#xff0c; 摘樱桃&#xff0c;还要返回摘两次&#xff0c;求摘最多的樱桃。 大脑第一反应就是&#xff1a; 先使用动态规划&#xff0c;找到 0 0 到 n-1 n-1处走过的最大樱桃&#xff0c; 并…

okcc最新版本会被盗打吗?

OKCC是一款智能外呼系统&#xff0c;它提供了多种安全措施来防止系统被盗打。以下是一些关键的安全配置和管理措施&#xff1a; 立即挂失SIM卡&#xff1a;一旦发现OKCC系统被盗打&#xff0c;应立即联系运营商进行SIM卡的挂失&#xff0c;以阻止盗打者继续使用您的号码进行通信…

软件设计师-应用技术-数据流图题1

基础知识及技巧&#xff1a; 0. 概念&#xff1a; 在结构化分析中&#xff0c;数据流图用来记录系统中的数据和数据在特定的过程中的流动&#xff0c;即数据如何被采集、处理、保存和使用的(围绕信息系统的功能)。 1. 元素实例&#xff1a; 补充知识&#xff1a;** 外部实体…

Unreal Engine插件打包技巧

打开UE工程&#xff0c;点击编辑&#xff0c;选择插件&#xff0c;点击"打包"按钮&#xff0c;选择输出目录UE4.26版本打包提示需要VS2017问题解决 1&#xff09;用记事本打开文件【UE4对应版本安装目录\Epic Games\UE_4.26\Engine\Build\BatchFiles\RunUAT.bat】 2&…

连锁收银系统总仓到门店库存调拨操作教程

1、进入系统后台&#xff0c;系统后台登录网址&#xff1a; 2、点击商品>门店调拨 3、选择调出仓库和调入门店 4、可选择添加商品逐个进行调拨&#xff0c;也可以批量导入需要调拨的商品 然后点击确定。 5、新增调拨后&#xff0c;系统会显示“待出库”状态 6、仓库已经准备…