Linux内核之put_user与get_user实例用法(三十三)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:Linux内核之put_user与get_user实例与调用栈流程

2.Linux内核之put_user与get_user介绍

  • put_user 和 get_user 是 Linux 内核中用于在用户空间和内核空间之间安全地传输数据的函数。这两个函数主要用于处理用户空间的内存访问,确保内核在尝试读取或写入用户空间内存时不会引发错误,如页面错误或访问违规。

  • put_user 函数

  • put_user 函数用于将数据从内核空间安全地复制到用户空间。它的基本原型如下:

long put_user(type val, type __user *uptr);val:这是要从内核空间复制的值。
uptr:这是指向用户空间位置的指针,其中 val 将被复制。
put_user 函数返回一个长整数,表示操作是否成功。如果操作成功,则返回 0;否则返回错误码。
  • get_user 函数
  • get_user 函数用于从用户空间安全地读取数据到内核空间。它的基本原型如下:
long get_user(type *val, type __user *uptr);val:这是一个指向内核空间位置的指针,其中将从用户空间读取的值将被存储。
uptr:这是指向用户空间位置的指针,从中将读取值。
与 put_user 类似,get_user 函数也返回一个长整数来表示操作是否成功。
  • 在使用 put_user 和 get_user 时,必须确保提供的用户空间指针是有效的,并且内核有足够的权限来访问它。
    这些函数在内核模块和用户空间应用程序之间提供了一层安全保护,但开发者仍然需要小心处理潜在的错误和异常情况。
  • 在某些情况下,可能需要使用更复杂的函数(如 copy_to_user 和 copy_from_user),它们能够处理更大块的数据传输。
  • 总之,put_user 和 get_user 是 Linux 内核中用于在用户空间和内核空间之间安全传输数据的重要工具,它们确保了在处理用户空间内存时的稳定性和安全性。

3.代码实例

<1>.put_user实例:用于将数据从内核空间复制到用户空间

#include <linux/module.h>
#include <linux/fs.h>
#include <linux/uaccess.h>static char kernel_data[] = "Hello from kernel space!\n";static ssize_t driver_read(struct file *file, char __user *user_buffer, size_t count, loff_t *ppos)
{ssize_t bytes_read = 0;// 将数据从内核空间复制到用户空间if (put_user(kernel_data[*ppos], user_buffer) != 0) {return -EFAULT; // 复制失败}*ppos += 1;bytes_read = 1;return bytes_read;
}static const struct file_operations driver_fops = {.owner = THIS_MODULE,.read = driver_read,
};static int __init driver_init(void)
{int ret;ret = register_chrdev(0, "my_driver", &driver_fops);if (ret < 0) {pr_err("Failed to register char device\n");return ret;}pr_info("Driver loaded successfully\n");return 0;
}static void __exit driver_exit(void)
{unregister_chrdev(0, "my_driver");pr_info("Driver unloaded\n");
}module_init(driver_init);
module_exit(driver_exit);MODULE_LICENSE("GPL");

<2>.get_user 函数实例:用于将数据从用户空间复制到内核空间

#include <linux/module.h>
#include <linux/fs.h>
#include <linux/uaccess.h>static char kernel_data[1024];static ssize_t driver_write(struct file *file, const char __user *user_buffer, size_t count, loff_t *ppos)
{ssize_t bytes_written = 0;// 将数据从用户空间复制到内核空间if (get_user(kernel_data[*ppos], user_buffer) != 0) {return -EFAULT; // 复制失败}*ppos += 1;bytes_written = 1;return bytes_written;
}static const struct file_operations driver_fops = {.owner = THIS_MODULE,.write = driver_write,
};static int __init driver_init(void)
{int ret;ret = register_chrdev(0, "my_driver", &driver_fops);if (ret < 0) {pr_err("Failed to register char device\n");return ret;}pr_info("Driver loaded successfully\n");return 0;
}static void __exit driver_exit(void)
{unregister_chrdev(0, "my_driver");pr_info("Driver unloaded\n");
}module_init(driver_init);
module_exit(driver_exit);MODULE_LICENSE("GPL");

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

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

相关文章

GPU-CPU-ARM-X86-RISC-CUDA

CPU更适合处理复杂逻辑运算和单线程任务&#xff0c;而GPU则更适合处理大规模并行计算任务。 CPU&#xff08;中央处理器&#xff09;通常具有较少的核心数量&#xff08;一般在2到16个之间&#xff09;&#xff0c;但每个核心的性能较强&#xff0c;擅长执行复杂的运算和逻辑…

HTTP/1.1 特性(计算机网络)

HTTP/1.1 的优点有哪些&#xff1f; 「简单、灵活和易于扩展、应用广泛和跨平台」 1. 简单 HTTP 基本的报文格式就是 header body&#xff0c;头部信息也是 key-value 简单文本的形式&#xff0c;易于理解。 2. 灵活和易于扩展 HTTP 协议里的各类请求方法、URI/URL、状态码…

专升本-云计算

被誉为第三次信息技术革命 什么是云计算&#xff1f; 云计算是一种商业的计算模式&#xff0c;它将任务分布在大量计算机构成的资源池上&#xff0c;用户可以按需通过网络存储空间&#xff0c;计算能力和信息等服务 云计算的产生和发展&#xff1a; 起源&#xff1a;上世纪6…

投稿指南【NO.12_9】【极易投中】核心期刊投稿(现代电子技术)

近期有不少同学咨询投稿期刊的问题&#xff0c;大部分院校的研究生都有发学术论文的要求&#xff0c;少部分要求高的甚至需要SCI或者多篇核心期刊论文才可以毕业&#xff0c;但是核心期刊要求论文质量高且审稿周期长&#xff0c;所以本博客梳理一些计算机特别是人工智能相关的期…

集成百兆,千兆,万兆网络变压器等电子元器件的RJ45 Jack连接器在屏显控制系统中的应用

Hqst华轩盛(石门盈盛)电子导读&#xff1a;集成百兆&#xff0c;千兆&#xff0c;万兆网络变压器等电子元器件的RJ45 Jack连接器在屏显控制系统中的应用 一 ﹑集成百兆&#xff0c;千兆&#xff0c;万兆网络变压器等电子元器件的RJ45 Jack连接器在屏显控制系统中的应用前景 近年…

Node.js中Router的使用

文章目录 介绍router的优点1.导入Express和创建Router&#xff1a;2. 定义路由&#xff1a;3.将router暴露到模块外&#xff1a;4. 将Router挂载到Express应用中&#xff1a;4.1.引入router4.2.使用中间件让router在Express应用中生效(三种写法) 5. 完整示例&#xff1a;5.1.编…

【Web】NSSCTF Round#20 Basic 两道0解题的赛后谈

目录 前言 baby-Codeigniter 组合拳&#xff01; 前言 本想着说看看go的gin框架就睡了的&#xff0c;r3师傅提醒说赛题环境已经上了&#xff0c;那不赶紧研究下&#x1f600; 主要来谈谈做题的心路历程 baby-Codeigniter 拿到题目的第一反应应该是&#xff1a;“什么是C…

jmeter性能压测的标准和实战中会遇到的问题

1.性能标准建议 CPU 使用率&#xff1a;不超过 70% 内存使用率&#xff1a;不超过 70% 磁盘&#xff1a;%util到达80%严重繁忙 &#xff08;os.disIO.filesystem.writeKbPS 每秒写入的千字节&#xff09; 响应时间&#xff1a;95%的响应时间不超过8000ms 事务成功率&#xff1a…

阿里云2核4G服务器租用价格_30元3个月_165元一年_199元

阿里云2核4G服务器租用优惠价格&#xff0c;轻量2核4G服务器165元一年、u1服务器2核4G5M带宽199元一年、云服务器e实例30元3个月&#xff0c;活动链接 aliyunfuwuqi.com/go/aliyun 活动链接如下图&#xff1a; 阿里云2核4G服务器优惠价格 轻量应用服务器2核2G4M带宽、60GB高效…

PCL点云处理之 基于垂直度检测与距离聚类 的路面点云提取方案 (二百三十九)

PCL点云处理之 基于垂直度检测与距离聚类 的路面点云提取方案 (二百三十九) 一、算法流程二、具体步骤1.垂直度检测与渲染1.代码2.效果2.水平分布点云提取1.代码2.效果3.路面连通点云提取1.代码2.效果三、完整代码四、参考文献一、算法流程

Chapter 1 - 6. Introduction to Congestion in Storage Networks

NVMe/TCP NVMe/TCP carries NVMe commands over TCP transport (Figure 1-8) for accessing remote block storage via a lossy or sometimes lossless network. It is an OSI layer 5 (sessions layer) protocol. NVMe/TCP 通过 TCP 传输(图 1-8)传输 NVMe 命令,以便通过有…

Flutter 开发学习笔记(2):第一个简单的Flutter项目(下)

文章目录 前言官方Flutter案例侧边栏添加代码初始化展示效果 子组件私有数据空间导航栏转为有状态WidgetsetState手动转换页面实现效果 响应式动态切换宽度添加收藏夹&#xff0c;跨Widget传数据实现效果 完整代码后续进阶效果总结 前言 接着继续上一章的内容 官方Flutter案例…

简单了解策略模式

什么是策略模式&#xff1f; 策略模式提供生成某一种产品的不同方式 Strategy策略类定义了某个各种算法的公共方法&#xff0c;不同的算法类通过继承Strategy策略类&#xff0c;实现自己的算法 Context的作用是减少客户端和Strategy策略类之间的耦合&#xff0c;客户端只需要…

UE4 面试题整理

1、new与malloc的区别 new&#xff1a; new首先会去调用operator new函数&#xff0c;申请足够的内存&#xff08;大多数底层用malloc实现&#xff09;&#xff0c;然后调用类型的构造函数来初始化变量&#xff0c;最后返回自定义类型的指针&#xff0c;delete先调用析构函数&…

设计模式之装饰模式精讲

概念&#xff1a;动态地给一个对象添加一些额外的职责。 装饰器模式侧重于在不改变接口的前提下动态地给对象添加新功能&#xff0c;保持对象结构的透明性&#xff0c;客户端无感知。 以一个咖啡制作和装饰的例子来帮助大家理解&#xff1a; public interface Coffee {double…

QT-自定义参数设计框架软件

QT-自定义参数设计框架软件 前言一、演示效果二、使用步骤1.应用进行参数注册2.数据库操作单例对象3.参数操作单例对象 三、下载链接 前言 常用本地数据参数通常使用的是xml等文本的格式&#xff0c;进行本地的数据参数的存储。这种参数的保存方式有个致命的一点&#xff0c;就…

YOLOv9改进策略 :主干优化 | ConvNeXtV2:适应自监督学习,让 CNN “再一次强大”?

💡💡💡本文改进内容:完全卷积掩码自编码器框架 ConvNeXt V2,它显著提高了纯convnet在各种识别基准上的性能,包括ImageNet分类,COCO目标检测和ADE20k分割。还提供了各种尺寸的预训练ConvNeXt v2模型,从而在ImageNet上具有76.7%精度的3.7M Atto model和88.9%精度的650…

zabbix主动发现,注册及分布式监控

主动发现 结果 主动注册 结果 分布式监控 服务机&#xff1a;132 代理机&#xff1a;133 客户端&#xff1a;135 代理机 数据库赋权&#xff1a; 代理机配置 网页上配置代理 客户端配置 网页上配置主机 重启代理机服务 网页效果

排序第五篇 归并排序

一 简介 归并排序(Merge Sort) 的基本思想是&#xff1a; 首先将待排序文件看成 n n n 个长度为1的有序子文件&#xff0c; 把这些子文件两两归并&#xff0c; 得到 n 2 \frac{n}{2} 2n​ 个长度为 2 的有序子文件&#xff1b; 然后再把这 n 2 \frac{n}{2} 2n​ 个有序的子…

基于Tampermonkey 实现自动答题和视频播放

目录 一、环境准备 二、下载Tampermonkey 三、安装脚本 四、启用脚本 一、环境准备 微软自带的 edge 浏览器(电脑端) 二、下载Tampermonkey 安装地址&#xff1a;Tampermonkey 篡改猴(油猴脚本) 下载完成会在浏览器拓展中自动生成一个插件&#xff0c;此时点击管理拓展&…