码迷,mamicode.com
首页 > 其他好文 > 详细

4.1系统寄存器和系统指令

时间:2019-10-19 13:29:53      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:编译   完全   限制   原来   因此   允许   两种   段地址   必须   

4.1系统寄存器和系统指令

标志寄存器

内存管理寄存器

GDTR、LDTR、IDRL、TR

用于指定分段内存管理所使用的系统表的基地址。

控制寄存器

CR0

控制处理器操作模式和状态的系统控制标志

CR1

保留不用

CR2

含有导致页错误的线性地址

CR3

含有页目录物理内存基地址,也被称为页目录基地址寄存器PDBR

系统指令

4.2保护模式内存管理

1.80X86对内存中存储数据的寻址方式一般是:段基地址+段内偏移

段基地址:被存放在段寄存器(16位)中的端选择符指定

段内偏移

2.物理内存就是地址总线宽度决定的那个可以寻址的范围

3.分段

4.逻辑地址,线性地址,物理地址,地址空间

逻辑地址:很简单,就是你源程序里使用的地址,或者源代码经过编译以后编译器将一些标号,变量转换成的地址,或者相对于当前段的偏移地址。

线性地址:这个地址很重要,也很不容易理解。分段机制下CPU寻址是二维的地址即,段地址:偏移地址,CPU不可能认识二维地址,因此需要转化成一维地址即,段地址*16+偏移地址,这样得到的地址便是线性地址(在未开启分页机制的情况下也是物理地址)。这样有什么意义呢?或者说这个一维地址的计算方法随便一个学计算机的人都知道,但是你真的理解它的意思吗?要想理解它的意思,必须要知道什么是地址空间,下文详述。

物理地址:很简单,将内存条看出一个大的数组,下标从0开始到0xFFFFFFFF,其中任意一个下标标记一个内存条上的一个字节的存储空间,物理地址的大小由地址总线的位宽决定

虚拟地址:虚拟地址就是逻辑地址,又叫虚地址

地址空间:这个很重要,不理解地址空间,你就不理解进程,不理解用户空间,不理解内核空间,不理解虚拟存储,不理解分页机制,你就没学过计算机。操作系统为了支持多任务,保护各个任务合理的共享和隔离一些数据和代码,还为了其他很多原因,必须要让每个任务都有自己的地址空间,就是说你在给编写每个程序代码的时候可以随意读写地址空间内的数据,而不用担心会不会读写到其他程序的代码块中去了。32位OS中,每个程序都有4G的内存空间,就是说A程序可以往0X12345中写一个值,B程序也可以往0X12345中写一个值,两个值虽然表面上写到一个地方去了,但是你根本不用担心,它们根本没有写到一个地方去了,它们都是写在自己的用户空间中,经过几次地址映射就映射到不同的物理地址上去了。4G内存空间的地址就是线性地址,也就是说线性地址就是用来标识这个4G的虚拟的用户空间的。

用户空间:每个程序都有4G内存空间,但是分为两个部分,0-3G是用户空间,3-4G是内核空间。

保护

80X86提供两类保护

  1. 任务间的保护
  2. 特权级保护

6.任务间的保护

把每个任务放在不同的虚拟地址空间中,也就是同一个逻辑地址,被映射到不同的物理块上,实现隔离。具体的实现方法是,每个任务有自己的段表和页表,这样映射的函数就不同了。也因此,处理器切换任务时,关键的一步就是切换到新任务的变换表。

问:变换表存储在哪里?怎么切换的呢?

  • 既然每个任务的地址空间不同,那么操作系统如何实现被不同任务共享呢?

只需为每个任务划分相同的一块虚拟地址空间,并且将这块虚拟地址空间映射到同一物理地址空间,在其中存储内核,就行啦。这个所有任务都具有的相同虚拟地址空间部分被称为全局地址空间

其他每个任务独有到的虚拟地址空间部分被称为局部地址空间。存放私有代码和数据,这样OS可以给每个任务相同的虚拟地址,但实际上映射到不同物理地址,隔离了任务。

7.特权级保护

当前活动代码段的特权级CPL:指明当前所执行程序的特权级

  • CPL存储在哪?

CPL保存在CS中的最低两位,是针对CS而言的。当选择子成功装入CS寄存器后,相应的选择子中的RPL就变成了CPL。因为它的位置变了,已经被装入到CS寄存器中了,所表达的意思也发生了变——原来的要求等级已经得到了满足,就是当前自己的等级。

选择子可以有许多个,因此RPL也就有许多个。而CPL就不同了,正在执行的代码在某一时刻就只有这个值唯一的代表程序的CPL.

任务切换时,虚拟地址空间会切换(不同的段),特权级会改变,堆栈会切换。

8.分段机制

作用:小到保护程序的平坦模型,大到可用分段机制创建一个可同时可靠地运行多个程序(或任务)的环境的多段模型。

  • 平坦模型:80X86提供4GB的线性空间和4GB物理地址空间,都是从0到0xFFFFFFFF。

多段模型:每个程序(任务)有自己的段描述符表和自己的段。对所有段的访问或对系统上运行程序各自执行环境的访问,都由硬件控制。(非法访问则CPU产生异常)

非法包括:引用了高特权级的段(非法访问操作系统程序)、对段内数据执行了不允许的操作(写只读段)、引用了段长限制之外的位置

每个段由三个参数定义:段基地址、段限长、段属性

  • 段基地址:线性地址空间中段的开始地址。是线性地址,段中0偏移处。
  • 段限长:段的最大偏移
  • 段属性

段的线性地址空间即段基地址~段基地址+段限长

多个段映射到的线性地址空间可以重叠,比如一个任务的代码段和数据段映射到线性地址完全相同而重叠的区域上

技术图片

以上三个参数存储在段描述符。段描述符存储在段描述符表中。定位段描述符通过段选择符和段描述符表的基地址。

逻辑地址转换为线性地址的过程:

  1. 段选择符 定位 段描述符
  2. 利用段描述符,检查访问权限和范围
  3. 段选择符中取出段基地址,加上偏移量获得线性地址

线性地址空间中含有为系统定义的所有段和系统表

段描述符表

存放段描述符的可变数组,最多包含8192个8字节描述符

分为两种GDT、LDT

4.1系统寄存器和系统指令

标签:编译   完全   限制   原来   因此   允许   两种   段地址   必须   

原文地址:https://www.cnblogs.com/Ivan-Luo/p/11703423.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!