关于用户空间和内核空间

当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(内核态)。在内核态下,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)后,就可以在用户空间对那块内存操作了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/253845.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

静态时序分析——Timing borrow

Timing Borrow技术又称为cycle stealing技术,主要是利用latch的电平敏感特性,通过有效电平获取数据,通过无效电平保持被锁存的数据,主要用于解决路径时序不满足电路要求的情况。 通过TimingBorrow可以对电路进行加速,当路径延迟较…

基于MTD的NAND驱动开发(二)

基于MTD的NAND驱动开发(二) 基于MTD的NAND驱动开发(三) http://blog.csdn.net/leibniz_zsu/article/details/4977853 http://blog.csdn.net/leibniz_zsu/article/details/4977869 四、基于MTD的NAND 驱动架构 1 、platform_device 和platform_driver 的定义和注册 对于我们的…

静态时序分析——Data to data check

setup和hold的检查也有可能发生在任意两个数据端口,其中不包括时钟端口。 我们将其中一个端口(pin)设置为约束端口(constrainted pin),就像触发器中的数据端口;将另一个一个端口(pin…

静态时序分析——Clock Gating check

门控时钟是RTL级进行低功耗设计的最常用方法,能够有效降低动态功耗。在实际使用中,一般用ICG(集成门控时钟单元)来完成clock gating。ICG电路和时序如下: 通常来说,工艺库已经集成了ICG,在做门控…

IC设计常见设计思想

速度与面积互换原则 所谓速度,是指整个工程稳定运行所能够达到的最高时钟频率,它不仅和电路内部各个寄存器的建立时间、保持时间以及外部器件接口的各种时序要求有关,而且还和两个紧邻的寄存器间的逻辑延时,走线延时有关。所谓面…

eclipse中如何配置tomcat

1.打开eclipse上面的Windows选项,选择Preferences>Server>Runtime Environments>Add 2.选择你电脑中安装的tomcat的版本我的是8所以我选的是Apache Tomcat v8.0 3,Next>Browse选择Tomcat的安装目录,选择jdk 4.Finish>OK tomcat配置完成。…

数字IC验证学习(一)

一、数据类型 1、logic logic类型只能有一个驱动。使用wire和reg的地方均可使用logic,但如双向总线等有多个驱动的地方,则不可使用logic。 2、二值逻辑 对于二值逻辑变量与DUT中的四值逻辑变量连接时,如果DUT中产生了X和Z,会被…

任意小数分频设计

对于任意小数分频,如果有PLL的话,直接倍频再分频即可;或常用的方法有双模前置小数分频和脉冲删除小数分频。前一种方法设计较为复杂,因此主要以第二种方式为主设计了一下。 任意小数均可以化为分数,例如要进行5.3分频即…

Bootstrap--圆角图片`圆形图

转载于:https://www.cnblogs.com/qiyiyifan/p/6159823.html

逻辑综合——概述与基本概念

逻辑综合系列主要说明以下问题: 为什么要逻辑综合逻辑综合的基本原理逻辑综合需要提供哪些文件逻辑综合过程中施加约束逻辑综合能产生那些结果 综合是前端设计的重要步骤之一,其过程是将行为描述的电路、RTL级的电路转换到门级,其目的在于&a…

Swoole 源码分析——Server模块之初始化

前言 本节主要介绍 server 模块进行初始化的代码,关于初始化过程中,各个属性的意义,可以参考官方文档: SERVER 配置选项 关于初始化过程中,用于监听的 socket 绑定问题,可以参考: UNP 学习笔记—…

linux下搭建git服务器

安装 Git Linux 做为服务器端系统,Windows 作为客户端系统,分别安装 Git 服务器端: #yum install -y git 安装完后,查看 Git 版本 [rootlocalhost ~]# git --version git version 1.7.1 客户端: 下载 Git for Windows&…

逻辑综合——工艺库

一、库文件的设置 运行DC时需要用到的库文件有:目标库(target library)、链接库(link library)、符号库(symbol library)、算术运算库(synthetic library)。 1、目标库…

[COGS 0065][NOIP 2002] 字串变换

65. [NOIP2002] 字串变换 ★★ 输入文件:string.in 输出文件:string.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 已知有两个字串A\$, B\$及一组字串变换的规则(至多6个规则): A1\$ ->…

逻辑综合——施加约束

Design Compiler时一个约束驱动(constraint-driven)的综合工具,它的结果与设计者施加的约束条件密切相关。 一、面积约束 进行面积的约束,也就是告诉DC综合的电路面积要在多少以内。在介绍约束命令之前,先了解一下面积…

[Codevs] 1004 四子连棋

1004 四子连棋 时间限制: 1 s空间限制: 128000 KB题目等级 : 黄金 Gold题目描述 Description在一个4*4的棋盘上摆放了14颗棋子,其中有7颗白色棋子,7颗黑色棋子,有两个空白地带,任何一颗黑白棋子都可以向上下左右四个方向移动到相邻…

逻辑综合——优化电路

对进行时序路径、工作环境、设计规则等进行约束完成之后,DC就可以进行综合、优化时序了,DC在优化过程中主要的策略将在下面进行说明。然而,当普通模式下不能进行优化的,就需要我们进行编写脚本来改进DC的优化来达到时序要求。 DC…

DOM包裹wrap()方法

DOM包裹wrap()方法 如果要将元素用其他元素包裹起来,也就是给它增加一个父元素,针对这样的处理,JQuery提供了一个wrap方法 .wrap( wrappingElement ):在集合中匹配的每个元素周围包裹一个HTML结构 简单的看一段代码: &…