文档章节

实模式和保护模式的段式存储

陈洪波
 陈洪波
发布于 2015/05/19 19:33
字数 1062
阅读 14
收藏 0

intel 8086是16位的CPU,有着16位的寄存器,16位的数据总线和20位的地址总线。但由于其寄存器和数据总线都是16位,仅仅具有64kb的寻址能力,所以采用段+偏移的方式得到20位的即1M的寻址能力。则其计算公式为:
物理地址 = 段值 * 16 + 偏移。
也就是段值左移一位 + 偏移。 —其中,段值和偏移都是16位的

但80386开始,CPU进入32位时代,其具有32位地址线,所以寻址能力变为4G。寻址空间虽然变大了,但是依然采用“段:偏移”的形式,但是具体的策略却发生了变化。
在实模式下,段值还可以看成是地址的一部分,段值仅仅就是左移一位,然后加上偏移地址就是实际的物理地址;但是在保护模式下,段值仅仅变成了一个索引,该索引指向一个数据结构的一个表项,表项记录着段的基址,段界限,以及属性等内容,该数据结构就是GDT。GDT中的一个表项就是段描述符(Descriptor)。
下面是段描述符的一个结构图:
这里写图片描述

属性的详细了解:
(1):P:存在位
P=1 表示描述符对地址转换是有效的,或者说该描述符所描述的段存在,即在内存中
P=0 表示描述符对地址转换无效,即该段不存在,使用该描述符进行内存访问时会引起异常

(2):DPL: 描述符特权级(Descriptor privilege level).共2位。规定了描述段的特权级,用于特权检查,以决定对该段能否访问。

(3):S: 描述符的类型
对于存储段描述符,S=1系统段描述符和门描述符,S=0
(4):TYPE: 说明存储段描述符所描述的存储段的具体属性

(5):G: 段界限粒度位(Granularity)
G=0: 表示段界限粒度位字节
G=1: 表示段界限粒度为4k字节
注意:界限粒度位只对段界限有效,对段基址是无效的,段基址总是以字节为单位。

(6): D位
D位是一个很特殊的位,在描述可执行段、向下扩展数据段或由SS寄存器寻址的段(通常是堆栈段)的三种描述符中的意义各不相同。
⑴ 在描述可执行段的描述符中,D位决定了指令使用的地址及操作数所默认的大小。
① D=1表示默认情况下指令使用32位地址及32位或8位操作数,这样的代码段也称为32位代码段;
② D=0 表示默认情况下,使用16位地址及16位或8位操作数,这样的代码段也称为16位代码段,它与80286兼容。可以使用地址大小前缀和操作数大小前缀分别改变默认的地址或操作数的大小。
⑵ 在向下扩展数据段的描述符中,D位决定段的上部边界。
① D=1表示段的上部界限为4G;
② D=0表示段的上部界限为64K,这是为了与80286兼容。
⑶ 在描述由SS寄存器寻址的段描述符中,D位决定隐式的堆栈访问指令(如PUSH和POP指令)使用何种堆栈指针寄存器。
② D=1表示使用32位堆栈指针寄存器ESP;
② D=0表示使用16位堆栈指针寄存器SP,这与80286兼容。

(7):AVL:软件可利用位

下面学习一下段选择子,首先段选择子不是刚刚所说的那个索引,段选择子为16为,其中13位为描述符索引,一位TI位,两位RPL位。
这里写图片描述

TI:(table Indicator): 引用描述符表指示位
TI = 0 : 指示从全局描述符表GDT中读取描述符
TI =1:指示从局部描述符表LDT中读取描述符

RPL(requested Privilege level): 请求特权级,用于特权检查

现在使用一张图描述一下段存储机制的寻址过程。
这里写图片描述

本文转载自:http://blog.csdn.net/hongbochen1223/article/details/44960383

陈洪波
粉丝 2
博文 76
码字总数 1552
作品 0
济南
程序员
私信 提问
自制操作系统Antz day02——进入保护模式 (上)

0. 如果你不知道什么是保护模式   你可能不知道什么是保护模式,没有关系,在你知道之前让我们先来看一段代码,如果你没有接触过这些内容,可能会觉得一头雾水,不知所云,不要紧,我们可以...

奶BerBer
2018/07/26
0
0
Linux操作系统下关于引导和初始化的问题

系统引导和初始化概述 相关代码(引导扇区的程序及其辅助程序,以x86体系为例): \linux-2.4.22\arch\i386\boot\bootsect.S:Linux引导扇区的源代码;512字节 \linux-2.4.22\arch\i386\boot\setup...

zt371
2009/05/07
696
0
在loader程序中涉及到的CPU模式切换

在实模式下开启4GB的物理内存地址寻址(称之为Big Real Mode) 通过A20快速门(Fast Gate)修改0x90端口的数据, 对其进行置位(类似于打开一个开关), 开启 使用CLI汇编指令关闭外部中断 使用lgdt加...

megachen
2018/10/09
0
0
自制操作系统Antz day05——深入理解保护模式与进入方法

Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.html   在前几天的任务中,我们已经简单实现了MBR,直接操作显示器和硬盘操作来加载其他扇区的程序,我们这些任务都...

奶BerBer
2018/07/29
0
0
Linux insides笔记(三)

头不疼鼻子哗哗的 感冒了竟然,宿舍里众人皆感冒一周有余我自岿然不动的神话破灭 伤心 以下正文 程序终于运行到main.c。接着继续配置内核启动环境和参数。 首先把启动参数,就是之前bootloa...

yyliu
2015/08/30
116
0

没有更多内容

加载失败,请刷新页面

加载更多

gradle grovvy中的闭包

1. 无参数的闭包 //这b1就是一个闭包def b1={ println "hello b1"}//定义方法,包含闭包类型的参数def method1(Closure closure){closure()}//执行method1method1(b1) 执行结果 ...

edison_kwok
33分钟前
3
0
基于Spring Boot + Dubbo的全链路日志追踪(一)

一、 概要 当前公司后端整体架构为:Spring Boot + Dubbo。由于早期项目进度等原因,对日志这块没有统一的规范,基本上是每个项目自己管自己的日志。这也对后面的问题排查带来了很大的困难,...

明天以后
今天
7
0
安装fastdfs文件服务器步骤

1、安装libfastcommon wget https://github.com/happyfish100/libfastcommon/archive/master.zip 解压后安装 cd fastcommon-master ./make.sh ./make.sh install 2、安装 FastDFS,从sourcef......

lsjlgo
今天
3
0
MySQL 5.7 免安装版配置

下载地址:https://dev.mysql.com/downloads/mysql/ 安装步骤 1.下载zip解压到目录下 2.配置环境变量 新建系统变量:MYSQL_HOME,值:D:\DevelopmentTool\Mysql-5.7.26-winx64 修改path变量:...

华山猛男
今天
7
0
java map的遍历

//从大的角度可以分为两类Set<String> set=map.keySet();这里面还可以分为3类, 从set的角度来分 //Set<Map.Entry<String, String>> entery=map.entrySet(); public class Test { public sta......

南桥北木
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部