我现在看一个软件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内核模块里的读写函数相关推荐

  1. Linux测量进程内存峰值,linux / unix进程的峰值内存使用情况

    请务必回答这个问题 . 提供详细信息并分享您的研究! 对不起,我是第一次来这里,只能提问... 使用建议: valgrind --tool = massif --pages-as-heap = yes ...

  2. Linux Tomcat安装,Linux配置Tomcat,Linux Tomcat修改内存,Linux tomcat修改端口

    Linux Tomcat安装,Linux配置Tomcat,Linux Tomcat修改内存,Linux tomcat修改端口 >>>>>>>>>& ...

  3. linux结束进程_生人勿近之Linux里养僵尸

    Linux里养僵尸是怎么回事呢?Linux相信大家都很熟悉,但是Linux里养僵尸是怎么回事呢,下面就让小编带大家一起了解吧. - 1 - 上一篇挖了个 SIGHUP 的坑,这篇试着填一下. 之前在& ...

  4. Linux 用户进程内存空间详解

    经常使用top命令了解进程信息,其中包括内存方面的信息.命令top帮助文档是这么解释各个字段的. VIRT , Virtual Image (kb) RES, Resident size (kb) S ...

  5. linux按进程分配物理内存,linux下内存管理学习心得(一)

    最近在学习内存管理的时候,发现对linux下的所谓内存如何管理如何分配都不熟悉,通过最近的查阅资料可总结如下,如有不妥之处欢迎大家批评与指正. 总的的来说linux的内存管理其实主要难理解的是以下几个 ...

  6. linux清理进程内存,linux 内存使用管理及释放

    Linux 内存使用检查及释放内存 如何查看linux内存使用: 1.free -g 命令 或 free -h total:总计物理内存的大小. used:已使用多大. free:可用有多少. Sha ...

  7. linux 查看共享内存最大值,linux上更改共享内存的最大值

    linux下更改共享内存的最大值 System V IPC 参数 名字 描述 合理取值 SHMMAX 最大共享内存段尺寸(字节) 最少若干兆(见文本) SHMMIN 最小共享内存段尺寸(字节) 1 S ...

  8. linux和java_java内存和linux关系

    运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...

  9. linux高端内存申请,Linux高端内存

    高端内存是指物理地址大于 896M 的内存. 对于这样的内存,无法在"内核直接映射空间"进行映射. 为什么? 因为"内核直接映射空间"最多只能从 3G 到 4G ...

  10. Linux僵尸进程堆栈分析,linux系统僵尸进程

    1 什么是僵尸进程: 当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程.如果父进程先退出 ,子进程被init接管,子进程退出后init会回收其占用的 ...

最新文章

  1. 0基础学python编程难吗-对于0基础的人,直接学Python编程合适吗?
  2. [网络安全自学篇] 十三.Wireshark抓包原理(ARP劫持、MAC泛洪)及数据流追踪和图像抓取(二)
  3. 一个JavaScript上的OOP编程技巧:继承
  4. 装饰着模式示例_装饰器设计模式示例
  5. 你还不了解Redis的发布/订阅功能与Redis的Stream吗
  6. [论文阅读][经典ICP] A Method For Registration Of 3D Shapes
  7. 同迅计算机科技有限公司,同讯科技/student_info_system
  8. 后端基础概念:各种OCV一网打尽(下篇)
  9. C语言的关键字 详解
  10. 智能优化算法:混合蛙跳算法-附代码
  11. 思科路由器常用配置命令大全
  12. mac装虚拟机真的好吗?
  13. Scrapy学习笔记5——Spiders
  14. Scala语法(一) 基础语法(变量常量判断循环数组集合)
  15. ubuntu20.04 更新后蓝牙机械键盘不可用
  16. 智能门锁是智能家居入口
  17. 计算机技术应用社会实践课题,PLC自动化专业社会实践报告.docx
  18. WIFI模块RTL8723BU驱动移植
  19. 迷你计算机主板,打造最强MINI主机 五款高规ITX主板推荐
  20. python数学建模(二)线性规划2.实战(思路清晰\过程完整、详细)

热门文章

  1. linux中probe函数中传递的参数来源
  2. 2个YUV视频 拼接技术
  3. linux页表创建与更新
  4. Java的arrays运用
  5. 3992. 树上有猴-AcWing题库
  6. two pointers(双指针思想)
  7. python中对象排序的两种方式
  8. spark操作读取hbase实例
  9. hdu1133-----递推+大数
  10. baum welch java_Baum Welch估计HMM参数实例