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

【Linux】【驱动】应用层和驱动层传输数据

【Linux】【驱动】应用层和驱动层传输数据

  • 绪论
    • 1.如果我在应用层使用系统0 对设备节点进行打开,关闭,读写等操作会发生什么呢?
  • 2 我们的应用层和内核层是不能直接进行数据传输的
  • 3 驱动部分的代码
  • 4 应用代码
  • 5 编译以及运行代码

绪论

Linux一切皆文件!
文件对应的操作有打开,关闭,读写设备节点对应的操作有打开,关闭,读写

1.如果我在应用层使用系统0 对设备节点进行打开,关闭,读写等操作会发生什么呢?

当我们在应用层 read 设备节点的时候,就会触发我们驱动里面read 这个函数

ssize t (*read) (struct file *, char  user *, size t, loff t *);

当我们在应用层 write 设备节点的时候,就会触发我们驱动里面 write 这个函数

ssize t (*write) (struct file *, const char  user *, size t, loff t *);
unsigned int (*poll) (struct file *, struct poll table struct *);
long (*unlocked ioctl) (struct file *, unsigned int, unsigned long);
int (*open) (struct inode *, struct file *);
int (*release) (struct inode *, struct file *);

2 我们的应用层和内核层是不能直接进行数据传输的

如下两个代码实现了数据的交互

static inline long copy from user(void *to, const void user * from, unsigned long n)
static inline long copy to user(voiduser *to, const void *from, unsigned long n)

3 驱动部分的代码

#include <linux/init.h>
#include <linux/module.h>
#include <linux/miscdevice.h>
#include <linux/fs.h>	
#include <linux/uaccess.h>int misc_open(struct inode *inode, struct file *file)
{printk("misc_open\n");return 0;
}int misc_release(struct inode *inode, struct file *file)
{printk("misc_release\n");return 0;}ssize_t misc_read(struct file *file,char __user *ubuf,size_t size,loff_t *loff_t)
{char kbuf[512] = "haha";if(copy_to_user(ubuf,kbuf,strlen(kbuf))!=0){printk("error copying\n");return -1;}return 0;}ssize_t misc_write(struct file *file,const char __user *ubuf,size_t size,loff_t *loff_t)
{char kbuf[512] = {0};	if(copy_from_user(kbuf,ubuf,size)!= 0){printk("misc_write error\n");return -1;}printk("kbuf = %s\n",kbuf);return 0;}struct file_operations misc_fops = {.owner	= THIS_MODULE,.open	= misc_open,.release = misc_release,.read	= misc_read,.write	= misc_write
};struct miscdevice misc_dev = 
{.minor = MISC_DYNAMIC_MINOR,.name = "hello_misc",.fops = &misc_fops
};//drivers for init
static int misc_init(void)
{int ret = 0;ret = misc_register(&misc_dev);if(ret<0) {printk("misc_register is failed\n");return -1;}printk("misc registe is succeed \n");return 0;
}//drivers for exit 
static void misc_exit(void)
{
//misc_deregister(&misc_dev);printk("misc exit \n");}module_init(misc_init);
module_exit(misc_exit);MODULE_LICENSE("GPL");

4 应用代码

write就是实现了write的功能
read 函数就是实现了read的功能

#include "stdio.h"
#include "unistd.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "fcntl.h"
#include "stdlib.h"
#include "string.h"/** @description		: main主程序* @param - argc 	: argv数组元素个数* @param - argv 	: 具体参数* @return 			: 0 成功;其他 失败*/
int main(int argc, char *argv[])
{int fd;char buf[64] = "12345";//fd = open(argv[1], O_RDONLY);fd = open("/dev/hello_misc", O_RDWR);if(fd < 0){perror("open error");return fd;}//write(fd,buf,sizeof(buf));//printf("buf is %s\n",buf);write(fd,buf,sizeof(buf));close(fd);return 0;
}

5 编译以及运行代码

编译app代码

arm-buildroot-linux-gnueabihf-gcc -o miscApp miscApp.c

挂载nfs盘

mount -t nfs -o nolock,vers=3 192.168.5.15:/home/book/nfs_rootfs /mnt

移动到mnt目录

cd /mnt

删除文件

rm -f + chrdevbase.ko

移动代码

cp miscApp /home/book/nfs_rootfs/

允许printk输出

echo "7 4 1 7"> /proc/sys/kernel/printk

安装驱动

insmod chrdevbase.ko

列出驱动

lsmod

删除驱动

remmod

运行代码

./miscApp

在这里插入图片描述

相关文章:

【Linux】【驱动】应用层和驱动层传输数据

【Linux】【驱动】应用层和驱动层传输数据 绪论1.如果我在应用层使用系统0 对设备节点进行打开&#xff0c;关闭&#xff0c;读写等操作会发生什么呢? 2 我们的应用层和内核层是不能直接进行数据传输的3 驱动部分的代码4 应用代码5 编译以及运行代码 绪论 Linux一切皆文件! 文…...

【第二阶段】kotlin函数引用

针对上篇传入函数参数我们也可以重新定义一个函数&#xff0c;然后在main中调用时传入函数对象 lambda属于函数类型的对象&#xff0c;需要把普通函数变成函数类型的对象&#xff08;函数引用&#xff09;&#xff0c;使用“&#xff1a;&#xff1a;” /*** You can edit, ru…...

sip网络号角喇叭 sip音柱 POE供电广播音箱 ip网络防水对讲终端 sip网络功放

SV-7042TP网络号角喇叭 一、描述 SV-7042TP是我司的一款SIP网络号角喇叭&#xff0c;具有10/100M以太网接口&#xff0c;内置有一个高品质扬声器&#xff0c;将网络音源通过自带的功放和喇叭输出播放&#xff0c;可达到功率30W。SV-7042TP作为SIP系统的播放终端&#xff0c;可…...

【网络】传输层——TCP(滑动窗口流量控制拥塞控制延迟应答捎带应答)

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《网络》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 上篇文章对TCP可靠性机制讲解了一部分&#xff0c;这篇文章接着继续讲解。 &#x1f3a8;滑动窗口 在…...

Electron教程_编程入门自学教程_菜鸟教程-免费教程分享

教程简介 Electron是一个是使用JavaScript&#xff0c;HTML和CSS构建跨平台的桌面应用程序框架。 Electron 通过将 Chromium 和 Node.js 合并到同一个运行时环境中&#xff0c;并将其打包为 Mac&#xff0c;Windows 和 Linux 系统下的应用来实现这一目的。 Electron入门教程 …...

LVS负载均衡DR(直接路由)模式

在LVS&#xff08;Linux Virtual Server&#xff09;负载均衡中的DR&#xff08;Direct Routing&#xff09;模式下&#xff0c;数据包的流向如下&#xff1a; 客户端发送请求到负载均衡器&#xff08;LVS&#xff09;的虚拟IP&#xff08;VIP&#xff09;。负载均衡器&#x…...

14 anaconda+pycharm环境管理以及源管理

文章目录 环境管理博主使用的环境环境设置conda常用指令pycharm与环境的连接&#xff08;新2023版本后&#xff09;设置国内镜像&#xff08;源管理&#xff09;常用操作 环境管理 博主使用的环境 Anaconda3-2023.03-Windows-x86_64 pycharm-professional-2023.2 环境设置 …...

【C语言程序设计】C语言基本数据类型与表达式(思考题)

思考题 1、C语言的主要特点有哪些&#xff1f; ①简单紧凑、灵活方便&#xff0c;②是结构化的语言&#xff0c;③运算符丰富&#xff0c;④是一种高效的语言&#xff0c;⑤可直接对硬件进行操作&#xff0c;⑥具有较好的可移植性。 高效性&#xff1a;C语言是一种高级编程语言…...

Linux 网络发包流程

哈喽大家好&#xff0c;我是咸鱼 之前咸鱼在《Linux 网络收包流程》一文中介绍了 Linux 是如何实现网络接收数据包的 简单回顾一下&#xff1a; 数据到达网卡之后&#xff0c;网卡通过 DMA 将数据放到内存分配好的一块 ring buffer 中&#xff0c;然后触发硬中断CPU 收到硬中…...

Python web实战之Django的AJAX支持详解

关键词&#xff1a;Web开发、Django、AJAX、前端交互、动态网页 今天和大家分享Django的AJAX支持。AJAX可实现在网页上动态加载内容、无刷新更新数据的需求。 1. AJAX简介 AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;是一种在网页上实现异步通信的技术。通过…...

spring boot实现实体类参数自定义校验

安装依赖项 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>1、新建实体类 Data public class UserEntity {private String name;private Integer age;…...

网络安全威胁与防御策略

第一章&#xff1a;引言 随着数字化时代的快速发展&#xff0c;网络已经成为人们生活和工作中不可或缺的一部分。然而&#xff0c;网络的广泛应用也引发了一系列严峻的网络安全威胁。恶意软件、网络攻击、数据泄露等问题层出不穷&#xff0c;给个人和企业带来了巨大的风险。本文…...

C++:哈希表——模拟散列表

模拟散列表 维护一个集合&#xff0c;支持如下几种操作&#xff1a; 1.“I x”&#xff0c;插入一个数x 2.“Q x”&#xff0c;询问数x是否在集合中出现过 现在要进行N次操作&#xff0c;对于每个询问操作输出对应的结果 输入格式 第一行包含整数N&#xff0c;表示操作数量 …...

项目配置中心介绍

目录 什么是配置中心 为什么要有配置中心 配置中心的做法&#xff08;读取和通知&#xff09; 配置中心优点: 常用的配置中心中间件 什么是配置中心 配置中心就是用来管理项目当中所有配置的系统&#xff0c;也是微服务系统当中不可或缺的一部分。项目的配置文件不放到本地…...

14-案例:购物车

综合案例-购物车 需求说明: 1. 渲染功能 v-if/v-else v-for :class 2. 删除功能 点击传参 filter过滤覆盖原数组 3. 修改个数 点击传参 find找对象 4. 全选反选 计算属性computed 完整写法 get/set 5. 统计 选中的 总价 和 数量 计算属性conputed reduce条件求和 6. 持久化到本…...

上海市青少年算法2023年2月月赛(丙组)

上海市青少年算法2023年2月月赛(丙组)T1 格式改写 题目描述 给定一个仅由拉丁字符组成字符序列,需要改写一些字符的大小写,使得序列全部变成大写或全部变成小写,请统计最少修改多少个字符才能完成这项任务。 输入格式 一个字符序列:保证仅由拉丁字符构成 输出格式 单个整…...

jetpack5.0.2 已经安装了 cudnn 和 tensorrt

在平台 jetson Xavier NX 中想使用 cudnn 和 tensorrt。然后自己下载了相应包并解压&#xff0c;拷贝&#xff0c;编译 安装 cudnn 1.下载对应包文件&#xff0c;例如&#xff1a;cudnn-linux-sbsa-8.4.1.50_cuda11.6-archive.tar.xz 2.解压&#xff0c;移动到解压目录&#…...

我的编程语言学习笔记

前言 作为一名编程初学者&#xff0c;我深知学习编程需要不断积累和记录。在这篇博客文章中&#xff0c;我将分享一些我在学习C/C编程语言过程中记录的常用代码、特定函数、复杂概念以及特定功能。希望能与大家一起切磋进步&#xff01; 常用代码&#xff1a; 1. 输入输出操作…...

一个DW的计算

一个DW的计算 1- 题目: 已知一个DW1.1 要求: 从DW中取出指定的位的值1.1.1 分析1.1.2 实现1.1.3 简化实现1.1.4 验证 2- 题目: 已知一个DW2.1 要求: 从DW中的指定的P和S,取出指定的位的值2.1.1 分析2.1.2 实现 1- 题目: 已知一个DW 有图中所示一行信息&#xff0c;表示一个DW(…...

java.net.BindException Address already in use: NET_Bind解决

java.net.BindException Address already in use: NET_Bind 两种解决方法 两种解决方法 (1) kill 占用此端口的线程 查看报错的端口 netstat -ano | findstr 16825tasklist | findstr 1092 如果占用的程序不重要直接kill taskkill /f /pid 16825 (2) 修改启动端口 找一个没…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...

小木的算法日记-多叉树的递归/层序遍历

&#x1f332; 从二叉树到森林&#xff1a;一文彻底搞懂多叉树遍历的艺术 &#x1f680; 引言 你好&#xff0c;未来的算法大神&#xff01; 在数据结构的世界里&#xff0c;“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的&#xff0c;它…...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...