操作系统学习笔记(二) 页式映射及windbg验证方式
页式映射
本系列截图来自网络搜索及以下基本书籍:
《Windows内核设计思想》
《Windows内核情景分析》
《WINDOWS内核原理与实现》
一个32位虚拟地址,该地址其实分为三个部分:页目录表偏移、页表偏移和页偏移。其22-31位表示页目录表偏移,12-21位表示页表偏移,剩下的0-11位表示页面内偏移。
映射过程如下:
以最常见的物理页面为4K规格为例。
首先我们获得一个32位虚拟地址,然后查询CR3寄存器,确认页目录表(PDT)的位置,根据虚拟地址22-31位的偏移值找到该页面目录项(PDE),该页面目录项指向一个页表(PT),再根据虚拟地址12-21位的偏移值找到该页面项(PTE),该页面项指向一个4K大小的内存页,根据虚拟地址的0-11位的页面内偏移找到物理地址。
页面目录表的偏移和页面表的偏移之所以是10位
是因为2的10次方=1024
也就是页面目录表和页面表的中包含有1024个选项
每个选项保存的是一个32位地址(指向页表或者物理内存页) 也就4字节
1024*4 = 4K
刚好就是一个物理页面的长度
而虚拟地址中的页偏移是0-11位 刚好12位
2的12次方式4096 也就是4K
刚好描述一个物理内存页的小大。
//==============================
使用windbg来验证分页机制
参考:http://www.cnblogs.com/winston/archive/2009/04/12/1434225.html
实验环境: 32位windows操作系统 未开启PAE地址扩展
安装了windbg调试器
首先开启计算器 在其中输入9999几个数字
使用windbg 附加到这个计算器进程上
输入 x calc!gpsz*
如下:
0:002> x calc!gpsz*
01014dc4 calc!gpszNum = <no type information>
再看看 01014dc4 这个地址包含了什么
0:002> dd 01014dc4
01014dc4 000b11d8 00000008 00000000 00000001
01014dd4 00000000 00000000 ffffffff 00000000
01014de4 00000000 00000006 00330032 00320034
再看看地址000b11d8 存储的什么数字
0:002> du 000b11d8
000b11d8 "9999."
到这里我们就可以确认 进程 calc.exe 中地址000b11d8 存储内容为"9999.";
我们再开启一个windbg 进入本地内核调试模式 kernel debug->local
先获取所有进程信息
kd> !process 0 0
PROCESS 84a5c278 SessionId: 0 Cid: 0b0c Peb: 7ffd4000 ParentCid: 00a8
DirBase: 0d69a000 ObjectTable: e1fba560 HandleCount: 44.
Image: calc.exe
PROCESS 845ed400 SessionId: 0 Cid: 0be0 Peb: 7ffdd000 ParentCid: 00a8
DirBase: 17b94000 ObjectTable: e1ee9ac0 HandleCount: 108.
Image: windbg.exe
PROCESS 8454da10 SessionId: 0 Cid: 0f68 Peb: 7ffdf000 ParentCid: 041c
DirBase: 0c5f7000 ObjectTable: e1e739b8 HandleCount: 112.
Image: wuauclt.exe
PROCESS 84a5fc00 SessionId: 0 Cid: 059c Peb: 7ffd3000 ParentCid: 0330
DirBase: 0c13d000 ObjectTable: e1f9d820 HandleCount: 155.
Image: wmiprvse.exe
得到calc.exe进程信息 其中DirBase: 0d69a000即是指向页面目录表的物理页面
而在页面目录表的偏移就是虚拟地址000b11d8 的高10位 就是0(0000 0000 00)
使用!dd 查看物理地址内容 页面目录表加偏移的内容
kd> !dd 0d69a000 +0
# d69a000 0d881867 0d667867 0d443867 00000000
# d69a010 0d834867 00000000 00000000 00000000
# d69a020 00000000 00000000 00000000 00000000
# d69a030 00000000 00000000 00000000 00000000
# d69a040 00000000 00000000 00000000 00000000
# d69a050 00000000 00000000 00000000 00000000
# d69a060 00000000 00000000 00000000 00000000
# d69a070 00000000 00000000 00000000 00000000
0d881867即使页面表的物理地址,同样我们只取高20位,低12位是该物理页面的属性记录
页面表的偏移是虚拟地址000b11d8 中间10位 也就是 0b1 (00 1011 0001)
读取页面表加偏移的内容
kd> !dd 0d881000 +b1*4 l1
# d8812c4 0d75e867
最后获得了页面 页面同样只取高20位,低12位是该物理页面的属性记录
偏移是虚拟地址000b11d8 低12位也就是1d8
kd> !dd 0d881000 +b1*4 l1
# d8812c4 0d75e867
使用!du 指令来读取物理页面的内容
kd> !du 0d75e000+1d8
# d75e1d8 "234234."
与虚拟地址000b11d8 内容一致
即 calc.exe进程中 虚拟地址000b11d8转化为物理地址0d75e000+1d8
操作系统学习笔记(二) 页式映射及windbg验证方式的更多相关文章
- ucore操作系统学习笔记(二) ucore lab2物理内存管理分析
一.lab2物理内存管理介绍 操作系统的一个主要职责是管理硬件资源,并向应用程序提供具有良好抽象的接口来使用这些资源. 而内存作为重要的计算机硬件资源,也必然需要被操作系统统一的管理.最初没有操作系统 ...
- Hibernate学习笔记二:常用映射配置
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6760895.html 一:单向一对一 常用唯一外键的方法来配置单向一对一关系. 1:实体关系 类A中有类B对象 ...
- redux-form的学习笔记二--实现表单的同步验证
(注:这篇博客参考自redux-form的官方英文文档)左转http://redux-form.com/6.5.0/examples/syncValidation/ 在这篇博客里,我将用redux-f ...
- 操作系统学习笔记5 | 用户级线程 && 内核级线程
在上一部分中,我们了解到操作系统实现多进程图像需要组织.切换.考虑进程之间的影响,组织就是用PCB的队列实现,用到了一些简单的数据结构知识.而本部分重点就是进程之间的切换. 参考资料: 课程:哈工大操 ...
- 《SQL必知必会》学习笔记二)
<SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语 ...
- 操作系统学习笔记----进程/线程模型----Coursera课程笔记
操作系统学习笔记----进程/线程模型----Coursera课程笔记 进程/线程模型 0. 概述 0.1 进程模型 多道程序设计 进程的概念.进程控制块 进程状态及转换.进程队列 进程控制----进 ...
- NumPy学习笔记 二
NumPy学习笔记 二 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.<数学分 ...
- Django学习笔记二
Django学习笔记二 模型类,字段,选项,查询,关联,聚合函数,管理器, 一 字段属性和选项 1.1 模型类属性命名限制 1)不能是python的保留关键字. 2)不允许使用连续的下划线,这是由dj ...
- kvm虚拟化学习笔记(二)之linux kvm虚拟机安装
KVM虚拟化学习笔记系列文章列表----------------------------------------kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51 ...
随机推荐
- Azure SQL 数据库仓库Data Warehouse (4) 2018 TechSummit 动手实验营
<Windows Azure Platform 系列文章目录> 上传一下之前在2018 TechSummit的动手实验营:Azure数据仓库PaaS项目架构规划与实战入门 包含PPT和Wo ...
- 自己动手开发智能聊天机器人完全指南(附python完整源码)
一.前言 人工智能时代,开发一款自己的智能问答机器人,一方面提升自己的AI能力,另一方面作为转型AI的实战练习.在此把学习过程记录下来,算是自己的笔记. 二.正文 2.1 下载pyaiml 下载pya ...
- 使用docker查看jvm状态,在docker中使用jmap,jstat
Docker中查看JVM的信息: 1. 列出docker容器:docker ps 2. 标准输入和关联终端:docker exec -it 容器ID bash 3. 查找出j ...
- python开发购物车
1 业务需求 商品中心 显示库存的商品 商品能够加入到购物车 个人中心 购物车 修改购物车的商品 下单 完成的订单 订单详情 账户余额 2 代码实现 # 定义全局变量信息 # 商品编号信息 goods ...
- kafka集群的错误处理--kafka一个节点挂了,导致消费失败
今天由于kafka集群搭建时的配置不当,由于一台主消费者挂掉(服务器崩了,需要维修),导致了所有新版消费者(新版的offset存储在kafka)都无法拉取消息. 由于是线上问题,所以是绝对不能影响用户 ...
- css 实现多行文本末尾显示省略号
思路: 省略号使用绝对定位添加,开头部分避免突兀使用c3渐变背景颜色 <!DOCTYPE html> <html lang="en"> <head&g ...
- 20145319 《网络渗透》MS08_067安全漏洞
20145319 <网络渗透>MS08_067安全漏洞 一 实验内容 了解掌握metasploit平台的一些基本操作,能学会利用已知信息完成简单的渗透操作 了解漏洞MS08_067的相关知 ...
- ActiveMQ(2)---ActiveMQ原理分析之消息发送
持久化消息和非持久化消息的发送策略 消息同步发送和异步发送 ActiveMQ支持同步.异步两种发送模式将消息发送到broker上.同步发送过程中,发送者发送一条消息会阻塞直到broker反馈一个确认消 ...
- ABAP-IDOC配置
转载路径: http://www.cnblogs.com/jiangzhengjun/p/4292135.html#_Toc411677431 https://wenku.baidu.com/view ...
- Zabbix Agent 源码编译安装
简介: 单独整理一下 Zabbix Agent . 1.安装包选择 下载地址:http://www.zabbix.com/download.php 这里有两种源码包,一种是安装 Zabbix Serv ...