0x01原因

分段的产生原属于安全问题。

一个程序可以自由的访问不属于它的内存位置,甚至可以对那些内容进行修改。这也导致安全问题 促使一种内存隔离的手段 分段的产生。

0x02分段原理

处理器要求在加载程序时,先定义该程序所拥有的段,然后允许使用这些段。定义段时需要基地址,段界限,特权级别,类型等。

在一个程序访问cs,ss,ds,es 这些段时。处理器将会实施检查,防止内存违规访问。

因此有了段描述符来描述这些段的内容和权限

0x03段描述符

认识段描述符先定义全局描述符表GDT,为了跟踪GDT 处理器有一个48位寄存器,也就是gdtr,分别是32位线性地址和16位边界地址

访问地址范围就是0x00000000到0xffffffff 4gb 的映射范围  界限地址 ffff  就是64kb  一个GDT大小是8个字节 所以GDT最最多可以定义8192个描述符

下面就是段描述符格式

下面是低位,上面是高位
段基地址:
0-15+16~23+24~31 FFFF FF FF
段界限
0-15+19+16 FFFF F
0xFFFF FFFF:0FFFF 就是GDT的物理地址
 
G粒度位
当为0时 段界限以字节为单位 范围(1b~1mb) 当为1时,段界限以4KB为界限 范围(4kb-4gb)
S描述符位:
当为0时 表示是个系统段,当为1时表示代码段或者数据段(栈段也是特殊的数据段)
DPL特权级位:
分别表示0,1,2,3 其中0是最高位。不同级别的程序相互隔离,严格限制互访。高可以访问低特权级
P段存在位:
p位表示描述符对应的段是否存在,当内存紧张时,可能只建立了描述符没有建立内存这时P位就是0 表示段并不存在,p是有处理器负责检查的 如果是0处理器会产生一个中断。这一过程由操作系统提供,负责将该段从硬盘换回内存。将p置为1,在多任务多用户的系统中,这是一种常用的虚拟内存调度策略
D/B操作数大小位或者栈指针大小位或者上部边界标志位
不同段表示不同意思
代码段表示 d=0 表示16位 d=1 表示32位 表示使用 eip还是ip
栈段表示 b=0表示使用sp b=1 表示使用 esp
b位也决定上部边界 b=0 就是 sp寄存器最大值 0xffff b=1 esp最大值 0xffff ffff
L64专用位
暂时不涉及 置0即可
TYPE 描述符子类型位
对于数据段来说
4位 X,E,W,A
代码段
4位 X,C,R,A
x表示可执行 数据段不可执行 默认为0
数据段的E表示段扩展方向 为0向上扩展 向高地址方向扩展。 为1向下扩展 向低地址扩展通常是栈段。
W=0表示不允许写入
C表示特权级依从 0表示非依从的代码段,可以从与它特权级相同的代码段调用,或者通过门调用
1表示 允许从低特权级的程序转移到该段执行。
R=0表示不能读出
A位已访问位 表示最近这个段是否被访问过 每当被访问会被置1 清理由操作系统负责 监视是否还在使用。知道使用频率,内存紧张时把不常用的段退避到硬盘上,从而实现虚拟内存管理
AVL位
软件位 用户使用没啥用
 
下面通过windbg调试查看gdt表

看到当前的gdtr 寄存器值 和当前 ds cs es值

ds 是23解析规则就是

2        3

0010 0011

00100=4

rpl 请求特权级  3就ring3 权限

tl 0=gdtr 寄存器里面  1=ldtr里面

ds=23 指的就是GDT表的第4位置

可以看到前5个除了第一个用于指向null的gdt 表 其他的4个把所有类型都包括了 这是因为 微软没用分段来隔离内存  因为gdt 大小只能8192个太少了 。

后面改用分页来隔离内存了,又犹豫cpu只认段描述符这种格式,所以就做了4个把所有类型都包括的描述符 来解决这个问题。

但是fs gs 用的还是分段

这里fs=3b

111011= 7

f892a000~00001fff

看内存拆分就是

01 00 00 a0  92 93 c0 f8

00 0a 92 f8-01

g位为1  所以  段界限要*4kb=4096

00 00 01*4kb+0xfff 就是最后的段界限

最后就是

f892a000~1fff

Windows内存管理-分段的更多相关文章

  1. Windows内存管理[转]

    本文主要内容:1.基本概念:物理内存.虚拟内存:物理地址.虚拟地址.逻辑地址:页目录,页表2.Windows内存管理3.CPU段式内存管理4.CPU页式内存管理 一.基本概念1. 两个内存概念物理内存 ...

  2. windows内存管理方式以及优缺点

    Windows内存管理方式:页式管理,段式管理,段页式管理 页式管理 将各进程的虚拟空间(逻辑地址)划分为若干个长度相等的页,业内管理把内存空间(物理内存)按照页的大小划分为片或者页面,从而实现了离散 ...

  3. windows 内存管理的几种方式及其优缺点

    windows 内存管理方式主要分为:页式管理,段式管理,段页式管理. 页式管理的基本原理是将各进程的虚拟空间划分为若干个长度相等的页:页式管理把内存空间按照页的大小划分成片或者页面,然后把页式虚拟地 ...

  4. Windows内存管理的方式

    一.内存的概念 1. 物理内存:即插在主板上的内存条.他是固定的,内存条的容量多大,物理内存就有多大(集成显卡系统除外). 但是如果程序运行很多或者程序本身很大的话,就会导致大量的物理内存占用,甚至导 ...

  5. 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件

    本文背景: 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用:根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制. 本 ...

  6. 20140919 进程间通信 系统栈 用户栈 多级反馈队列 windows 内存管理

    1.进程间通信 共享内存(剪切板) 匿名管道只能实现父子进程间的通信(以文件系统为基础): 匿名管道是什么,有什么用,怎么用 1.创建父进程,也就是在解决方案中建立一个parent的工程 2.在par ...

  7. 全面介绍Windows内存管理机制及C++内存分配实例

    转自:http://blog.csdn.net/yeming81/article/details/2046193 本文基本上是windows via c/c++上的内容,笔记做得不错.. 本文背景: ...

  8. Windows内存管理

    本博文很大程度上参考了,潘爱民先生的<Windows内核原理与实现>一书,在此对他表示感谢. 记得是在学C语言指针的时候,首次比较实际的使用内存寻址.也是在那个时候知道不能使用未初始化的指 ...

  9. Windows程序设计学习笔记(一)Windows内存管理初步

    学习Windows程序设计也有一些时间了,为了记录自己的学习成果,以便以后查看,我希望自己能够坚持写下一系列的学习心得,对自己学习的内容进行总结,同时与大家交流.因为刚学习所以可能有的地方写不不正确, ...

随机推荐

  1. 『与善仁』Appium基础 — 9、补充:C/S架构和B/S架构说明

    目录 1.C/S架构和B/S架构概念 2.C/S结构与B/S架构的区别 3.C/S架构和B/S架构优点和缺点 (1)B/S模式的优点和缺点: (2)C/S模式的优点和缺点: 1.C/S架构和B/S架构 ...

  2. 站长管理服务器必读:Ftp、Ftps与Sftp三兄弟的不同与区别以及部署全指引

    文章标题: 站长管理服务器必读:Ftp.Ftps与Sftp三兄弟的不同与区别以及部署全指引 关键字 : ftp,sftp,freesshd,ftps 文章分类: 教程 创建时间: 2020年3月23日 ...

  3. Python多版本共存的方法

    目录 Python2.Python3共存的方法 python2下载及环境变量配置 第一步.打开Python官网,下载Python2 第二步.python2环境变量配置 测试结果 Python2.Pyt ...

  4. 『学了就忘』Linux软件包管理 — 46、yum命令详细介绍

    目录 1.yum命令的查询操作 2.使用yum命令安装服务 3.使用yum命令升级服务 4.使用yum命令卸载服务 5.yum组管理命令 (1)查询可以安装的软件组 (2)查询软件组内包含的软件 (3 ...

  5. 仿Word的支持横轴竖轴的WPF 标尺

    最近在  https://mp.weixin.qq.com/s/3dEO0NZQv5YLqK72atG4Wg   官方公众号看到了 用WPF 制作 标尺 在去年项目上也接到了一个需求,用于排版自定义拖 ...

  6. k8s-控制器deployment弹性扩容,更新镜像,回滚,DaemonSet,StatufluSet

    目录 1.控制器deployment,DaemonSet,StatufluSet 2.控制器-deployment 弹性扩容 方式1-修改配置清单 方式2-打标签 方式3-scale 更新镜像 方式1 ...

  7. 【Tool】JDK8 安装

    JDK8 2019-07-26  14:05:21  by冲冲 1. 下载 通常前往官网 https://www.oracle.com/technetwork/java/javase/download ...

  8. [Cnoi2020]线性生物

    期望入门题.但是我不会做. 考虑设\(E_{x\to{x+1}}\)为\(x\)到\(x+1\)点的期望步数. 则\(ans = \sum_{i = 0}^{n} E_{x\to{x+1}}\) 知\ ...

  9. CentOS6.9 内核升级详解

    内核进行的是应用软件和计算机硬件的交互工作在计算机科学中,内核(英语:kernel)又称核心,是一个计算机程序,用来管理软件发出的数据I/O(输入与输出)要求,将这些要求转译为数据处理的指令,交由中央 ...

  10. shell编程100列

    1.编写hello world脚本 #!/bin/bash# 编写hello world脚本 echo "Hello World!"2.通过位置变量创建 Linux 系统账户及密码 ...