Linux内核和用户空间数据交互copy_to_user和copy_from_user
一、copy_to_user
功能:用于将内核空间的数据拷贝到用户空间。
函数原型:unsigned long copy_to_user(void __user *to, const void *from, unsigned long n);
*to是用户空间的指针,
*from是内核空间指针,
n表示从内核空间向用户空间拷贝数据的字节数
如果数据拷贝成功,则返回零;否则,返回没有拷贝成功的数据字节数。
二、copy_from_user
功能:用于将用户空间的数据传送到内核空间。
函数原型:unsigned long copy_from_user(void * to, const void __user * from, unsigned long n)
第一个参数to是内核空间的数据目标地址指针,
第二个参数from是用户空间的数据源地址指针,
第三个参数n是数据的长度。
如果数据拷贝成功,则返回零;否则,返回没有拷贝成功的数据字节数。
此函数将from指针指向的用户空间地址开始的连续n个字节的数据发送到to指针指向的内核空间地址
例子:
struct as2056_rmsg *rmsg = NULL;char *buffer = NULL;//申请内存空间存放数据,//申请的空间大小跟as2056_rmsg 结构体一样rmsg = kmalloc(sizeof(struct as2056_rmsg), GFP_KERNEL); //切记,要申请内存空间才能使用if(rmsg == NULL) {printk("error: allo\n");return -EFAULT;}//从用户空间拷贝as2056_rmsg 结构体指向的数据到内核空间的指针rmsg当中,成功则返回零;//否则,返回没有拷贝成功的数据字节数。ret = copy_from_user(rmsg, (struct as2056_rmsg *)arg, sizeof(struct as2056_rmsg)); if(ret) {kfree(rmsg);printk("copy write mesg from user error, ret = %d\n", ret);return -EFAULT;}//申请内存空间存放数据,申请的空间大小跟rmsg->rlen一致buffer = kmalloc(rmsg->rlen, GFP_KERNEL); //切记,要申请内存空间才能使用if(buffer == NULL) {kfree(rmsg);printk("error: allo\n");return -EFAULT;}//从内核空间buffer拷贝数据到用户空间rmsg->buf,成功则返回零;//否则,返回没有拷贝成功的数据字节数。ret = copy_to_user(rmsg->buf, buffer, rmsg->rlen); if(ret) {kfree(buffer);kfree(rmsg);printk("copy data to user failed = %d\n", ret);return -EFAULT;}
Linux内核和用户空间数据交互copy_to_user和copy_from_user相关推荐
- linux内核态用户态交互,Linux用户态和内核态交互的几种方式
创建于 2013-04-13 迁移自本人的百度空间 -------------------------------- 1/内核态->用户态 在kernel module中调用printk是最简单 ...
- linux 内核与用户空间通信之netlink使用方法
Linux中的进程间通信机制源自于Unix平台上的进程通信机制.Unix的两大分支AT&T Unix和BSD Unix在进程通信实现机制上的各有所不同,前者形成了运行在单个计算机上的Syste ...
- Linux内核和用户空间通信的方法
Linux内核和用户空间通信的方法(二)- 使用netlink 作者:Kendo 2006-9-3 这是一篇学习笔记,主要是对<Linux 系统内核空间与用户空间通信的实现与分析>中的 ...
- linux kernel and user space通信机制,Linux内核与用户空间通信机制研究.pdf
ISSN 1009-3044 E-mail:info@CCCC.net.CR ComputerKnowledgeandTechnology电脑知识与技术 http://www.dnzs.net.cn ...
- linux内核打开文件数,放开Linux内核对用户进程可打开文件数和TCP连接的限制
一. 检查linux内核 uname -a lsb_release -a 二.用户进程可打开文件数限制 1)vim /etc/security/limits.conf * - n ...
- Linux内核空间-用户空间通信之debugfs
一.debugfs文件系统简介 debugfs虚拟文件系统是一种内核空间与用户空间的接口,基于libfs库实现,专用于开发人员调试,便于向用户空间导出内核空间数据(当然,反方向也可以).debugfs ...
- linux内核与用户空间的九种通信机制
目前Linux提供了9种机制完成内核与用户空间的数据交换,分别是内核启动参数.模块参数与 sysfs.sysctl.系统调用.netlink.procfs.seq_file.debugfs和relay ...
- Openwrt按键检测分析-窥探Linux内核与用户空间通讯机制netlink使用
首先看一下Openwrt系统中关于按键功能的使用和修改,以18.06版本为例 按键功能实现在脚本中, 比如18.06/package/base-files/files/etc/rc.button/re ...
- Linux(内核和用户态的)动态内存管理
http://www.ibm.com/developerworks/cn/linux/l-cn-slub/ 内核对象缓冲区管理 Linux 内核在运行过程中,常常会需要经常使用一些内核的数据结构(对象 ...
- linux内核创建用户,分析Linux内核创建一个新进程的过程
谢文杰 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验目的 阅 ...
最新文章
- 创新类编辑推荐:Sequence iBPMS平台
- 006---Linux用户、群组和权限
- c++代码表白_一行 Python 代码能实现什么丧心病狂的功能? | CSDN博文精选
- 【MySQL】Mysql索引优化与底层数据结构深入剖析 - 笔记
- 全国计算机等级考试题库二级C操作题100套(第12套)
- 第17课:RDD案例(join、cogroup等实战)
- 关于考研与工作(人生规划)的个人思考
- SpringBoot入门二
- 计算机基础:计算机网络-socket编程
- OpenGL:绘制太阳地球例子
- python对列表中的字典的字段进行排序
- SaltStack实战之远程执行-Modules
- 一起来学Masonry (一)
- 区块链 以太坊 solidity require revert assert
- QT5.9 for 安卓开发 环境配置
- 2019奥斯卡谁是赢家 这里有一份来自AI的预测名单
- delphi 运算符
- 增值税发票开票软件卷票打印错位配置修正指南
- 利用计算机名称共享打印机步骤,如何连接共享打印机汇总教程
- 2019年12月份统考计算机应用基础题库,2019年12月网络教育统考《计算机应用基础》模拟题...
热门文章
- 检测手机屏幕是否亮屏解锁
- 第四次作业(胡明浩)
- 使用ThinkPHP框架高速开发站点(多图)
- 转,jQuery入门[4]-链式代码
- 《Windows via C/C++》学习笔记 —— 用户模式的“线程同步”之“条件变量”
- 关于文本摘要,知道这些足以!
- 收藏 | 《周志华机器学习详细公式推导版》发布,Datawhale开源项目pumpkin-book
- 李宏毅机器学习——无监督学习(三)
- Harbor 2.1发布,工程师的发际线有救了!
- 解构控制反转(IoC)和依赖注入(DI)