当前位置: 首页 > 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;构建了物理空间与信息空间中人、机、物、环境、信息等要素相互映射、适时交互、高效协同的复杂系…...

如何利用Browserify代码覆盖率分析提升JavaScript应用质量:完整工具链指南

如何利用Browserify代码覆盖率分析提升JavaScript应用质量&#xff1a;完整工具链指南 【免费下载链接】browserify-handbook how to build modular applications with browserify 项目地址: https://gitcode.com/gh_mirrors/br/browserify-handbook 在前端开发中&#…...

基于Matlab实现 IEEE33节点配电网系统simulink仿真模型,并配套前推回代法潮流计算程序

基于Matlab实现 IEEE33节点配电网系统simulink仿真模型&#xff0c;并配套前推回代法潮流计算程序。 改进的IEEE33节点&#xff0c;潮流计算&#xff0c;电压分析&#xff0c;可自行加风机光伏&#xff0c;接电动机负载。 结果图如图所展示&#xff0c;附带IEEE33节点数据MATLA…...

GPU算力优化实践:Pixel Epic智识终端显存配额与逻辑发散调参详解

GPU算力优化实践&#xff1a;Pixel Epic智识终端显存配额与逻辑发散调参详解 1. 引言&#xff1a;当像素冒险遇上AI研究 在科研领域&#xff0c;我们常常面临一个两难选择&#xff1a;要么追求严谨性而牺牲创造力&#xff0c;要么放飞思维却失去逻辑性。Pixel Epic智识终端通…...

Shell脚本自动化监控:用curl的-w参数批量检查网站健康状态(附完整脚本)

Shell脚本自动化监控&#xff1a;用curl的-w参数批量检查网站健康状态 最近在维护公司十几个微服务时&#xff0c;我发现手动检查每个接口状态简直是一场噩梦。直到重新审视了curl的-w参数&#xff0c;才意识到这个被低估的功能能带来怎样的效率革命。本文将分享如何用Shell脚本…...

保姆级教程:在CentOS 7上配置sysstat实现24小时性能监控(含报警设置)

CentOS 7系统性能监控全攻略&#xff1a;从sysstat配置到智能报警实战 对于Linux系统管理员而言&#xff0c;持续监控服务器性能指标就像医生定期检查病人生命体征一样重要。sysstat工具包中的sar命令提供了这种"全天候体检"能力&#xff0c;但很多初学者往往止步于基…...

Gemma-3-12b-it真实作品集:10组高质量图片问答对话效果分享

Gemma-3-12b-it真实作品集&#xff1a;10组高质量图片问答对话效果分享 1. 工具概览 1.1 核心能力简介 Gemma-3-12b-it是一款基于Google大模型技术开发的多模态交互工具&#xff0c;能够同时处理图片和文本输入&#xff0c;为用户提供智能问答服务。不同于常见的纯文本对话机…...

AppImageLauncher:5分钟掌握Linux AppImage应用的终极管理方案

AppImageLauncher&#xff1a;5分钟掌握Linux AppImage应用的终极管理方案 【免费下载链接】AppImageLauncher Helper application for Linux distributions serving as a kind of "entry point" for running and integrating AppImages 项目地址: https://gitcode…...

保姆级避坑指南:在Ubuntu 22.04上搞定Hi3516CV610 SDK环境(附完整依赖包清单)

保姆级避坑指南&#xff1a;在Ubuntu 22.04上搞定Hi3516CV610 SDK环境&#xff08;附完整依赖包清单&#xff09; 第一次接触海思Hi3516CV610开发板的开发者&#xff0c;往往会在搭建SDK环境时踩不少坑。Ubuntu 22.04作为较新的LTS版本&#xff0c;与海思官方推荐的开发环境存在…...

论文阅读:arxiv 2026 Agent Privilege Separation in OpenClaw: A Structural Defense Against Prompt Injectio

总目录 大模型安全研究论文整理 2026年版&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/159047894 https://arxiv.org/abs/2603.13424 Agent Privilege Separation in OpenClaw: A Structural Defense Against Prompt Injection 该论文名为《Agent Privilege …...

别再手动整理了!用这招自动同步思维导图到Markdown(支持ProcessOn/XMind/MindNode)

思维导图与Markdown自动化同步实战指南 每次会议结束后的文档整理是否让你头疼&#xff1f;技术文档的频繁更新是否消耗了你大量时间&#xff1f;本文将为你揭示一套零干预的自动化工作流&#xff0c;只需专注思维导图创作&#xff0c;Markdown文档会自动同步更新。告别复制粘贴…...