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

Ubuntu18.04添加内核模块(字符设备)

Ubuntu18.04添加内核模块(字符设备)

虚拟机Ubuntu18.04(内核版本linux-5.4.0-135-generic)

参考

嵌入式Linux驱动开发(一)——字符设备驱动框架入门

1 编译内核模块

  • 创建字符设备代码文件char_dev.c
#include <linux/init.h>     //定义了module_init
#include <linux/module.h>   //最基本的头文件,其中定义了MODULE_LICENSE这一类宏
#include <linux/fs.h>       // file_operations结构体定义在该头文件中
#include <linux/device.h>    //class、class_device结构体的定义位置static const char* devive_name = "first_driver";  //  定义设备名
static struct class *first_class;    //定义class结构体
static struct device *first_dev;    //定义device结构体//定义了open函数
static int first_drv_open (struct inode *inode, struct file *file)
{printk("open\n");return 0;
}//定义了write函数
static ssize_t first_drv_write (struct file *file, const char __user *buf, size_t size, loff_t * ppos)
{printk("write\n");return 0;
}//在file_operations中注册open和write函数
static struct file_operations first_drv_fo =
{.owner  =  THIS_MODULE,//将对应的函数关联在file_operations的结构体中.open   =  first_drv_open,      .write  =  first_drv_write,
};static int dev_id = 0;     //初始化的设备号0
//init驱动的入口函数
static int __init first_drv_init(void)
{      //注册设备,实际是将file_operations结构体放到内核的制定数组中,以便管理//在register_chrdev中制定dev_id作为主设备号,若dev_id为0则自动分配一个主设备号dev_id = register_chrdev(dev_id, devive_name , &first_drv_fo);first_class = class_create(THIS_MODULE, "first_drv");    //初始化class结构体,指定设备文件名first_dev = device_create(first_class, NULL, MKDEV(dev_id, 0), NULL, "first_drv");// 根据class来初始化device,会创建出对应的设备文件 /dev/first_drvprintk("init\n");return 0;
}//驱动的出口函数
static void __exit first_drv_exit(void)
{printk("exit\n");unregister_chrdev(dev_id, devive_name);  //卸载设备,实际是将file_operations结构体从内核维护的相关数组中以主设备号作为索引删除device_unregister(first_dev); // 后创建的先卸载class_destroy(first_class);
}//内核将通过这个宏,来直到这个驱动的入口和出口函数
module_init(first_drv_init);  
module_exit(first_drv_exit);MODULE_AUTHOR("Ethan Lee <4128127@qq.com>");
MODULE_LICENSE("GPL");  //指定协议
  • 同目录下创建Makefile文件:
obj-m += char_dev.o
KERN_DIR=/usr/src/linux-headers-5.4.0-135-genericall:make -C ${KERN_DIR} M=${shell pwd} modulesclean:rm -f *.ko *.o *.mod.o *.mod.c *.sysvers
  • 编译:
make

2 加载内核模块

sudo insmod char_dev.ko
  • 查看是否添加成功:
cat /proc/devices

结果如下:

Character devices:...189 usb_device204 ttyMAX226 drm240 first_driver  #这里是我们添加的模块241 aux242 hidraw
...Block devices:7 loop8 sd9 md11 sr65 sd66 sd
...
  • 创建一个测试程序char_dev_test.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>int main(int argc, char **argv)
{int fd;      //声明设备描述符int val = 1;  //随便定义变量传入到fd = open("/dev/first_drv",  O_RDWR);  //根据设备描述符打开设备if(fd < 0)          //打开失败printf("can't open\n");  write(fd, &val, 4);  //根据文件描述符调用writereturn 0;
}
  • 编译并运行测试程序:
gcc char_dev_test.c -o char_dev_testsudo ./char_dev_test
  • 查看结果:
$ dmesg  | tail -10
[ 1746.094412] CPU3 has been hot-added
[ 1746.094945] CPU4 has been hot-added
[ 1746.097525] CPU5 has been hot-added
[ 1746.098038] CPU6 has been hot-added
[ 1746.098708] CPU7 has been hot-added
[ 2861.264107] char_dev: loading out-of-tree module taints kernel.
[ 2861.264142] char_dev: module verification failed: signature and/or required key missing - tainting kernel
[ 2861.264398] init
[ 3070.234439] open
[ 3070.234441] write

3.卸载内核模块

sudo rmmod char_dev
  • 查看结果:
$ dmesg  | tail -1
[ 4282.264114] exit

相关文章:

Ubuntu18.04添加内核模块(字符设备)

Ubuntu18.04添加内核模块&#xff08;字符设备&#xff09; 虚拟机Ubuntu18.04&#xff08;内核版本linux-5.4.0-135-generic&#xff09; 参考 嵌入式Linux驱动开发&#xff08;一&#xff09;——字符设备驱动框架入门 1 编译内核模块 创建字符设备代码文件char_dev.c&a…...

PromptBreeder---针对特定领域演化和发展提示词的方法

原文地址&#xff1a;promptbreeder-evolves-adapts-prompts-for-a-given-domain 论文地址&#xff1a;https://arxiv.org/pdf/2309.16797.pdf 2023 年 10 月 6 日 提示方法分为两大类 硬提示是由人工精心设计的文本提示&#xff0c;包含离散的输入令牌&#xff1b;其缺点…...

Java后端八股文之Redis

文章目录 1. Redis是什么&#xff1f;2. Redis为什么这么快&#xff1f;3. 为什么要使用缓存&#xff1f;4. Redis几种使用场景&#xff1a;5. Redis的Zset底层为什么要使用跳表而不是平衡树、红黑树或者B树&#xff1f;6.Redis持久化6.1 什么是RDB持久化6.1.1RDB创建快照会阻塞…...

一维数组_与指定数相同的数的个数

任务描述 输出一个整数序列中与指定数字相同的数的个数。 输入格式: 第一行为N&#xff0c;表示整数序列的长度(N < 100)&#xff1b; 第二行为N个整数&#xff0c;整数之间以一个空格分开&#xff1b; 第三行包含一个整数&#xff0c;为指定的整数m。输出格式: 输出为N…...

如何在Linux系统安装SVN并配置固定公网地址远程访问【内网穿透】

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…...

获取webshell的十种方法

一、直接上传获取webshell 这种对php和jsp的一些程序比较常见&#xff0c;MolyX BOARD就是其中一例&#xff0c;直接在心情图标管理上传。php类型&#xff0c;虽然没有提示&#xff0c;其实已经成功了&#xff0c;上传的文 件url应该是http://forums/images/smiles/下&#xf…...

项目实战-tpshop商城项目

项目实战-tpshop商城项目 环境部署准备软件工具准备远程连接测试远程连接测试-查看虚拟机IP地址远程连接测试-检测本机与虚拟机是否连通远程连接测试-通过远程工具连接linux服务器 常见问题处理 环境部署项目技术架构介绍部署tpshop项目-tpshop验证数据库验证用户信息表熟悉商品…...

网络地址转换协议NAT

网络地址转换协议NAT NAT的定义 NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;是1994年提出的。当在专用网内部的一些主机本来已经分配到了本地IP地址&#xff08;即仅在本专用网内使用的专用地址&#xff09;&#xff0c;但现在又想和因…...

Vue教学18:Element UI进阶组件探索,提升Vue应用的专业性

大家好&#xff0c;欢迎回到我们的Vue教学系列博客&#xff01;在前十七篇博客中&#xff0c;我们学习了Vue.js的基础知识、安装Node.js与npm、使用Vue Devtools进行调试、Vue实例与生命周期钩子、数据绑定&#xff08;单向与双向&#xff09;、计算属性与侦听器、条件渲染和列…...

UE5.1_TimeLine

UE5.1_TimeLine 问题引入&#xff1a;UE的Timeline可以在一个场景下无限制的使用多少次&#xff1f;一个动画流程的Timeline的时间持续怎么算?TimeLine中嵌套Timeline的做法是否是合理的&#xff1f;...

Qt自定义控件

自定义控件 目的&#xff1a;将多个控件或者窗口作为一个整体被多次复用。 操作方式 1.首先进行自定义的ui设计&#xff0c;以及对应的.h和.cpp文件 2.到要使用的UI界面上&#xff0c;从控件库中拖拽一个Widget控件 3.右键点击"提升为" 4.填写自定义实现的类名&…...

nRF52832——串口 UART 和 UARTE 外设应用

nRF52832——串口 UART 和 UARTE 外设应用 UART 和 UARTE 原理UART 功能描述UARTE 功能介绍 应用实例串口打印实例串口输入与回环UART 模式串口中断 UART 和 UARTE 原理 UART 功能描述 串口 UART 也称为通用异步收发器。是各种处理器中常用的通信接口&#xff0c;在 nRF52 芯…...

String 底层为什么使用 final 修饰?

1、典型回答 对于这个问题&#xff0c;Java之父詹姆斯 高斯林&#xff08;James Gosling&#xff09; 是这样回答的&#xff1a; I would use an immutable whenever I can 翻译为中文&#xff1a;只要允许&#xff0c;我就会使用不可变对象 而作为普通人的我们来说&#xff0…...

NIN网络中的网络

是什么 intro LeNet→AlexNet→VGG→NiN→GoogLeNet→ResNetLeNet→AlexNet→VGG 卷积层模块充分抽取空间特征全连接层输出分类结果AlexNet & VGG 改进在于把两个模块加宽 、加深&#xff08;加宽指增加通道数&#xff0c;那加深呢&#xff1f;&#xff08;层数增加叭 Ni…...

Cloudflare Tunnel:无惧DDOS_随时随地安全访问局域网Web应用

利用此方法&#xff0c;您可以在局域网&#xff08;尤其是NAS&#xff09;上搭建的Web应用支持公网访问&#xff0c;成本低而且操作简单&#xff01; 如果这是博客的话&#xff0c;它还可以有效防止DDOS攻击&#xff01; 准备工作&#xff1a; 需要一个域名&#xff08;推荐N…...

高质量快刊!中科院1区TOP,Elsevier出版社,最快2个月23天录用!20天见刊!

【SciencePub学术】 01 期刊基本信息 【期刊简介】IF&#xff1a;11.0-11.5&#xff0c;JCR1区&#xff0c;中科院1区TOP 【出版社】Elsevier出版社 【版面情况】正刊&#xff0c;2023.3.31截稿 【检索情况】SCIE&EI双检&#xff0c;预计3个月左右录用 【征稿领域】…...

C++感受2-逐字逐句,深入理解C++最小例程

以 “Hello World” 例程为载体、线索&#xff0c;在完成 “间接名字空间限定” 写法转换到“直接名字空间限定”的过程&#xff0c;同时掌握函数、主函数、函数调用、级联操作、声明、类型、int、字符串类型、头文件包含、行为数据、流输出操作符、标准输出流对象、标准库名字…...

RabbitMQ 面试题及答案整理,最新面试题

RabbitMQ的核心组件有哪些&#xff1f; RabbitMQ的核心组件包括&#xff1a; 1、生产者&#xff08;Producer&#xff09;&#xff1a; 生产者是发送消息到RabbitMQ的应用程序。 2、消费者&#xff08;Consumer&#xff09;&#xff1a; 消费者是接收RabbitMQ消息的应用程序…...

字节算法-链表翻转与变形

文章目录 题目与变形解法 题目与变形 字节一面中关于 K个一组链表反转 的题目变形。 K个一组链表反转。K个一组链表反转&#xff0c;链表尾不足K个的元素也需要反转。K个一组链表反转&#xff0c;但是从链表尾部开始反转。反转从位置 left 到位置 right 的链表节点 解法 四…...

十一、软考-系统架构设计师笔记-未来信息综合技术

1、信息物理系统技术概述 信息物理系统的概念 信息物理系统(Cyber-Physical Systems&#xff0c;CPS)通过集成先进的感知、计算、通信、控制等信息技术和自动控制技术&#xff0c;构建了物理空间与信息空间中人、机、物、环境、信息等要素相互映射、适时交互、高效协同的复杂系…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...