Windows中,不管是应用程序还是内核程序,都不能直接访问物理内存,所有非IO指令都只能访问虚拟内存地址,如Mov eax, DWORD PTR[虚拟地址]形式,但是,有时候,我们明明已经知道了某个东西固定在物理内存条某处,假如系统时间的值永远固定存放在物理内存条的物理地址0x80000000处,我们已经知道了物理地址,如何访问获得系统时间值呢?这是个问题!Windows为了解决这样的直接访问物理内存操作提供了手段!其中之一便是:“为物理页面建立临时映射”,也即可以将某个物理页面映射到系统地址空间中的那段专用于临时页面映射的保留区域。

  系统地址空间中专用于临时映射的那段保留区的起始虚拟地址为:#define  HYPERSPACE   0xC0400000

  保留区的大小为:1024个虚拟页面,也即1024*4KB=4MB大小

  函数MmCreateHyperspaceMapping用来将指定物理页面 临时 映射到保留区中的某个虚拟页面,返回得到的虚拟页面地址

Void*  MmCreateHyperspaceMapping(pfn)

{

   PTE* Pte=临时映射保留区的映射描述符们所在的二级页表;//也即第一个临时页面的映射描述符

   Pte+=pfn%1024;//从这个虚拟页面的映射描述符开始,向后搜索第一个尚未映射的虚拟页面

   For(i=pfn%1024; i<1024; i++,Pte++)//先遍历后面的那些PTE

   {

      If(*pte == 空白)

      {

        *pte.pfn=pfn;

        Break;

      } 

   }

   If(i==1024)//如果后面部分未找到一个空闲PTE,又从前面部分开始查找

   {

      PTE* Pte=临时映射保留区的映射描述符们所在的二级页表;//回到开头

      For(i=0; i<pfn%1024;i++,Pte++)

      {

         If(*pte == 空白)

         {

            *pte.pfn=pfn;

            Break;

         }

      }//end for

   }//end if(i==1024)

   //上面是一个简单的闭式hash表的查找过程,找到一个尚未映射的临时保留虚拟页面后,就返回

   Return HYPERSPACE + i*4kb;

}

  

  既然叫临时映射,那用完后,就得撤销映射:MmDeleteHyperspaceMapping(pfn);//这个函数就是用来删除以前建立的临时映射

HYPERSPACE的更多相关文章

  1. hdu 4666:Hyperspace(最远曼哈顿距离 + STL使用)

    Hyperspace Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Tota ...

  2. HDU 4666 Hyperspace (最远曼哈顿距离)

    Hyperspace Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Tota ...

  3. HDU 4666 Hyperspace (2013多校7 1001题 最远曼哈顿距离)

    Hyperspace Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Tota ...

  4. android中的简单animation(二)push up,push left,cross fade,hyperspace

    animation_2.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout x ...

  5. hdu4666 Hyperspace ——曼哈顿距离

    link:http://acm.hdu.edu.cn/showproblem.php?pid=4666 这题学会了怎么处理曼哈顿距离. 比如维数是k,那么每个点有2^k个状态,求出在每个状态下,所有点 ...

  6. HDU 4666 Hyperspace(曼哈顿距离)

    题目链接 这是HDU第400个题. #include <cstdio> #include <cstring> #include <set> #include < ...

  7. hdu 4666 Hyperspace(多维度最远曼哈顿距离)

    献上博文一篇http://hi.baidu.com/byplane747/item/53ca46c159e654bc0d0a7b8d 设维度为k,维护(1<<k)个优先队列,用来保存0~( ...

  8. HDU4666 Hyperspace(曼哈顿)

    题目链接. 分析: 这是多校的一个题,当时没做出来.学长说让用multiset. 用multiset将每一个数的1<<dim个状态全部保存.假设状态 i, 最远曼哈顿距离应当是 max[i ...

  9. hdu 4666 Hyperspace

    曼哈顿距离,两个点设为(x1,y1),(x2,y2),其距离为|x1-x2|+|y1-y2| #include <cstdio> #include <set> #include ...

随机推荐

  1. Java 诊断工具 Arthas 教程学习笔记

    Java 诊断利器 Arthas,是阿里的一款开源工具.Github-alibaba/arthas 上可以看到它的介绍.了解它,主要是最近对分析 Java 错误堆栈比较感兴趣,机缘巧合看到了它. 本文 ...

  2. Swagger和Postman的配置和使用

    Swagger 1. 配置 pom文件添加swagger依赖,注意版本,2.8.0可以使用 <dependency> <groupId>io.springfox</gro ...

  3. 论文笔记:Decoders Matter for Semantic Segmentation: Data-Dependent Decoding Enables Flexible Feature Aggregation

    Decoders Matter for Semantic Segmentation: Data-Dependent Decoding Enables Flexible Feature Aggregat ...

  4. STM32的PA15、PB3、 PB4管脚作普通管脚的解决办法

      最近做了一个板子,使用的是SWD方式进行下载程序,仅仅使用到SWDIO(PA13) 和SWCLK(PA14)两个管脚.我将PA15(JTDI)和PB3(JTDO)管脚用于他用(用于点LED使用), ...

  5. HTTP之gRPC

    gRPC 官方文档 gRPC 是一个高性能.开源和通用的 RPC 框架,面向移动和 HTTP/2 设计. gRPC 基于 HTTP/2 标准设计,带来诸如双向流.流控.头部压缩.单 TCP 连接上的多 ...

  6. 我的第一篇博客。(JavaScript的声明和数据类型的一些笔记)

    这是我的第一篇博客,务必请大家多多关照. 下面是前端js的变量和数据类型的一些笔记,不是很全请多多包涵. 1.变量 变量的声明 var 变量名 变量这个容器中放的是数据 变量的赋值 变量名 = 数据 ...

  7. Hadoop入门

    一.Hadoop是什么 1)Hadoop是一个由Apache基金会所开发的分布式系统基础架构. 2)Hadoop主要解决,海量数据的存储和海量数据的分析计算问题. 3)广义上来说,Hadoop通常是指 ...

  8. 编译原理中DFA最小化

    关于编译原理最小化的操作,专业术语请移步至:http://www.360doc.com/content/18/0601/21/11962419_758841916.shtml 这里只是记录一下个人的理 ...

  9. 分页查询最好加排序(order by)

    昨天,与外部化系统对接时,发现有一个数据一直咩有集成到,双方各自排查了自己系统的代码,都觉得逻辑非常简单,无法就是一个分页查询而已. 问题就出在这个分页查询上. 为了说明当时问题发生的情景,我模拟了一 ...

  10. C# 生成小于Int数值绝对值的随机数

    C#中有两种类型的随机数生成器: 伪随机数(System.Random) 安全随机数(System.Security.Cryptography.RNGCryptoServiceProvider)   ...