Linux内核空间和用户空间传递数据

Linux - 驱动编程 之 上报按键值(案例) 此部分转于:https://blog.youkuaiyun.com/bhniunan/article/details/104088763 在linux系统中,每个进程的运行空间分为内核空间和用户空间。之所以划分成这两个空间,是因为在 CPU 的所有指令中,有些指令是非常危险的,如果错用,将导致系统崩溃,比如清内存、设置时钟等。如果允许所有的程序都可以使用这些指令,那么系统崩溃的概率将大大增加。所以,CPU 将指令分为特权指令和非特权指令,对于那些危险的指令,只允许操作系统及其相关模块使用,普通应用程序只能使用那些不会造 阅读详情
       通常情况下,应用程序通过内核接口访问驱动程序,因此,驱动程序需要和应用程序交换数据。Linux将虚拟内存空间分为“内核空间”和“用户空间”。操作系统和驱动程序在内核空间运行,应用程序在用户空间运行,两者不能简单地使用指针传递数据。因为Linux系统使用了虚拟内存机制,用户空间的内存可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中。Linux内核提供了多个函数和宏用于内核空间和用户空间传递数据。主要有:access_ok(),copy_to_user(),copy_from_user,put_user,get_user。当需要交换的数据量较大时通常采用mmap映射的方法实现。
1.access_ok()
函数原型:int access_ok(int type,unsigned long addr,unsigned long size)
函数access_ok()用于检查指定地址是否可以访问。参数type为访问方式,可以为VERIFY_READ(可读),VERIFY_WRITE(可写)。addr为要操作的地址,size为要操作的空间大小(以字节计算)。函数返回1,表示可以访问,0表示不可以访问。

2.copy_to_user()和copy_from_user()
函数原型:unsigned long copy_to_user(void *to,const void *from,unsigned long len)
                  unsigned long copy_from_user(void *to,const void *from,unsigned long len)
这两个函数用于内核空间与用户空间的数据交换。copy_to_user()用于把数据从内核空间拷贝至用户空间,copy_from_user()用于把数据从用户空间拷贝至内核空间。第一个参数to为目标地址,第二个参数from为源地址,第三个参数len为要拷贝的数据个数,以字节计算。这两个函数在内部调用access_ok()进行地址检查。返回值为未能拷贝的字节数。
3.get_user()和put_user()
函数原型:int get_user(x,p)
                  int put_user(x,p)
这是两个宏,用于一个基本数据(1,2,4字节)的拷贝。get_user()用于把数据从用户空间拷贝至内核空间,put_user()用于把数据从内核空间拷贝至用户空间。x为内核空间的数据,p为用户空间的指针。这两个宏会调用access_ok()进行地址检查。拷贝成功,返回0,否则返回-EFAULT。
4.还有两个函数__copy_to_user()和__copy_from_user(),功能与copy_to_user()和copy_from_user()相同,只是不进行地址检查。还有两个宏__get_user()和__put_user(),功能与get_user()和put_user()相同,也不进行地址检查。
Linux UEVENT 简单应用 Linux UEVENT 极简 文章目录Linux UEVENT 极简UEVENT基础信息源码追踪代码用例KernelFramework UEVENT 基础信息 基础信息 uevent 常用于热插拔事件; 主要通过字符串(环境变量)在内核空间与用户空间之间传递信息。 默认环境变量: ACTION、DEVPATH、SUBSYSTEM ACTION类型: ​ KOBJ_ADD... 阅读详情

相关推荐

用户空间和内核空间数据传输

内核空间不能够直接通过指针在操作用户空间的内存,如果内核正在通过指针操作内存,此时进程结束,内核就会崩溃。正确的做法是在内核空间开辟自己可以操作的内存,将用户空间的数据拷贝到内核空间之后,内核操作自己的这块内存即可,即使进程意外结束,内核也不会崩溃,这种做法的安全性是要比前者的高的。驱动在Ubuntu上执行:make/驱动在开发板上执行:make ARCH=arm。

weixin_51332399的博客 499

在 Linux 下用户空间与内核空间数据交换的方式,第 1 部分: 内核启动参数、模块参数与sysfs、sysctl、系统调用和netlink

内核使用netlink需要专门的API,这完全不同于用户态应用对netlink的使用。第一个参数必须是 AF_NETLINK 或 PF_NETLINK,在 Linux 中,它们俩实际为一个东西,它表示要使用netlink,第二个参数必须是SOCK_RAW或SOCK_DGRAM, 第三个参数指定netlink协议类型,如前面讲的用户自定义协议类型NETLINK_MYTEST, NETLINK_GENERIC是一个通用的协议类型,它是专门为用户使用的,因此,用户可以直接使用它,而不必再添加新的协议类型。

赵凯月的博客 806

常规波束形成——时域波束形成、频域波束形成

本文介绍了波束成形,包括时域波束成形和频域波束成形,并解释了在实现过程可能存在疑惑的相位补偿。

Candy_Editor的博客 3664

用户空间与内核通信(一)

在Linux中,内核空间与用户空间是操作系统中的两个主要部分,它们有着明显的区别和不同的功能。

qq_42241500的博客 1678

Qualcomm工具的使用

简介   由于我们公司主要是以高通平台为主,所以工具的使用是必不可少的,包括QPST、QRCT3、QXDM、QDART等。   高通工具顾名思义就是,对于高通平台的软件开发进行软件的烧录,软件的调试,软件的Log的抓取和分析过程,像我们平常用的大致就是烧版本、改NV、制作QCN、然后校准、强发强收等操作。 QPST   QPST主要是用来做一些参数的配置,包括EFS文件的编辑,QCN的导入和备份与...

Jimmy 2万+

RTX4090上跑CenterNet训练

参考实现 url=https://github.com/xingyizhou/CenterNet.git commit_id=5b1a490a52da57d3580e80b8bb4bbead9ef2af96

遗失的神庙 1622

Linux实现内核空间和用户空间数据的传递

read和write的主角是内核,也就是说从内核的角度来决定是读还是写。 1,read 从内核空间传数据到用户空间,从内核里面读,写到用户 copy_to_user //字符串 copy_to_user(user_dst,kernel_source,count); put_user //整形数据 put_user(data_source,data_dst) 2,write //写到内核,从用...

陌上花开缓缓归以的博客 2181

FTP新手必看:vsftpd 530登录错误的8种实战解决方案(附详细配置步骤)

本文针对FTP服务配置中常见的vsftpd 530登录错误,提供了8种实战解决方案。从理解错误本质入手,系统性地排查用户列表策略、PAM认证、系统黑名单、Shell限制、目录权限及DNS解析等问题,并附有详细的配置步骤与命令,帮助新手快速定位并解决登录失败难题。

ik678901的博客 696

linux 各用户内存_Linux用户空间与内核空间(理解高端内存)

Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中。1 Linux内核地址映射模型x86 CPU采用了段页式地址映射模型。进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存。段页式机制如下图。2 Li...

weixin_35745604的博客 433

STM32L431电池供电项目实战:用STOP2模式把功耗降到5uA以下(CubeMX配置详解)

本文详细介绍了如何在STM32L431电池供电项目中利用STOP2模式实现5μA以下的超低功耗设计。通过CubeMX配置、硬件优化和软件策略,成功将农业温湿度监测节点的待机功耗控制在4.7μA,确保CR2032电池供电下3年以上的工作寿命。文章包含完整的低功耗实现路径和实测数据,特别适合物联网边缘设备开发者参考。

weixin_30345577的博客 393

游戏开发-GM系统的设计

游戏管理员(gm)作为游戏中拥有更高权限的账号,在游戏开发的过程中,我们需要很早的将gm系统做出来,作为测试游戏逻辑具有不可替代的作用。 内容目录 服务端与客户端通讯基本流程 gm命令格式设计 gm系统的实现 服务端与客户端通讯基本流程 服务端与客户端通信,如果基本的网络框架搭建完成,那么我们只需要写好命令就可以了 服务器完成一条命令的添加需要3个过程。 (1)命令格式的定义

微不足道 4617

linux内核内存管理(zone_dma zone_normal zone_highmem)

Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中。 Linux内核地址空间划分 通常32位Linux内核地址空间划分0~3G为用户空间,3~4G为内核空间。注意这里是32位内核地址空间划分,64位内核地址空间划分是不同的。 1、x86的物理地址空间布局:   物理地址空间的顶部以下一段空间,被PCI设...

飞天鱼 1271

RK3588上使用PCIE接口的国产千兆网卡YT6801

YT6801是裕太微电子开发的一款国产千兆PCIE以太网控制器芯片,可作为RK3588的PCIE外扩网口使用。

荻夜的博客 8216

Linux驱动:用户空间,内核空间内存交互测试

Linux驱动:用户空间,内核空间内存交互测试 本文博客链接:http://blog.youkuaiyun.com/jdh99,作者:jdh,转载请注明. 环境: 主机:Fedora12 目标板:MINI6410 目标板LINUX内核版本:2.6.38 实现功能: 使用read函数读取内核空间开辟的数组,使用write函数从用户空间写入数据到内核空间开辟的数组 说明: L...

移动编程 144

25、量子计算:中性原子与约瑟夫森结量子比特

本文详细探讨了中性原子和约瑟夫森结两种量子比特在量子计算中的应用。中性原子量子比特利用光晶格实现量子态的操控,具有长相干时间的优势,但面临可扩展性和多量子比特操作的挑战;而约瑟夫森结量子比特基于超导技术,结合半导体制造工艺,具有低耗散和潜在的高可扩展性,但在参数控制和环境干扰方面存在难题。文章还比较了这两种方案的性能、应用场景及未来发展趋势,展望了它们在量子计算发展中的潜力与突破方向。

ol789012的博客 212

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

使用proc文件系统和内核交互

《使用proc文件系统和内核交互》 本文档的Copyleft归rosetta所有,使用GPL发布,可以自由拷贝、转载,转载时请保持文档的完整性。 参考资料:IBM developerWorks 《使用/proc文件系统来访问Linux内核的内容》、Linux-2.6.10内核 来源:http://blog.youkuaiyun.com/rosetta/article/details/7563610

终身学习的程序猿 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

linux内核空间与用户空间信息交互方法

来源:http://www.kerneltravel.net/jiaoliu/005.htm 本文作者: 康华:计算机硕士,主要从事Linux操作系统内核、Linux技术标准、计算机安全、软件测试等领域的研究与开发工作,现就职于信息产业部软件与集成电路促进中心所属的MII-HP Linux软件实验室。如果需要可以联系通过kanghua151@msn.com联系他。 摘要:在进行...

woshihuabin的博客 150

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

十天学Linux内核之第九天---向内核添加代码

十天学Linux内核之第九天---向内核添加代码 http://www.cnblogs.com/lihuidashen/p/4255826.html 先来熟悉一下文件系统,通过/dev可以访问Linux的设备,我们以men设备驱动程序为例来看看随机数是如何产生的,源代码在dirvers/char/mem.c上可以查看 static int memory_o

zdy0_2004的专栏 524

用户空间和内科空间交互信息方法--> copy_to_user

用法如下: 详细得机制见转载他人得博客 地址 http://blog.youkuaiyun.com/yangdelong/article/details/5491097 http://blog.youkuaiyun.com/ce123_zhouwei/article/details/8457822 一、Copy_to_user( to, &from, sizeof(from))

liliyaya的专栏 818

Linux内核的ioctl函数学习

本函数影响由fd参数引用的一个打开的文件。   #include #include   int ioctl( int fd, int request,.../* void *arg */ ); 返回0:成功   -1:出错   第三个参数总是一个指针,但指针的类型依赖于request参数。 我们可以把和网络相关的请求划分为6类: 套接口操作 文件操作 接口操作 ARP高速

abcdefg的专栏 1045

linux的netlink机制

http://blog.youkuaiyun.com/dog250/article/details/5303430 netlink作为一种用户空间和内核空间通信的机制已经有一定年头了,它不光为了内核和用户通信,还可以作为IPC机制进行进程间通信。其实netlink定义了一个框架,人们可以基于这个框架用它来做可以做的任何事情,linux中不乏这些类似的好的框架。它们的共同点就是内核并不管它们能做什么,

Gabby 736

linux字符设备驱动------>用户和内核的数据拷贝

【代码】linux字符设备驱动------>用户和内核的数据拷贝。

m0_59039307的博客 287
上一篇: 数字滤波算法
下一篇: Linux内核与驱动面试要点
小飞鱼hubble
博客等级 码龄15年 14粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值