copy_from_user

【Linux驱动】copy_to_user 、copy_from_user 函数 阅读详情

copy_from_user

最近貌似有人问为什么要用copy_from_user这类函数的问题,难道内核不能使用用户态的指针吗?那人自己做了个实验,不用copy_from_user,而是直接在内核里使用用户态指针,程序运行得好好的,啥事也没有。那么内核干嘛还要提供这么些函数呢?

我看网上有人说用户态指针在内核里没有意义了,如同内核指针在用户态一样没有意义了。这话其实不对,以x86来说,页目录表是放在CR3中的,这个寄存器 没有什么内核态用户态之分,换句话说一个用户态进程通过系统调用进入内核态,task_struct结构中的cr3都是不变的,没有页目录表变化的情况发 生。所以内核态使用用户进程传递过来的指针是有意义的,而且在用户态下内核的指针也是有意义的,只不过因为权限不够,用户进程使用内核指针就有异常发生。 

回到上面的话题,既然内核可以使用用户进程传递过来的指针,那干吗不使用memcpy呢?绝大多数情况下使用memcpy取代 copy_from_user都是OK的,事实上在没有MMU的体系上,copy_from_user就是memcpy。但是为什么有MMU就不一样了 呢,使用copy_from_user除了那个access_ok检查之外,它的实现前半部分就是memcpy,后边多了个两个section。这话要得 从内核提供的缺页异常说起,而且copy_from_user就是用来对付用户态的指针所指向的虚拟地址没有映射到实际物理内存这种情况,这个现象在用户 空间不是什么大事,缺页异常会自动提交物理内存,之后发生异常的指令正常运行,彷佛啥事也没发生。但是这事放到内核里就不一样了,内核需要显式地去修正这 个异常,背后的思想是:内核对于没有提交物理地址的虚拟地址空间的访问不能象用户进程那样若无其事,内核得表明下态度--别想干坏事,老子盯着你呢。就这 么个意思。所以copy_from_user和memcpy的区别就是多了两个section,这样对于缺页的异常,copy_from_user可以修 正,但是memcpy不行。 

我后来想能不能想个办法验证一下,在网上看到有人说用户空间的malloc是先分配虚拟空间,用到的时候才映射物理地址。这正好满足我们的要求,结果不是 很理想,我不知道这个malloc到底内核是不是有类似copy-on-write这样大的特性,总之memcpy对这种情况没有报任何异常。那就干脆来 狠的,直接估摸着一个可能还没被映射的用户空间的虚地址,传递给了内核空间的驱动程序,于是问题来了:memcpy发生了 oops,copy_from_user正常运行了。 

看来两者之间就这点区别了,至于access_ok,看过源码的人都知道那不过是验证一下地址范围而已,我开始还以为这个函数会操作页目录表,事实上完全不是。
谈一谈copy_from_user和copy_to_user 前言 copy_from_user和copy_to_user这两个函数相信做内核开发的人都非常熟悉,分别是将用户空间的数据拷贝到内核空间以及将内核空间中的数据拷贝到用户空间。这两个函数一般用于系统调用中,前者将用户空间参数拷贝到内核,后者将系统用的结果返回到用户空间。 用户空间和内核空间 Linux将地址空间分为用户空间和内核空间,内核文档Documentation/arm64/memory.... 阅读详情

相关推荐

MATLAB/Simulink与ThingSpeak集成:打通物联网数据与工业算法仿真的闭环

在工业算法开发与控制系统设计中,模型仿真与真实世界数据的脱节是常见的工程挑战。其核心原理在于构建一个双向数据流闭环,将虚拟的仿真模型与物理世界的传感器网络连接起来。这一技术方案的核心价值在于大幅缩短算法迭代周期,实现数据驱动的设计与验证。典型的应用场景包括数字孪生构建、预测性维护和硬件在环(HIL)测试的云端化。通过将MATLAB/Simulink这一强大的模型化设计环境,与ThingSpeak物联网云平台进行深度集成,工程师能够轻松地将实时或历史的物联网数据流直接注入仿真模型作为输入,同时将仿真结果实时回

weixin_34220179的博客 470

COPY_FROM_USER 详解

copy_from_user函数的目的是从用户空间拷贝数据到内核空间,失败返回没有被拷贝的字节数,成功返回0. 这么简单的一个函数却含盖了许多关于内核方面的知识,比如内核关于异常出错的处理.从用户空间拷贝 数据到内核中时必须很小心,假如用户空间的数据地址是个非法的地址,或是超出用户空间的范围,或是 那些地址还没有被映射到,都可能对内核产生很大的影响,如oops,或被造成系统安全的影响.所以 copy_from_user函数的功能就不只是从用户空间拷贝数据那样简单了,他还要做一些指针检查连同处理这些 ...

weixin_40237571的博客 1万+

基于价值的深度强化学习:DQN

本文主要是介绍DQN原理和算法伪代码和代码实现,算法实现包括pytorch版本和stable-baselines3版本

溯源的专栏 1085

copy_to_user()和copy_from_user()实现driver到user和user到driver的数据传送

driver和user之间经常需要数据传输,使用copy_to_user()和copy_from_user()来实现driver到user和user到driver的数据传送。 函数原型: unsigned  long  copy_to_user(void *to,  const void  __user  *from,  usigned long  count); unsig

stonesharp的专栏 3275

Windows系统监控实战:Grafana+Prometheus+node_exporter配置全攻略

本文提供了一套完整的Windows系统监控解决方案,详细介绍了如何使用Grafana、Prometheus和node_exporter(Windows版为windows_exporter)构建可视化监控平台。从环境准备、组件安装配置,到数据可视化与常见问题排查,手把手指导您实现从数据采集到仪表盘展示的全过程,帮助您从被动救火转向主动预警,有效保障Windows服务器稳定运行。

assembly8low的博客 248

PyTorch实战:手把手教你用QAT量化感知训练拯救模型精度(附避坑指南)

本文详细介绍了如何使用PyTorch进行QAT量化感知训练,以提升模型在边缘设备上的推理精度。通过核心原理讲解、实战代码示例和避坑指南,帮助开发者掌握从环境配置、模型训练到边缘部署的全流程,有效解决传统量化方法导致的精度损失问题。

c7d8e的博客 329

Copy_from_user函数详细分析

from:http://hi.baidu.com/wzt85/blog/item/1f29731ba4b317ffae513316.html copy_from_user函数的目的是从用户空间拷贝数据到内核空间,失败返回没有被拷贝的字节数,成功返回0.这么简单的一个函数却含盖了许多关于内核方面的知识,比如内核关于异常出错的处理.从用户空间拷贝数据到内核中时必须非常小心,如果用户空间的数据地

技术资料库 3万+

别再让OCV拖慢你的芯片!手把手教你用set_timing_derate优化STA时序(附CPPR实战)

本文深入探讨了芯片设计中OCV(On-Chip Variation)对时序分析的影响,并提供了使用`set_timing_derate`优化STA时序的实战指南。通过分阶段derate设置和CPPR技术,有效减少时序违例,提升芯片性能。文章结合TSMC 7nm工艺案例,详细解析了OCV建模与优化策略,助力工程师实现时序收敛。

weixin_42525005的博客 304

copy_{to, from}_user()的思考

引言我们对copy_{to,from}_user()接口的使用应该是再熟悉不过吧。基本Linux书籍都会介绍它的作用。毕竟它是kernel space和user spac...

Linux阅码场 41万+

适航文章汇总:知识体系全面梳理

无论您是行业新手还是经验丰富的专业人士,都可以通过本篇文章快速查找相关资料,提高对适航认证、机载系统、软件及硬件等领域的理解。本部分详细解析ARP 4754A、ARP 4761、DO-178C、DO-254等核心标准,并介绍其在机载系统开发中的应用。介绍FAA、EASA、CCAR等主要航空管理机构的适航规章体系,并说明各类飞行器(如固定翼、旋翼机、无人机等)的适航要求。本部分还探讨硬件设计、验证与确认过程中的挑战。从系统架构设计到机载设备的集成与管理,本部分介绍机载系统的研发体系及适航管理的最佳实践。

qq_41854911的博客 1451

Ros入门 (十)----激光雷达避障 简易实现

本篇文章通过订阅/scan话题获取障碍物的距离信息,达到避障目的,提供部分代码,仅供参考。

weixin_51157015的博客 1万+

Linux copy_from_user/copy_to_user 底层原理

在Linux中,用户空间(User Space)和内核空间(Kernel Space)是相互隔离的,用户空间的程序无法直接访问内核空间的内存,反之亦然。然而,在实际应用中,用户程序经常需要与内核进行数据交换,比如通过系统调用(System Call)传递参数或读取内核数据。为了安全高效地完成这种跨空间的数据拷贝,Linux内核提供了copy_from_user和copy_to_user这两个关键接口。它们的主要作用是::将数据从用户空间安全地拷贝到内核空间。:将数据从内核空间安全地拷贝到用户空间。

h_b__k的博客 1390

SAR成像专栏目录

为方便大家阅读,我做了一个专栏目录,蓝色字有超链接,可以直接打开。 本专栏默认读者已具备雷达系统的基本知识或者已阅读过雷达导论专栏中的文章。 1. 概述 SAR成像概述 星载SAR的各项指标解读(史上最全) SAR成像算法的实现途径与算力分析 2. SAR成像原理与SAR系统简介 雷达与分辨率 SAR成像原理与方法 SAR图像的形成和处理 SAR系统设计 3. 点目标仿真 点目标仿真(一)—— 数学模型 点目标仿真(二)—— Matlab仿真 4. 成像算法 更新中 雷达导论专

7467

为什么一定要copy_from_user

网上很多人提问为什么一定要copy_from_user,也有人解答。但是这里面很多的解答没有回答到点子上,不能真正回答这个问题。我决定写篇文章正式回答一下这个问题,消除读者的各种疑虑。 这个问题,我认为需要从2个层面回答: 第一个层次是为什么要拷贝,可不可以不拷贝? 第二个层次是为什么要用copy_from_user而不是直接memcpy 为什么要拷贝? 拷贝这个事情是必须的,这个事情甚至都跟Linux都没有什么关系。比如Linux有个kobject结构体,kobject结构体里面有个name指针: 1

weixin_40237571的博客 813

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

arm64架构的copy_from_user分析

一谈到内核-用户空间的数据拷贝,那肯定少不了copy_from_user/copy_to_user, 但底层是怎么实现的呢?本篇就来分析一下arm64架构的copy_from_user的流程。

Aruko的博客 1246

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Linux为什么一定要copy_from_user ?

网上很多人提问为什么一定要copy_from_user,也有人解答。比如百度一下: 但是这里面很多的解答没有回答到点子上,不能真正回答这个问题。我决定写篇文章正式回答一下这个问题,消除读者的各种疑虑。 这个问题,我认为需要从2个层面回答 第一个层次是为什么要拷贝,可不可以不拷贝? 第二个层次是为什么要用copy_from_user而不是直接memcpy 为什么要拷贝 拷贝这个事情是必须的,这个事情甚至都跟Linux都没有什么关系。比如Linux有个kobject结构体,kobj

jinking01的专栏 1217

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

copy_from_user的详细用法!

转自:https://www.cnblogs.com/Rainingday/p/12618715.html copy_from_user函数的目的是从用户空间拷贝数据到内核空间,失败返回没有被拷贝的字节数,成功返回0. copy_from_user(void *to, const void __user *from, unsigned long n) @*to 将数据拷贝到内核的地址 @*from 需要拷贝数据的地址 @n 拷贝数据的长度(字节) 也就是将@form地址中的数

u013750244的博客 5635

内核中一个重要的函数copy_from_user

主要参考:《情景分析》 这个函数的功能是很明显的,就是将用户空间中的内容拷贝到内核空间中: static inline unsigned long __must_check copy_from_user(void *to, const void __user *from, unsigned long n) { int sz = __compil

SunnyBeiKe的专栏 8361

copy_to_user/copy_from_user解析与示例

copy_to_user/copy_from_user解析

weixin_45930312的博客 1万+

copy_from_user和copy_to_user

copy_from_user和copy_to_user分别是将用户空间的数据拷贝到内核空间以及将内核空间中的数据拷贝到用户空间。 注意:copy_from_user还会做一些指针检查以及处理这些问题的方法。 copy_from_user失败返回没有被拷贝的字节数,成功返回0. copy_from_user(void *to, const void __user *from, unsigned long n) to :将数据拷贝到内核的地址 from :需要拷贝数据的地址 n :拷贝数据的长度(字节) 就是将

qq_35399548的博客 1138

copy_to_user/copy_from_user参数解析

copy_to_user解析 copy_to_user是在进行驱动相关程序设计的时候,要经常遇到的函数。由于内核空间与用户空间的内存不能直接互访,因此借助函数copy_to_user()完成内核空间到用户空间的复制,函数copy_from_user()完成用户空间到内核空间的复制。

Haomione的博客 1万+

copy_to_user,copy_from_user,get_user,put_user函数详解

字符设备驱动驱动的读,写。如: ssize_t xxx_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos); ssize_t xxx_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos); 等函数中,filp...

有趣的人生 一半是山川湖海 一半是初心情怀 2095

copy from user函数 和copy to user 函数分析

1、copy from user函数 copy from user函数是从用户空间的数据拷贝到内核空间,成功返回0,失败返回没有被拷贝的字节数。如下面函数 s32 drv_rf_ioctl_w_parma(unsigned long arg) {     PARAM  param;     if(copy_from_user((uint8_t *)&param, (void __us

qq_31986363的博客 1916

copy_from_user函数的使用

访问用户态内存 copy_from_user和copy_to_user这两个函数相信做内核开发的人都非常熟悉,分别是将用户空间的数据拷贝到内核空间以及将内核空间中的数据拷贝到用户空间。 copy_from_user函数的功能就不只是从用户空间拷贝数据那样简单了,它还要做一些指针检查以及处理这些问题的方法 来自 https://blog.youkuaiyun.com/u013750244/article/details/108021600?utm_medium=distribute.pc_relevant.none-ta

qq_35399548的博客 2172

linux内核中的copy_to_user和copy_from_user(一)

linux内核中的copy_to_user和copy_from_user(一) Kernel version:2.6.14 CPU architecture:ARM920T Author:ce123(http://blog.youkuaiyun.com/ce123) 1.copy_from_user 在学习Linux内核驱动的时候,经常会碰到copy_from_user和copy_to_user这两个函数...

系统运维 7893

copy_to_user、copy_from_user

include    copy_to_user(), copy_from_user()   在内核的学习中会遇到很多挺有意思的函数,而且能沿着一个函数扯出来很多个相关的函数。copy_to_user和copy_from_user就是在进行驱动相关程序设计的时候,要经常遇到的两个函数。由于内核空间与用户空间的内存不能直接互访,因此借助函数copy_to_user()完成用户空间到内核

angle_birds的专栏 837
上一篇: sizeof(三)
下一篇: socket(一)
sooolo
博客等级 码龄17年 95粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值