关于WIndows内核自映射方案的通俗解释

  在一次操作系统课程上听老师说了这么一个有意思的东西,windows的自映射方案居然达到了把4K的页目录的线性地址“藏”在4M页表里的效果,感觉甚是奇特,于是乎就想着说怎么去算。光会算之后仍旧不满足,我又感觉对我而言有两个问题是很模糊的:

  • 为什么说0xC0300000是可行的页目录线性地址起始处?
  • 在以0xC0000000为页表的线性地址的条件下,页目录的线性地址的起始处必须是0xC0300000吗?

  为了解决这两个问题,我查看了很多个博客,但是大多数博客或文章对原理进行了充分的解释,但是并没有例子来说明,个人觉得这样会显得十分空洞,所以下面来跟大家探讨一下有关问题的通俗一点的解释,如果有错误的地方还望指正。

Q1:0xC0300000为何可行

    首先我们有如下断言:知道了一个页表的4M空间的线性地址,就可以确定是页目录项的第几项中存放着页目录的物理地址。

  首先值得一再强调的就是:页目录项(PDE)中存放的页表的物理地址。先来解释这个“狂言”。我们能够直接知道物理地址只有页目录的物理地址(在CR3寄存器中),内存中的页目录项里放着每个页表的物理地址,所以我们访问页表时只能通过间接的方式来访问其物理地址。通过哪种方式呢,实际上就是通过我们虚拟地址高10位作为索引,CR3寄存器中的值为基址来寻找页表,从而访问其物理地址。假定页目录的虚拟地址并不知道,但我们想通过虚拟地址去访问一个页表的物理地址的时候,我们访问的页目录项始终是第768项,这是因为页表的4M线性地址(这里起始于0xC0000000)确定后,其前10位的值始终都是1100 0000 00。我们想访问不同页表的物理地址,但是我们却每次从同一个位置的同一个页目录项中找到同一个物理地址,那么我们就要发问了,我们明明要访问的是不同页表的物理地址啊,但是我们每次取到的都是相同的页目录的索引号,为什么?

时间: 2024-12-23 18:58:20

关于WIndows内核自映射方案的通俗解释的相关文章

C++windows内核编程笔记day07_day08,可视化建菜单、加速键使用、绘图等

可视化操作创建的菜单,加载到窗口. 方法1:注册时指定菜单 wce.lpszMenuName=MAKEINTRESOURCE(IDR_MENUMAIN);//数字形式的资源ID转换为字符串形式的资源 方法2: //创建窗口时加载菜单资源 HMENU menumain= LoadMenu(g_hinstance,MAKEINTRESOURCE(IDR_MENUMAIN)); menumain 传入 CreateWindowEx();//倒数第三个参数 窗口指定小图标: 1.注册时指定 wce.hI

Windows内核原理系列01 - 基本概念

1.Windows API Windows 应用编程接口(API)是针对WIndwos操作系统用户模式的系统编程接口,包含在WindwosSDK中. 2.关于.NET .NET由一个被称为FCL的类库和一个被称为CLR的公共语言运行库组成.FCL是建立在CLR之上的,而CLR是一组标准的COM服务器,提供了垃圾回收,即时编译类型检验等特性.由于CLR的这些特性,使得开发人员的生产效率得以提高..NET框架与组建的关系如下: .NET应用程序 用户模式(托管代码) —————————— 类库(FC

【转载】LINUX 和 WINDOWS 内核的区别

LINUX 和 WINDOWS 内核的区别 [声明:欢迎转载,转载请注明出自CU ACCESSORY http://linux.chinaunix.net/bbs/thread-1153868-1-1.html] 关于LINUX和WINDOWS的口水站已经很多了.本文企图从技术角度来比较下2个主流操作系统的异同.偏重于内核部分. 一.动机: 我最早是 WINDOWS 阵营的.在WINDOWS下写过2年多的驱动程序.后来由于学习需要,转投LINUX,一晃也快2年了.期间经历了很多曲折,也学到了很多

Windows内核之内核对象

1内核对象定义: 1.1:每个内 核对象只是内核分配的一个内存块,并且只能由该内核访问. 1.2:该内存块是一种数据结构,它的成员负责维护该对象的各种信息. 有些数据成员(如安全性描述符.使用计数等)在所有对象类型中是相同的,但大多数数据成员属于特定的对象类型.例如,进程对象有一个进程ID .一个基 本优先级和一个退出代码,而文件对象则拥有一个字节位移.一个共享模式和一个打开模式. 2内核对象种类: 比如存取符号对象. 事件对象.文件对象.文件映射对象.I / O 完成端口对象.作业对象.信箱对

Windows内核

每天我们都在使用Windows系统学习.编程.听音乐.玩游戏,Windows的操作想来是非常熟练了,但是你又对Windows究竟了解多少呢?本系列的目的,就是让你对Windows系统有个更直观.更清楚.更彻底的认识.尽管我们大多数人看不到Windows的源代码,对其内存调度算法这样的最深层次的技术内幕不能明窥,但是我们能够做到比方今知道的很多其它,了解这些之后你会发如今Windows上面开发会轻车熟路,不论什么木马病毒到了你机器上只是仅仅会成为你的试验品. 鉴于Windows 9X内核早已淘汰,

从hook开始聊聊那些windows内核数据结构

总览: IAT HOOK Object Hook Ssdt Hook 源码 内核知识及源码 内核知识级源码 一.IAT HOOK:因为上一篇博客对已经对IAT Hook基本流程及作用进行了介绍,希望能先学懂PE再来看IATHook.下面贴上Iathook的源码,源码中有详细的注释,还记着为什么不能结束360的进程吗?参考思路如下图(因为写代码的时候解决方案写到了源码中,不粘贴复制过来了): 以下代码是DLL注入+iathook,通过测试procexp中的kill功能并没有使用OpenProces

Windows内核原理-同步IO与异步IO

目录 Windows内核原理-同步IO与异步IO 背景 目的 I/O 同步I/O 异步I/O I/O完成通知 总结 参考文档 Windows内核原理-同步IO与异步IO 背景 在前段时间检查异常连接导致的内存泄漏排查的过程中,主要涉及到了windows异步I/O相关的知识,看了许多包括重叠I/O.完成端口.IRP.设备驱动程序等Windows下I/O相关的知识,虽然学习到了很多东西,但是仍然需要自顶而下的将所有知识进行梳理. 目的 本片文章主要讲解同步I/O与异步I/O相关知识,希望通过编写本篇

【转】Windows内核下操作字符串!

* Windows内核下操作字符串! */ #include <ntddk.h> #include <ntstrsafe.h> #define BUFFER_SIZE 1024 VOID DriverUnload(IN PDRIVER_OBJECT pDriverObject) { KdPrint(("DriverUnload Load...\n")); } //==================================================

windows下备份mysql方案

总体思想 定时任务调用备份脚本 1.定时任务, 自行研究 2.脚本 c:\mysql_bak\bin\mysqldump.exe -ugbds -pxxxx gbds --hex-blob>c:\mysql_bak\sql\gbds_%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%.sql 备注: 对于mysqldump.exe可以使用快捷方式复制到使用目录 windows下备份mysql方案,布布扣,bubu