80x86的内存寻址机制

80386处理器的工作模式

模式。

模式之间可以相互转换,而模式之间不可以相互转换

DOS系统运行于实模式下,Windows系统运行与保护模式下。

实模式

80386处理器被复位加电的时候以实模式启动。

一样的,(段寄存器内容-段地址)SA(16bit)*16+EA(16bit)(偏移地址),其中32位的地址线只是用了低20位(16+4=20)寻址空间为2^20B = 1MB

不能对内存进行分页管理,指令寻址的地址就是内存中的实际的物理地址,所以在实模式下,所有的段都是可读可写可执行的。

的中断方式和8086相同,利用中断向量表定位中断服务程序的地址,其中个字节,其中2个字节为SA,2个字节为EA。

位)为1 转换成保护模式。

保护模式

位地址线全部使用到,寻址空间高达4GB

个优先级,分别是ring0~ring3。

位)为 0 转换成保护模式。

模式

程序而设置的。例如:CMD命令运行的“MS-DOS应用程序”在Windows操作系统中运行。

模式是的寻址方式,寻址空间为1M

80386的内存寻址机制

一样。

重点在保护模式下:

段描述表(Segment Table):分为全局描述表(GDT Global ...) 和 局部描述表 (LDT local ...),其中段描述表里存放 段描述符

段描述符(Segment Descriptor):优先级,是否可读写可执行,等描述段的参数,共64位

段选择器(Segment Selector):16位段寄存器,存放段选择器,存放段描述表的“索引”。

GDT:GDT全局描述表只有一个,包含系统中所有任务都可用的段描述符,包含操作系统中代码段数据段堆栈段以及各个任务的LDT段等,由GDTR指向。

LDT每个任务都有各一个独立的LDT,包含每个任务私有代码段数据段堆栈段 以及 该任务所使用的一些门描述符,例如任务门调用门描述符等,由LDTR指向。

GDTR 直接指向内存地址, LDTR、CS、DS、SS、ES、FS 和GS 存放索引值,指向局部描述表中内存段对应的描述符全局描述表中的位置,则只要该表LDTR,系统当前的LDT就会切换,方便了各个任务切换和任务之间数据的隔离,GDT不会随着任务的切换而切换。

具体的寻址过程

位,1位]位TI位表示在DT中的位置,TI=0 在 GDT中TI=1 在 LDT中

虚拟地址为:SA(16bit):EA(32bit) 的计算

(段寄存器内容-段地址)SA(16bit)*16+EA(32bit)(偏移地址)注意偏移为32bit

分两种情况:

一、TI = 0

① 从GDTR寄存器中获取GDT的基址

位),找到SD(段描述符)

③ SD 中包含了段的基址、限制长、优先级等各种属性,得到段的起始地址

④ 在③中得到的起始地址加上偏移,得到物理地址

二、TI = 1

① 从GDTR寄存器中获取GDT的基址

 从LDTR寄存器中获取LDT描述符 在 GDT中的索引

 根据②中得到的索引,找到 LDT的描述符

 通过LDT的段描述符,得到LDT段的起始地址

位),找到SD(段描述符)

⑥ SD 中包含了段的基址、限制长、优先级等各种属性,得到段的起始地址

⑦ 在⑥中得到的起始地址加上偏移,得到物理地址

补充知识:

控制寄存器是一些特殊的寄存器,它们可以控制CPU的一些重要特性。

CR0:

,则保护模式启动,如果PE=0,则在实模式下运行。

31位是分页允许位(Paging Enable),它表示芯片上的分页部件是否允许工作。

就可以禁用则可将其恢复。(NT5.x系列,SSDT hook的一种改写SSDT的方法)

80x86的内存寻址机制的更多相关文章

  1. Linux内存寻址之分段机制

    前言 最近在学习Linux内核,读到<深入理解Linux内核>的内存寻址一章.原本以为自己对分段分页机制已经理解了,结果发现其实是一知半解.于是,查找了很多资料,最终理顺了内存寻址的知识. ...

  2. Linux内存寻址之分段机制及分页机制【转】

    前言 本文涉及的硬件平台是X86,如果是其他平台的话,如ARM,是会使用到MMU,但是没有使用到分段机制: 最近在学习Linux内核,读到<深入理解Linux内核>的内存寻址一章.原本以为 ...

  3. Linux内存寻址之分页机制

    在上一篇文章Linux内存寻址之分段机制中,我们了解逻辑地址通过分段机制转换为线性地址的过程.下面,我们就来看看更加重要和复杂的分页机制. 分页机制在段机制之后进行,以完成线性—物理地址的转换过程.段 ...

  4. Linux内核源码分析 day01——内存寻址

    前言 Linux内核源码分析 Antz系统编写已经开始了内核部分了,在编写时同时也参考学习一点Linux内核知识. 自制Antz操作系统 一个自制的操作系统,Antz .半图形化半命令式系统,同时嵌入 ...

  5. linux与C内存管理机制

    转自知乎专栏:https://zhuanlan.zhihu.com/p/51855842?utm_source=wechat_session&utm_medium=social&utm ...

  6. 【读书笔记::深入理解linux内核】内存寻址【转】

    转自:http://www.cnblogs.com/likeyiyy/p/3837272.html 我对linux高端内存的错误理解都是从这篇文章得来的,这篇文章里讲的 物理地址 = 逻辑地址 – 0 ...

  7. 【读书笔记::深入理解linux内核】内存寻址

    我对linux高端内存的错误理解都是从这篇文章得来的,这篇文章里讲的 物理地址 = 逻辑地址 – 0xC0000000:这是内核地址空间的地址转换关系. 这句话瞬间让我惊呆了,根据我的CPU的知识,开 ...

  8. Hbase读写流程和寻址机制

    写操作流程 (1) Client通过Zookeeper的调度,向RegionServer发出写数据请求,在Region中写数据. (2) 数据被写入Region的MemStore,直到MemStore ...

  9. 2.1 自动内存管理机制--Java内存区域与内存溢出异常

    自动内存管理机制 第二章.Java内存区域与内存溢出异常 [虚拟机中内存如何划分,以及哪部分区域.什么样代码和操作会导致内存溢出.各区域内存溢出的原因] 一.运行时数据区域 Java虚拟机所管理的内存 ...

随机推荐

  1. MySQ数据表设计

    数据表概念 数据表是数据库中的基本对象元素,以记录(行)和字段(列)组成的二维结构用于存储数据.数据表由表结构和表内容两部分组成,先建立表结构,然后才能输入数据.数据表结构设计主要包括字段名称.字段类 ...

  2. Oracle 锁的等级

    ORACLE里锁有以下几种模式: 0:none 1:null 空 2:Row-S 行共享(RS):共享表锁,sub share 3:Row-X 行独占(RX):用于行的修改,sub exclusive ...

  3. 利用Python进行自然语言处理(笔记)第一章

    一.标识符 一个我们想要放在一组对待的字符序列--如:”hairy“.”his“或者”:“: 二.词类型 一个词在一个文本中独一无二的出现形式或拼写,也就是说这个词在词汇表中是唯一的.如果我们计数的项 ...

  4. Jenkins send build artifacts over ssh配置

    配置jenkins远程部署的时候遇到的配置问题: 首先在系统设置-系统设置-Publish over SSH-SSH Server中配置服务器信息 配置完成后可以点击Test Configuratio ...

  5. Centos7限速和测速

    限速 wondershaper是国外人开发的一款在Linux内核下基于TC工具的对整块网卡的限度工具. 第一种安装方法 首先下载wondershaper的rpm安装包:wondershaper-1.1 ...

  6. windows端口占用情况

    https://jingyan.baidu.com/article/3c48dd34491d47e10be358b8.html netstat -ano,列出所有端口的情况. netstat -aon ...

  7. Java 基础 面向对象之关键字内部类代码块修饰符

    final final概念 继承的出现提高了代码的复用性,并方便开发.但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写.可是当子类继承了这些特殊类之后 ...

  8. dialog问题记录

    这个怎么回事,怎么会负利润 http://mmbiz.qpic.cn/mmbiz_jpg/sd9PceC1NdAEVpR5pKerugkpEPEUIsBVoaz5ibTiaHtxoickmF2bXqF ...

  9. 定位crash的问题

    一般都要符号化crash日志,但是低内存奔溃却没有堆栈日志 A Low Memory report differs from other crash reports in that there are ...

  10. ubuntu 的远程命令行,老是不能支持联想

    首先发现没有source命令,非常奇怪,google发现是dash命令的问题. $ls -l `which sh` /bin/sh -> dash $sudo dpkg-reconfigure ...