linux读写进程内存函数,Linux内核模块里的读写函数
我现在看一个软件GPS接收机的源代码,是用Linux内核模块写的。在其中的读函数里,程序直接用copy_to_user将数据从内核态拷贝到用户态,我想知道其具体是如何操作的呢?数据在内核态是什么意思,拷贝到用户态又是什么意思?
另外,我注意到,在中断服务程序里有这样的代码:用inw_p直接从芯片的寄存器内读取数据,供中断服务程序使用。这样,就有两个读取的函数了,请问这二者有何区别,又有没有什么联系呢?我一直对数据如何从硬件(寄存器)上转移到用户上不太清楚,希望有朋友解惑!甚谢!
|
ls的说的 x86 cpu的特权级5 ,真是闻所未闻
linux内存模型可以很容易搜索到。32位的cpu可寻址4G地址空间。对于每个进程来说,都可以访问4G的地址空间。其中又分为用户空间和内存空间,配置内核时可以指定分配方式。一般采用3G用户空间,1G内核空间的分配方式。每个进程的3G的用户空间是私有的,1G的内核空间是所有进程共享的。分界地址就是0xc0000000
。用户空间不能访问高于0xc0000000的地址空间,会报段错误。
用户空间使用驱动程序,是通过读写设备文件实现的。用户态的read()最终会调用内核struct file_operations里注册的read函数。这个相信lz也不是完全不知道。用户态write()的第二个参数是缓冲区指针指向的用户态的内存空间,内核驱动里的write传入的第二个参数就是这个用户态的缓冲区地址。内核如果直接对这个用户态地址进行操作,不能保证进程在睡眠时属于它的内存空间不被置换出去,很可能造成读内存错误,所以要靠copy_from_user将其读入内核中的一段内存空间。内核也不能直接操作用户态的内存,所以对应用户程序的read,要使用copy_to_user将内核空间数据传递给用户空间内存。
第二个问题,关于中断中的读取和驱动原有的read,他们是不一样的
中断是由硬件触发的,驱动原有的read是用户自己写程序去读的
即中断读是响应硬件要求驱动去读,原来的read是响应用户编程去读。
一般是设备每准备好一次数据,就触发一次中断,驱动程序读取设备信息存储起来,等到用户程序读取的时候一次返回所有数据。
linux读写进程内存函数,Linux内核模块里的读写函数相关推荐
- Linux测量进程内存峰值,linux / unix进程的峰值内存使用情况
请务必回答这个问题 . 提供详细信息并分享您的研究! 对不起,我是第一次来这里,只能提问... 使用建议: valgrind --tool = massif --pages-as-heap = yes ...
- Linux Tomcat安装,Linux配置Tomcat,Linux Tomcat修改内存,Linux tomcat修改端口
Linux Tomcat安装,Linux配置Tomcat,Linux Tomcat修改内存,Linux tomcat修改端口 >>>>>>>>>& ...
- linux结束进程_生人勿近之Linux里养僵尸
Linux里养僵尸是怎么回事呢?Linux相信大家都很熟悉,但是Linux里养僵尸是怎么回事呢,下面就让小编带大家一起了解吧. - 1 - 上一篇挖了个 SIGHUP 的坑,这篇试着填一下. 之前在& ...
- Linux 用户进程内存空间详解
经常使用top命令了解进程信息,其中包括内存方面的信息.命令top帮助文档是这么解释各个字段的. VIRT , Virtual Image (kb) RES, Resident size (kb) S ...
- linux按进程分配物理内存,linux下内存管理学习心得(一)
最近在学习内存管理的时候,发现对linux下的所谓内存如何管理如何分配都不熟悉,通过最近的查阅资料可总结如下,如有不妥之处欢迎大家批评与指正. 总的的来说linux的内存管理其实主要难理解的是以下几个 ...
- linux清理进程内存,linux 内存使用管理及释放
Linux 内存使用检查及释放内存 如何查看linux内存使用: 1.free -g 命令 或 free -h total:总计物理内存的大小. used:已使用多大. free:可用有多少. Sha ...
- linux 查看共享内存最大值,linux上更改共享内存的最大值
linux下更改共享内存的最大值 System V IPC 参数 名字 描述 合理取值 SHMMAX 最大共享内存段尺寸(字节) 最少若干兆(见文本) SHMMIN 最小共享内存段尺寸(字节) 1 S ...
- linux和java_java内存和linux关系
运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...
- linux高端内存申请,Linux高端内存
高端内存是指物理地址大于 896M 的内存. 对于这样的内存,无法在"内核直接映射空间"进行映射. 为什么? 因为"内核直接映射空间"最多只能从 3G 到 4G ...
- Linux僵尸进程堆栈分析,linux系统僵尸进程
1 什么是僵尸进程: 当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程.如果父进程先退出 ,子进程被init接管,子进程退出后init会回收其占用的 ...
最新文章
- 0基础学python编程难吗-对于0基础的人,直接学Python编程合适吗?
- [网络安全自学篇] 十三.Wireshark抓包原理(ARP劫持、MAC泛洪)及数据流追踪和图像抓取(二)
- 一个JavaScript上的OOP编程技巧:继承
- 装饰着模式示例_装饰器设计模式示例
- 你还不了解Redis的发布/订阅功能与Redis的Stream吗
- [论文阅读][经典ICP] A Method For Registration Of 3D Shapes
- 同迅计算机科技有限公司,同讯科技/student_info_system
- 后端基础概念:各种OCV一网打尽(下篇)
- C语言的关键字 详解
- 智能优化算法:混合蛙跳算法-附代码
- 思科路由器常用配置命令大全
- mac装虚拟机真的好吗?
- Scrapy学习笔记5——Spiders
- Scala语法(一) 基础语法(变量常量判断循环数组集合)
- ubuntu20.04 更新后蓝牙机械键盘不可用
- 智能门锁是智能家居入口
- 计算机技术应用社会实践课题,PLC自动化专业社会实践报告.docx
- WIFI模块RTL8723BU驱动移植
- 迷你计算机主板,打造最强MINI主机 五款高规ITX主板推荐
- python数学建模(二)线性规划2.实战(思路清晰\过程完整、详细)