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. Dockerfile详解及优化

    Dockerfile详解 0. Dockerfile的作用 docker可以根据Dockerfile中的指令来构建docker镜像.Dockerfile是一个文本文件,其应当包含用户想要构建一个镜像的 ...

  2. 实验9-1 编写一个存储过程proc_test_func

    在TestDB数据库中,编写一个存储过程proc_test_func,要求如下: 1)输入参数 一个整型的输入参数 @value 2)要求在一个select语句返回: @value的绝对值, 此绝对值 ...

  3. linux下ifconfig命令看不到IP centos7——ens33

    当前环境VMware15+centos7  在终端输入ifconfig后没有开到IP地址: 解决方法:root用户执行命令 cd /etc/sysconfig/network-scripts/ vi ...

  4. selenium python 中浏览器操作

    1.启用浏览器 browser = webdriver.Chrome()               谷歌浏览器 browser = webdriver.Firefox()              ...

  5. Qt551.窗口滚动条

    1.代码的方式来创建 ScrollArea,然后使用 倒是 正常(有滚动条显示),但是此方式太麻烦 不如直接拖控件来的方便直观快捷. 但是,直接拖控件的方式 ScrollArea中无法显示出 滚动条, ...

  6. python多版本共存

    根据环境变量的顺序调用python,pip等程序 将python.exe修改为python2.exe(或python3.exe)后可以通过不同的名字调用不同版本的python 注意修改Anaconda ...

  7. 技巧 筛1~n的所有因子

    从 i : 1~n, 是i的倍数, 则计入该数 复杂度 n*(1/1+1/2+1/3+...1/n)=nlogn ll d[N]; // 计每个数的因子数 set<ll> s[N]; // ...

  8. MySQL 存储过程 if语句

    MySQL  存储过程 if语句 MySQL IF语句允许您根据表达式的某个条件或值结果来执行一组SQL语句. 要在MySQL中形成一个表达式,可以结合文字,变量,运算符,甚至函数来组合.表达式可以返 ...

  9. 下载 youtube 油管的视频

    以前也曾经用个工具下过,好像是浏览器插件. 但是到底是什么也记不起来了,删没删除,怎么删除的,全都没有记忆了. 唉,无论多么小的事,只有记到本子或者网络上,才能记得住啊. 所以,这回发现了 youtu ...

  10. UML序列图参考资料

    UML各个图的说明:http://www.uml.org.cn/oobject/201509015.asp?artid=16901 UML类图的说明:https://www.cnblogs.com/a ...