驱动开发-用户空间和内核空间数据传输
1.用户空间-->内核空间(写)
#include<linux/uaccess.h>
int copy_from_user(void *to,const void __user volatile*from,unsigned long n)
函数功能:将用户空间数据拷贝到内核空间
参数:
to:内核空间首地址
from:用户空间首地址
n:拷贝大小
返回值:成功返回0
失败返回拷贝的字节数
2.内核空间-->用户空间(读)
int copy_to_user(void __user volatile *to,const void *from,unsigned long n)
函数功能:将内核空间数据拷贝到用户空间
参数:
to:用户空间首地址
from:内核空间首地址
n:拷贝大小
返回值:成功返回0
失败返回拷贝的字节数
驱动代码:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/uaccess.h>#define CNAME "myled"
unsigned int major;
char kbuf[128] = {};int myled_open(struct inode *inode,struct file *file)
{printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);return 0;
}ssize_t myled_read(struct file *file,char __user *ubuf,size_t size,loff_t *loff)
{int ret;printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);//如果用户空间想要读的数据大小,大于内核空间,更正大小if(size > sizeof(kbuf)){size = sizeof(kbuf);}//将内核空间数据,拷贝到用户空间ret = copy_to_user(ubuf,kbuf,size);if(ret){printk("copy to user is error\n");return -EIO;}return size;
}ssize_t myled_write(struct file *file,const char __user *ubuf,size_t size,loff_t *loff)
{int ret;printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);//如果用户空间想要写的数据大小,大于内核空间,更正大小if(size > sizeof(kbuf)){size = sizeof(kbuf);}//将用户空间的数据,拷贝到内核空间ret = copy_from_user(kbuf,ubuf,size);if(ret){printk("copy from user is error\n");return -EIO;}printk("kbuf = %s\n",kbuf);//打印用户空间传递到内核空间的数据return size;
}int myled_close(struct inode *inode,struct file *file)
{printk("%s:%s:%d\n",__FILE__,__func__,__LINE__);return 0;
}//操作方法结构体
const struct file_operations fop =
{.open = myled_open,.write = myled_write,.read = myled_read,.release = myled_close,
};//入口 insmod
static int __init demo_init(void)
{//注册字符设备驱动major = register_chrdev(0,CNAME,&fop);if(major < 0){printk("register chrdev is error\n");return -EIO;}printk("major = %d\n",major);//打印主设备号的值return 0;
}//出口 rmmod
static void __exit demo_exit(void)
{//注销字符设备驱动unregister_chrdev(major,CNAME);}module_init(demo_init);//指定入口函数地址
module_exit(demo_exit);//指定出口函数地址
MODULE_LICENSE("GPL");//许可证
应用层代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>int main(int argc,const char * argv[])
{int fd = -1;char buf[128] = "hello world";fd = open("/dev/myled",O_RDWR);//打开设备文件if(fd == -1){perror("open is error");exit(1);}write(fd,buf,sizeof(buf));//写入数据memset(buf,0,sizeof(buf));//清零read(fd,buf,sizeof(buf));//读取数据printf("user buf = %s\n",buf);close(fd);//关闭文件描述符return 0;
}
相关文章:
驱动开发-用户空间和内核空间数据传输
1.用户空间-->内核空间(写) #include<linux/uaccess.h> int copy_from_user(void *to,const void __user volatile*from,unsigned long n) 函数功能:将用户空间数据拷贝到内核空间 参数: to:内核空间首地…...
【408精华知识】速看!各种排序的大总结!
文章目录 一、插入排序(一)直接插入排序(二)折半插入排序(三)希尔排序 二、交换排序(一)冒泡排序(二)快速排序 三、选择排序(一)简单选…...
【STM32 |程序实例】按键控制、光敏传感器控制蜂鸣器
目录 前言 按键控制LED 光敏传感器控制蜂鸣器 前言 上拉输入:若GPIO引脚配置为上拉输入模式,在默认情况下(GPIO引脚无输入),读取的GPIO引脚数据为1,即高电平。 下拉输入:若GPIO引脚配置为下…...
Spring boot使用websocket实现在线聊天
maven依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spr…...
品牌设计理念和logo设计方法
一 品牌设计的目的 设计是为了传播,让传播速度更快,传播效率更高,减少宣传成本 二 什么是好的品牌设计 好的设计是为了让消费者更容易看懂、记住的设计, 从而辅助传播, 即 看得懂、记得住。 1 看得懂 就是让别人看懂…...
Python | Leetcode Python题解之第88题合并两个有序数组
题目: 题解: class Solution:def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:"""Do not return anything, modify nums1 in-place instead."""p1, p2 m - 1, n - 1tail m n - 1whi…...
vscode新版本remotessh服务端报`GLIBC_2.28‘ not found解决方案
问题现象 通过vscode的remotessh插件连接老版本服务器(如RHEL7,Centos7)时,插件会报错,无法连接。 查看插件的错误日志可以看到类似如下的报错信息: dc96b837cf6bb4af9cd736aa3af08cf8279f7685/node: /li…...
盘他系列——oj!!!
1.Openjudge 网站: OpenJudge 2.洛谷 网站: 首页 - 洛谷 | 计算机科学教育新生态 3.环球OJ 网站: QOJ - QOJ.ac 4. 北京大学 OJ:Welcome To PKU JudgeOnline 5.自由OJ 网站: https://loj.ac/ 6.炼码 网站:LintCode 炼码 8.力扣 网站: 力扣 9.晴练网首页 - 晴练网...
洛谷 P2657 [SCOI2009] windy 数 题解 数位dp
[SCOI2009] windy 数 题目背景 windy 定义了一种 windy 数。 题目描述 不含前导零且相邻两个数字之差至少为 2 2 2 的正整数被称为 windy 数。windy 想知道,在 a a a 和 b b b 之间,包括 a a a 和 b b b ,总共有多少个 windy 数&…...
Python爬虫入门:网络世界的宝藏猎人
今天阿佑将带你踏上Python的肩膀,成为一名网络世界的宝藏猎人! 文章目录 1. 引言1.1 简述Python在爬虫领域的地位1.2 阐明学习网络基础对爬虫的重要性 2. 背景介绍2.1 Python语言的流行与适用场景2.2 网络通信基础概念及其在数据抓取中的角色 3. Python基…...
【NodeMCU实时天气时钟温湿度项目 6】解析天气信息JSON数据并显示在 TFT 屏幕上(心知天气版)
今天是第六专题,主要内容是:导入ArduinoJson功能库,借助该库解析从【心知天气】官网返回的JSON数据,并显示在 TFT 屏幕上。 如您需要了解其它专题的内容,请点击下面的链接。 第一专题内容,请参考&a…...
重构四要素:目的、对象、时机和方法
目录 1.引言 2.重构的目的:为什么重构(why) 3.重构的对象:到底重构什么(what) 4.重构的时机:什么时候重构(when) 5.重构的方法:应该如何重构(how) 6.思考题 1.引言 一些软件工程师对为什么要重构(why)、到底重构什么(what)、什么时候重构(when)应该如何重构(how)等问题的…...
基于Echarts的大数据可视化模板:服务器运营监控
目录 引言背景介绍研究现状与相关工作服务器运营监控技术综述服务器运营监控概述监控指标与数据采集可视化界面设计与实现数据存储与查询优化Echarts与大数据可视化Echarts库以及其在大数据可视化领域的应用优势开发过程和所选设计方案模板如何满足管理的特定需求模板功能与特性…...
Python3 笔记:Python的常量
常量(constant):跟变量相对应,指第一次赋予值后就保持固定不变的值。 Python里面没有声明常量的关键字,其他语言像C/C/Java会有const修饰符,但Python没有。 Python中没有使用语法强制定义常量,…...
【Linux】自动化构建工具make/Makefile和git介绍
🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343🔥 系列专栏:https://blog.csdn.net/qinjh_/category_12625432.html 目录 前言 Linux项目自动化构建工具-make/Makefile 举例 .PHONY 常见符号 依赖关系…...
C语言—关于字符串(编程实现部分函数功能)
0.前言 当我们使用这些函数功能时,可以直接调用头文件---#include<string.h>,然后直接使用就行了,本文只是手动编写实现函数的部分功能 1.strlen函数功能实现 功能说明:strlen(s)用来计算字符串s的长度,该函数计数不会包括最…...
picoCTF-Web Exploitation-Trickster
Description I found a web app that can help process images: PNG images only! 这应该是个上传漏洞了,十几年没用过了,不知道思路是不是一样的,以前的思路是通过上传漏洞想办法上传一个木马,拿到webshell,今天试试看…...
SSH 免密登录,设置好仍然需要密码登录解决方法
说明: ssh秘钥登录设置好了,但是登录的时候依然需要提供密码 查看系统安全日志,定位问题 sudo cat /var/log/auth.log或者 sudo cat /var/log/secure找到下面的信息 Authentication refused: bad ownership or modes...(网上的…...
【斑马打印机】web前端页面通过BrowserPrint API连接斑马打印机进行RFID条形码贴纸打印
web前端页面通过BrowserPrint API连接斑马打印机进行RFID条形码贴纸打印 在现代物流、仓储和零售行业中,RFID和二维码技术发挥着至关重要的作用。这些技术不仅提高了效率,还增强了追踪和管理的能力。本文将介绍如何使用JavaScript和斑马打印机的BrowserPrint API来打印RFID二…...
DigitalOcean 应用托管更新:应用端到端运行时性能大幅改进
DigitalOcean 希望可以为企业提供所需的工具和基础设施,以帮助企业客户加速云端的开发,实现业务的指数级增长。为此 DigitalOcean 在 2020 年就推出了App Platform。 App Platform(应用托管) 是一个完全托管的 PaaS 解决方案&…...
HR 简历管理软件全解析:功能、价值与实操指南
企业招聘过程中,简历管理是 HR 工作的核心环节。随着招聘渠道多元化与简历数量激增,传统人工管理模式已难以满足需求,存在效率低、易遗漏、难复用等问题。 HR 简历管理软件作为专业化工具,能实现简历集中整合、智能解析、高效筛选…...
2025届最火的五大降AI率方案实测分析
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在数字化内容生产这一来由之处,过度去依赖人工智能生成内容也就是AIGC࿰…...
利用快马AI快速生成浏览器内容增强插件原型
利用快马AI快速生成浏览器内容增强插件原型 最近在开发一个浏览器插件时,发现从零开始搭建整个项目框架特别耗时。特别是当需要快速验证一个插件创意是否可行时,传统开发方式往往需要花费大量时间在基础架构上。这时候,我发现InsCode(快马)平…...
FPGA新手必看:用Riffa框架快速搭建PCIe测试环境(附避坑指南)
FPGA新手必看:Riffa框架实战指南——从零构建PCIe测试环境 第一次接触PCIe开发的FPGA工程师,往往会被复杂的协议栈和软硬件协同问题吓退。三年前我刚接手一个高速数据采集项目时,面对Xilinx官方文档里成百上千页的PCIe规范说明,整…...
FastDFS系统监控告警集成:企业微信与钉钉通知全攻略
FastDFS系统监控告警集成:企业微信与钉钉通知全攻略 【免费下载链接】fastdfs FastDFS is a high performance distributed file system (DFS). Its major functions include: file storing, file syncing and file accessing, and design for high capacity and lo…...
利用codex与快马平台,十分钟快速生成待办事项应用原型
最近在尝试快速验证一个待办事项应用的想法,发现用InsCode(快马)平台配合AI模型真的能十分钟就搞出可运行的原型。整个过程特别适合像我这样想快速验证产品概念的人,记录下具体操作和思考过程。 明确核心功能需求 首先梳理出最简功能清单:输入…...
seo泛站群的合法性问题如何避免_seo泛站群的运营团队应该怎样组建
SEO泛站群的合法性问题如何避免 在当前的互联网市场中,SEO(搜索引擎优化)是一个重要的营销手段,其中泛站群(SEO泛站群)作为一种策略被广泛使用。泛站群的合法性问题和操作风险也随之而来。本文将深入探讨如…...
ModTheSpire技术全解析:从模组加载到高级开发指南
ModTheSpire技术全解析:从模组加载到高级开发指南 【免费下载链接】ModTheSpire External mod loader for Slay The Spire 项目地址: https://gitcode.com/gh_mirrors/mo/ModTheSpire 引言:为何需要模组加载器? 当你在《Slay The Spi…...
在物联网应用中使用 MQTT 而不是 HTTP?
然后还实际用 MQTT 实战了一下,大家感兴趣可以看看,下边是原内容: 前两年有幸参与到一个智能家居项目的开发,由于之前都没有过这方面的开发经验,所以对智能硬件的开发模式和技术栈都颇为好奇。 产品是一款可燃气体报警…...
释放桌游设计潜能:CardEditor如何重构卡牌创作流程
释放桌游设计潜能:CardEditor如何重构卡牌创作流程 【免费下载链接】CardEditor 一款专为桌游设计师开发的批处理数值填入卡牌生成器/A card batch generator specially developed for board game designers 项目地址: https://gitcode.com/gh_mirrors/ca/CardEdi…...
