内核知识第八讲,PDE,PTE,页目录表,页表的内存管理

一丶查看GDT表.

我们通过WinDbg + 虚拟机可以进行双机调试.调试一下看下GDT表

我们知道,GDT表中.存储的是存储段信息. 保存了一系列的段和内存的属性.

但是微软并没有使用.

我们可以通过ring3的段寄存器. 当作GDT表的下标.进行查表. 查询GDT表.

例如我们用OD随便打开一个ring3的exe,然后看下段和虚拟地址.:

虚拟地址: 0040256f  段选择子: cs:1B

那么此时段选择字当下表.虚拟地址当作偏移.去查询GDT表

下图为选择子结构

段选择子结构:

首先先拆分选择子.

1B =   0000000000011 011

查询出来下表为3,那么去GDT表的第三项进行查找.

然后我们从中取出段首地址 加上我们的偏移

00000000  + 40256F = 0040256F(线性地址)

那么通过查询GDT表.那么可以找到线性地址. 而我们GDT表,微软没有使用它来进行进程隔离.

PS: 微软因为不使用GDT表进行进程隔离,所以段选择子都是一样的.基地址都是0,我们的虚拟地址就是线性地址.

如果没有开分页保护.那么就是物理地址了.但是注意FS寄存器. FS寄存器很特殊.并不能说GDT表没用.

二丶控制寄存器CR0

我们上面说过.如果没有开启分页保护.那么虚拟地址就是线性地址,线性地址就是物理地址

而微软是通过分页进行进程内存的隔离的.

首先说一下什么分页的历史,和CR0控制寄存器.

在保护模式下, 寄存器CR0的高位1表示开启分页.0表示不开启.

而这个在操作系统初始化的是否就已经完成了.

如果我们不开启,那么访问虚拟内存,就等价于访问物理内存了.

但是我们的三环是不可以操作的.这个属于特权指令.如果用汇编进行操作.例如:

__asm mov cr0,

程序会崩溃,提示你权限不够,并且报告错误码为 C096

但是我们0环可以进行操作的.

看一下CR0的结构:

但是我们0环可以进行操作的.

此图是从inter手册上截图下来的.有兴趣的可以查询CR0查看.

刚才我们说的高位为1的是否就去掉分页保护,此时访问虚拟内存 等价于访问物理内存,其实我们修改的是PG位

关于位怎么说的,inter手册也说.这里我总结一下重要的,如果不相信我可以查看inter手册.

PG:  PG位表示是否分页管理机制是否有效. PG = 1,有效, PG = 0 无效.

WP: Wp位 写保护位, WP为0禁用写保护,为1则启动

PS: 通过修改WP位可以进行过保护. 详情请看https://www.cnblogs.com/hongfei/archive/2013/06/18/3142162.html 转载

三丶分页管理机制

讲解分页管理机制之前,我们要明白以下几个关键词的意思.

页码:

  在80386下,一个页的固定大小是4K个字节,也就是4096,一个页的辩解地址,不许死4K的倍数.

所以4G大小的内存.就可以划分为1M个节. 而我们的页的开始一般具有一个特点.

比如我们的虚拟地址:

  004010123,而页的首地址是00401000

后12位都是0.

所以我们把页的高20位称为页码.

进程内存的保护.

进程内存的保护就通过页的方式进行保护的.

当我们的线性地址转化为物理地址的是否,会进行查表. 进而查询到物理地址是那个.

微软采用的是这种方式.

线性地址转物理地址需要注意的页问题.

这个问题则是页的映射.

我们知道,页码是高20位,那么低12为就是偏移了.

当32位的线性地址转为32为的物理地址的是否,只需要记录页码就可以了.低12位都是一样的.所以不用记录.

比如线性地址:

  004010123 映射到物理地址 002010123

那么我只需要记录前20位即可.

  004010  -> 002010   ,然后物理地址加上我们的后12位即可. 002010+123 = 002010123

四丶线性地址到物理地址的转换.

我们说过,操作系统为了隔离内存.采用了分页管理.而我们线性地址转化到物理地址的时候.

则需要查表.

那么我们觉着这个表应该怎么做?

物理地址

Xxxx

内存保护属性

类似于这样,我们只需要让虚拟地址当标进行查表即可.

我们每一个进程都提供这样的一张表.但是在那个时代.资源是匮乏的.我们这样做.开不了几个进程内存就会耗光了.

所以微软提供了自己的表.而硬件上也提供了支持.

我们看下微软的表.

首先我们的CR3寄存器保存了表的首地址.

这里有一个页目录表,还有页表的关键词.

页目录表: 也称为PDE,而页表称之为PTE.

CPU会通过虚拟地址,当作下表.去页目录表中查询.然后查到的结果再去页表中查询.这样就查到对应的物理地址了.

PDE表的大小:

  页目录表,存储在一个4K字节的物理页中,其中每一项是4个字节.保存了页表的地址.

  而最大是1M个页.

PTE表的大小.

  PTE的大小也和PDE一样的.

微软为什么这样设计.有人会问.这样设计不就资源用的更多了吗.其实不是的. 虽然我们设计怎么大.

但是通过两个表查询.可以映射4G内存.而上面的设计方法不行.

首先前边20位保存了页表或者物理地址的基地址.

比如我们的页目录表. 查到了第5项.那么从中取出千20位来,加上000就等于页表了.

然后从页表中查询千20位.+虚拟地址的偏移就等价于实际的物理地址了.

AVL 位: 可利用位.

D    位: 表示这个分页是否写过.

A   位: 表示这个分页是否读过

U/S位: 表示这个分页是否用户可以访问还是ring0可以访问.

R/W位: 内存保护位. 可读可写可执行. 还是可读可执行.

P   位:   内存是否有效.

R/W位: 注意我这里说的有两种方式. 可读可执行,和可读可写可执行.  有没有发现,我们的Ring3程序.不过是那个内存区域也好.都是可以读的.

而我们Ring3下的修改内存分页保护属性,其实就是将这个页表的这个RW位进行置位.

而我们的虚拟地址当作下表进行查表. 我们的虚拟地址不是分为了20位了吗. 前10位当作 页目录表的下表. 后10位当作页表的下表

设有物理地址为:

  00401 000

那么下表则为:

  00401 = 0000000001 0000000001

通过虚拟地址得知,页目录表是第一项,而页表也是第一项.

设页目录表第一项为

    003f0111,  此时页表为 取前20位,加上3个0.  003f0 + 000 = 003f0000

设页表为
        00201456, 此时取出前20位加上虚拟地址的后边20位偏移 物理地址= 00201 + 000 = 00201000,那么物理地址就是201000

图示:

  

设虚拟地址为00402567H, 取出前20位. 分为高10位,和低10位做 PDE,和PTE的索引.

然后进行查表.

最后的通过PTE查询的高20位加上原虚拟地址的低12位, 然后就找到了物理地址.

内核知识第八讲,PDE,PTE,页目录表,页表的内存管理的更多相关文章

  1. 逆向知识第八讲,if语句在汇编中表达的方式

    逆向知识第八讲,if语句在汇编中表达的方式 一丶if else的最简单情况还原(无分支情况) 高级代码: #include "stdafx.h" int main(int argc ...

  2. 内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式.

    内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式. 一丶IDT解析. 我们知道.IDT表中存放着各种中断信息.比如当我们调用int 3的时候,则会调用IDT表中的第三项来进行调用. 而函数 ...

  3. Linux基础知识第八讲,系统相关操作命令

    目录 Linux基础知识第八讲,系统相关操作命令 一丶简介命令 2.磁盘信息查看. 3.系统进程 Linux基础知识第八讲,系统相关操作命令 一丶简介命令 时间和日期 date cal 磁盘和目录空间 ...

  4. 内核知识第六讲,内核编写规范,以及获取GDT表

    内核知识第六讲,内核编写规范,以及获取GDT表 一丶内核驱动编写规范 我们都知道,在ring3下,如果我们的程序出错了.那么就崩溃了.但是在ring0下,只要我们的程序崩溃了.那么直接就蓝屏了. 那么 ...

  5. Linux从头学15:【页目录和页表】-理论 + 实例 + 图文的最完全、最接地气详解

    作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). ...

  6. Linux内核设计与实现 总结笔记(第十二章)内存管理

    内核里的内存分配不像其他地方分配内存那么容易,内核的内存分配不能简单便捷的使用,分配机制也不能太复杂. 一.页 内核把页作为内存管理的基本单位,尽管处理器最小寻址坑是是字或者字节.但是内存管理单元MM ...

  7. [转载]linux段页式内存管理技术

    原始博客地址: http://blog.csdn.net/qq_26626709/article/details/52742470 一.概述 1.虚拟地址空间 内存是通过指针寻址的,因而CPU的字长决 ...

  8. Linux内核入门到放弃-页面回收和页交换-《深入Linux内核架构》笔记

    概述 可换出页 只有少量几种页可以换出到交换区,对其他页来说,换出到块设备上与之对应的后备存储器即可,如下所述. 类别为 MAP_ANONYMOUS 的页,没有关联到文件,例如,这可能是进程的栈或是使 ...

  9. [3]windows内核情景分析--内存管理

    32位系统中有4GB的虚拟地址空间 每个进程有一个地址空间,共4GB,(具体分为低2GB的用户地址空间+高2GB的内核地址空间) 各个进程的用户地址空间不同,属于各进程专有,内核地址空间部分则几乎完全 ...

随机推荐

  1. IntelliJ IDEA 热部署插件 JRebel 安装激活及使用

    JRebel对个人用户免费使用,但是要使用Facebook账号把信息完整填写之后才能获取Lisense,登陆Facebook官网二种方案:①修改本地hosts文件:②使用VPNFQ 以下是二种方案的解 ...

  2. 工作随笔——自动重发的凶手--feign

    公司使用的feign(https://github.com/OpenFeign/feign)作为http客户端. 开发时debug后端程序,发现同一个请求会多次收到. 为了判断是谁在搞鬼,在客户端和服 ...

  3. 教程:安装禅道zentao项目管理软件github上的开发版

    该文章转自:吕滔博客 直接从github拉下来的禅道的源码,是跑不起来的.除非你按我的教程来做...哈哈哈(不要脸)~~~~ 禅道官网提供的版本包是带了有安装文件,并有打包合成一些css.js文件的. ...

  4. 小白的Python之路 day4 装饰器前奏

    装饰器前奏: 一.定义: 1.装饰器本质是函数,语法都是用def去定义的 (函数的目的:他需要完成特定的功能) 2.装饰器的功能:就是装饰其他函数(就是为其他函数添加附加功能) 二.原则: 1. 不能 ...

  5. SPCircleView的使用(圆心向四周扩散动画)

    今天封装了一个动画,想着以后可能会用,就封装了一下.欢迎下载 https://github.com/USimpleLife/SPCircleView 参数说明 @param centerPoint 中 ...

  6. VM虚拟机连Linux黑屏问题

    在尝试了关闭VM的加速3D图形后,若仍黑屏(但是挂起时却能显示),可以尝试在以管理员身份cmd中输入netsh winsock reset,重启后可以恢复正常.这个问题似乎与网络某个端口有关,我上次打 ...

  7. vmstat 命令详解

    作用:vmstat 的含义为显示虚拟内存状态(virtual memor statics),但是它可以报告关于进程,内存,I/O 等系统整体运行状态 选项: -a 显示活动内页 -f 显示启动后创建的 ...

  8. Linux第七节随笔 diff /uniq /stat

    linux第七讲(上)1.diff link 作用:diff命令能比较单个文件或者目录内容.如果指定比较的是文件,则只有当输入为文本文件时才有效.以逐行的方式,比较文本文件的异同处. 如果指定比较的是 ...

  9. 5.前端基于react,后端基于.net core2.0的开发之路(5) 配置node层,session设置、获取,请求拦截

    1.总结一下 今年,2月份从深圳来到广州,工作到现在,回头看,完成的项目4-5个,公司基本没有懂技术的领导,所以在技术选型上,我们非常的自由,所以内心一直都不满足现状,加上一起工作的小伙伴给力(哈哈哈 ...

  10. c语言中的转义序列

    c中的输出函数printf()可以带以下的转义序列,不同的转义序列会得到不同的结果. 1.\a:警报 2.\b:退格(光标回退一格)3.\f:换页4.\n:换行(光标去到下一行的起始处)5.\r:回车 ...