【Linux驱动】copy_to_user 、copy_from_user 函数

2023-11-15

用户一般访问内核,需要从用户态变为内核态,然后再访问内核,这么做的目的是防止用户随意篡改内核。在编写某个外设的驱动时,我们需要实现内核中的 read 和 write 函数,此时站在内核的角度,无法直接读取用户缓冲区 或者 无法直接向用户缓冲区写入。

因此,就需要用到 copy_to_user 和 copy_from_user 函数。

  • copy_to_user():完成内核空间到用户空间的复制
  • copy_from_user():完成用户空间到内核空间的复制
#include <linux/uaccess.h>    // copy_to_user & copy_from_user 

目录

1、copy_to_user

(1) 函数声明

(2) 具体使用

2、copy_from_user 

(1) 函数声明

(2) 具体使用


1、copy_to_user

(1) 函数声明

调用该函数需站在内核的角度,即调用该函数所在文件中的缓冲区,都属于内核缓冲区

ulong copy_from_user(void *to, const void __user *from, unsigned long n)

第一个参数 to:目标用户空间的地址

第二个参数 from: 内核空间地址。保存了要拷贝到用户空间的内容的地址

第三个参数 n:要拷贝的字节数

返回值:成功返回 0

(2) 具体使用

static char readbuf[100]; /* 读缓冲区 */

/*
 * 该函数一般用于内核中的 read 函数的定义中,将内核接收到的内容拷贝到用户缓冲区
 */
static ssize_t xxx_read(struct file *filp, char __user *buf,
                        size_t cnt, loff_t *offt)
{
    int ret = copy_to_user(buf, readbuf, cnt);     // 将readbuf中的内容拷贝到buf
                                                   // 拷贝的字节数大小为cnt
    if(ret == 0)
    {
        printk("kernel send data ok!\n");
    }
    else
    {
        printk("kernel send data failed!\n");    
    }

    return 0;
}

2、copy_from_user 

(1) 函数声明

ulong copy_to_user(void __user *to, const void *from, unsigned long n);

第一个参数 to:目标内核空间的地址

第二个参数 from: 用户空间地址。保存了用户要发送的数据,或者要拷贝到内核空间的内容的地址

第三个参数 n:要拷贝的字节数

返回值:成功返回 0

(2) 具体使用

static char writebuf[100];

/*
 * 该函数一般用于内核中的 write 函数的定义中,将用户要发送的内容拷贝到内核缓冲区
 */
static ssize_t xxx_write(struct file *pfile, const char __user *buf, 
                        size_t cnt, loff_t *offset)
{
    /* 用户实现具体功能 */
	int ret = copy_from_user(writebuf, buf, cnt);    // 将buf中的内容拷贝到writebuf
	if(ret == 0)
	{
		printk("kernel read data ok!\n");
	}
	else
	{
		printk("kernel read data failed!\n");
	}

    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Linux驱动】copy_to_user 、copy_from_user 函数 的相关文章

随机推荐

  • Python学习笔记 - 阿里云天池Python训练营打卡(3)

    目录 1 阿里云天池Python教程链接 3 2 函数 2 1 函数定义 2 2 函数文档 2 3 help方法 2 4 函数参数 2 5 函数的返回值 2 6 变量作用域 2 7 模块 函数的导入 3 Lambda 匿名函数 3 1 La
  • 【计算机网络】【湖科大MOOC】网络层路由选择协议概述 内部网关协议RIP和OSPF的工作原理、工作过程 详细解读

    目录 网络层 6 路由选择协议 6 1 概述 6 1 1 路由选择 类别 6 1 2 因特网所采用的路由选择协议的 主要特点 6 1 3 常见的 路由选择协议 6 1 4 路由器的基本结构 6 2 内部网关协议 路由信息协议 RIP Rou
  • kali linux配置网络代理

    一 命令行终端 1 进入 etc profile d目录 新建文件proxy sh 内容如下 kali kali etc profile d cat proxy sh export proxy http 192 168 150 1 7890
  • 【Zabbix实战之部署篇】Zabbix客户端的安装部署方法

    Zabbix实战之部署篇 Zabbix客户端的安装部署方法 一 Zabbix agent2介绍 1 Zabbix agent2简介 2 Zabbix agent2优点 3 主动模式和被动模式 二 环境规划 1 Zabbix服务器部署链接 2
  • 【探索Linux】—— 强大的命令行工具 P.4(编译器 gcc/g++ 使用)

    阅读导航 前言 一 编译的四大过程 背景知识 1 预处理 Preprocessing 2 编译 Compilation 3 汇编 Assembly 4 链接 Linking 二 gcc的使用 1 概念 2 gcc主要特性和命令行选项 三 g
  • MATLAB学习各类函数归类总结笔记(主要图像处理方面)

    A开头 B开头 bwlabel函数 调用格式 L bwlabel BW n 或 L num bwlabel BW n 返回一个和BW大小相同的L矩阵 包含了标记了BW中每个连通区域的类别标签 这些标签的值为1 2 num 连通区域的个数 n
  • 手写Promise.resolve,Promise.reject, Promise.all

    promise A 规范中说明promise有三种状态 且状态一旦被改变就不能再次发生变化 const PENDING Pending const FULFILLED Fulfilled const REJECTED Rejected cl
  • 普洛斯与宁德时代签署战略合作协议;高博昌平国际研究型医院成为北京自贸区首批签约项目

    今日看点 普洛斯宣布与宁德时代签署战略合作协议 双方凭借在各自产业领域内的领先优势 组建资产管理合资公司 持有 管理和运营宁德时代电池 储能系统及其支持的各类车辆 船舶等资产 通过绿色能源资产服务化 降低物流 运输等相关企业大规模使用新能源
  • econgnition选择面向对象的样本,输出shp并在arcmap里打开,随机平均分为训练样本和测试样本

    有不懂的可以看我发的前一篇 打开软件 进行一个尺度为100的多尺度分割 进行一个类别的加 然后用它上面那个蓝色的三角尺工具 这个工具是直接指定类别的 不是用来选择样本的 在toolbar第二个选条那里选择你要的类别 比如我是vegetati
  • maven的安装和配置

    一 下载maven 1 下载地址Maven Download Apache Maven 2 将下载的文件进行解压到任意目录 linux解压用tar xvf apache maven 3 6 3 bin tar gz 3 windows配置环
  • CVE-2019-3396 Confluence RCE漏洞简单粗暴复现

    CVE 2019 3396 Confluence RCE漏洞简单粗暴复现 1 前言 网上也有很多关于该漏洞的说明和复现 不再做过多阐述 在复现该漏洞时踩了一些坑 然后发现了一个快速复现的方法 所以本篇文章介绍的是如何简单快速地复现该漏洞 想
  • Quartz 之 JobKey 源码解读

    首先 我们看下上个博文 CronTrigger 示例2 中部分打印的日志内容 INFO 17 一月 09 41 40 016 下午 MyScheduler Worker 9 com example03 SimpleJob SimpleJob
  • 2021-01-25Redis存取list

    redis存取list类型数据 首先 为了避免高并发给myql数据库增加负担 所有大多数时候会利用redis数据库解决这个问题 1 首先启动redis服务 在bin目录下打开powshell命令如下 PS D devtools Redis
  • 浅谈程序分析

    孙军 新加坡管理大学教授 研究方向为 形式化方法 软件工程 安全等 爱好 爬山 攀岩等 如果读者想了解更多有关程序分析相关的技术内容 欢迎加入编程语言技术社区 SIG 程序分析 加入方式 文末有小助手微信 添加并备注加入 SIG 程序分析
  • 获取map中第一个数据值

    为什么80 的码农都做不了架构师 gt gt gt 获取map中第一个非空数据值 param
  • Git GUI基本操作

    一 Git GUI基本操作 1 版本库初始化 gitpractise文件夹就变成了Git可以管理的仓库 目录下多了一个 git文件夹 此目录是Git用于管理版本库的 不要擅自改动里面的文件 这样会破坏Git仓库 git文件夹默认是隐藏的 如
  • 二进制编码

    前言 我们都知道 一个程序是 数据结构 算法 如果对应到组成原理或者是硬件层面上来说 算法就是我们的各种计算机指令 而数据结构就是我们对应的二进制数据 字符串的表示 从编码到数字 其实不仅数字可以用字符串来表示 最典型的例子就是字符串 最早
  • Java基础5--数组

    Java基础5 数组 数组定义 数组是相同类型数据的有序集合 数组描述的是相同类型的若干个数据 按照一定的先后次序排列组合而成 其中 每一个数据称作一个数组元素 每个数组元素可以通过一个下标来访问它们 数组声明与创建 首先必须声明数组变量
  • NLTK: [Error:11004] getaddrinfo failed

    当我运行nltk的词分割时 from nltk tokenize import word tokenize text God is Great I won a lottery print word tokenize text 出现了缺少pu
  • 【Linux驱动】copy_to_user 、copy_from_user 函数

    用户一般访问内核 需要从用户态变为内核态 然后再访问内核 这么做的目的是防止用户随意篡改内核 在编写某个外设的驱动时 我们需要实现内核中的 read 和 write 函数 此时站在内核的角度 无法直接读取用户缓冲区 或者 无法直接向用户缓冲