当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(内核态)。在内核态下,CPU可执行任何指令。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。用户态不能访问内核空间,包括代码和数据。

进程处于用户态时能访问的是用户空间,处于内核态时能访问的称为内核空间。

CPU执行程序所访问的地址都是虚拟地址,MMU 必须通过读取控制寄存器CR3中的值作为当前页面目录的指针,进而根据分页内存映射机制(参看相关文档)将该虚拟地址转换为真正的物理地址才能让CPU真正的访问到物理地址。

进程有4G的寻址空间,其中第一部分为“用户空间”,用来映射其整个进程空间(0x0000 0000-0xBFFF FFFF)即3G字节的虚拟地址;第二部分为“系统空间”,用来映射(0xC000 0000-0xFFFF FFFF)1G字节的虚拟地址。可以看出Linux系统中每个进程的页面目录的第二部分是相同的,所以从进程的角度来看,每个进程有4G字节的虚拟空间,较低的3G字节是自己的用户空间,最高的1G字节则为与所有进程以及内核共享的系统空间。

if(数据在物理内存中)
        {        虚拟地址转换成物理地址
                 读数据 }
        else
        {     if(数据在磁盘中)
              {
                     if(物理内存还有空闲)
                     {          把数据从磁盘中读到物理内存
                                 虚拟地址转换成物理地址
                                 读数据
                     }
                     else
                     {          把物理内存中某页的数据存入磁盘
                                 把要读的数据从磁盘读到该页的物理内存中
                                 虚拟地址转换成物理地址
                                 读数据
                     }
              }
              else
              {     报错        } }

请问如何在驱动程序里边通过用户空间的虚拟地址得到它对应的物理地址呢?

一般的驱动程序里边都要实现read函数
read函数里边有一个参数char* buf是用户空间传递过来的指针,是用户空间的虚拟地址,请问我怎么通过这个虚拟地址得到它对应的物理地址呢?
(因为我想实现通过dma把内核空间的数据传送到用户空间去,所以一定要知道buf对应的物理地址)

请问有可能吗?

谢谢

我觉得有三种解决方案.第一种性能差些,但是简单,即先从内核到内核dma,然后再调用现成的copy_to_usr等函数.第二种就是搜索该用户进程的页表,(找到该进程的task结构,task->pgd...),从页表中搜索虚拟地址对应的物理地址.第三种就是在内核中开辟一块内存,用于存放dma后的数据,然后将它映射到用户空间去.这种方法我以前采用过,依稀的一些印象是.mknod一个设备文件,然后对该设备文件进行一些ioctl请求(ioctl的各个操作函数当然是自己写),必需实现的一个函数是该文件的***_mmap.(这样mmap系统调用->do_mmap()->do_mmap_pgoff()然后再找到你的***_mmap()),在这个map函数中,一个关键可用的内核函数是remap_page_range().该函数则可用来生成一个用户空间的vma段,然后将其和给定的物理内存(设备文件片断)联系起来,将返回的虚拟地址传回用户空间(ioctl)后,就可以在用户空间对那块内存操作了

关于用户空间和内核空间相关推荐

  1. linux 物理内存用完了_Linux用户空间与内核空间(理解高端内存)

    Linux内核地址映射模型 x86 CPU采用了段页式地址映射模型.进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存. 段页式机制如下图. Linux内核地址空间划分 通常32位L ...

  2. 用户空间与内核空间,进程上下文与中断上下文[总结]

    用户空间与内核空间,进程上下文与中断上下文[总结] 最近有研究到zabbix监控,就得清楚cpu各个指标的含义, 1,简单回顾下cpu及计算机组成: 计算机五大部件: 运算器 控制器 存储器 输入/输 ...

  3. 虚拟内存,虚拟地址空间,用户空间,内核空间

    虚拟内存,就是用磁盘作为介质,暂时性存储数据,和主存进行换入换出,使程序能够使用更多的内存.虚拟内存是单位是页,固定大小的数据方便数据的交换.如果一个应用程序要访问某段内存,通过MMU得到相应的页号, ...

  4. 【Binder 机制】进程通信 | 用户空间与内核空间 | MMU 与虚拟内存地址

    文章目录 一.进程通信 二.用户空间与内核空间 三.MMU 与虚拟内存地址 一.进程通信 进程隔离概念 : 系统中的进程存在 " 进程隔离 " , 出于对进程运行的保护 , 两个进 ...

  5. 用户空间和内核空间通讯Netlink

    用户空间和内核空间通讯Netlink http://pan.baidu.com/s/1i386MWX

  6. Linux Malloc分析-从用户空间到内核空间

    Linux Malloc分析-从用户空间到内核空间 本文介绍malloc的实现及其malloc在进行堆扩展操作,并分析了虚拟地址到物理地址是如何实现映射关系. ordeder原创,原文链接: http ...

  7. Linux 用户空间和内核空间指的是什么?

    Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间.两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数 ...

  8. (整理)用户空间_内核空间以及内存映射

    内核空间和用户空间   现代操作系统采用虚拟存储器,对于32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也 ...

  9. Linux 用户空间和内核空间

    最近在微信群里看到有人提这个问题,然后查了下资料,觉得这篇文章是写得最能让人看懂的,分享给大家. 欢迎大家评论说出自己的见解,让更多的人更容易理解这部分知识. 之前的相关文章 Linux内存,先看这篇 ...

  10. 用户空间与内核空间,进程上下文与中断上下文[总结]【转】

    转自:http://blog.csdn.net/lizuobin2/article/details/51791863 本文转载自:http://www.cnblogs.com/Anker/p/3269 ...

最新文章

  1. 英语中那些缺钱的表达~
  2. 八大编程知名编程语言或系统的发展简史
  3. Python 字典删除元素clear、pop、popitem
  4. Retrofit+RxJava联网工具类
  5. mysql 返回多行数据_mysql – 如何连接多个表,包括查找表和返回行中的数据
  6. 照顾好自己才能照顾好别人_您必须照顾的5个基本数据
  7. 如何将枯燥的大数据呈现为可视化的图?
  8. Mysql 索引案例学习
  9. 驱动级的自动按键_太牛了!业余单片机爱好者用DS3231制作自动亮度的4位数码管时钟...
  10. TCP/IP路由技术 -1.3 IPv4地址
  11. python3 datatime,python3处理时间和日期:datetime模块 – Python3教程
  12. QSqlTableModel模型使用详解
  13. Java中的注释方法
  14. android记账系统预算功能,怎么挑选合适的 Android 记账应用?你可以从记账需求入手...
  15. 计算机网络对生活的影响论文,浅论计算机对我们生活的影响论文
  16. 程序收到一段如下文本
  17. 无线网络与移动网络详解
  18. 【图片无损压缩利器】Image Optimizer
  19. 每日新闻简报 每天三分钟,知晓天下事 一句话新闻早餐
  20. 美元与人民币汇率 Python

热门文章

  1. 设计模式学习-工厂方法模式
  2. [iPhone开发]UIWebview 嵌入 UITableview
  3. gitbook 入门教程之解决windows热加载失败问题
  4. springboot 使用的配置
  5. 微信小程序 - 五星评分(含半分)
  6. Ubuntu16.04安装nginx
  7. 怎样根据字段域查找到其在数据库中关系与属性
  8. Android Build.VERSION.SDK_INT兼容介绍
  9. sql server规范
  10. Hibernate之工具类HibernateUtil