4.1系统寄存器和系统指令

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

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

时间: 2024-11-01 14:06:33

4.1系统寄存器和系统指令的相关文章

Linux系统文本编辑器vim指令大全

本文适合Vim新手,既可阅读入门 相关在线资料http://baike.baidu.com/subview/113188/9338173.htm?fr=aladdin vim的使用之汇总   vimtutor (在线学习) 功能最强在的编辑器--vim vi是所有UNIX系统都会提供的屏幕编辑器,它提供了一个视窗设备,通过它可以编辑文件.当然,对UNIX系统略有所知的人,或多或少都觉得vi超级难用,但vi是最基本的编辑器,所以希望读者能好好把它学起来,以后在UNIX世界里必将畅行无阻.游刃有余,

project02 U盘系统与排错系统

U盘系统与排错系统 制作U盘系统的两个主要目的: 1.以U盘为救援系统来修复有故障无法启动操作系统 修复步骤: 1)选尝试从单用户模式启动(内核和基本服务,可以参考/etc/rc.d/rc1.d/S..) 2)如果单用户模式也无法正常启动,可以考虑从光盘或者是U盘启一个linux操作系统,首选使用U盘 2.通过U盘系统的制作让你更了解一个主机上linux系统组成,以及启动流程 LINUX操作系统的组成: 内核 SHELL 应用程序 文件系统 内核 核心文件    vmlinuz 临时根文件  i

Android系统简介(中):系统架构

Android的系统架构栈分为4层,从上往下分别是Applications.Application framework.Libraries  & Android Runtime.Linux  Kernel.每层提供不同的Service功能以供上层调用. 一:Linux Kernel(Linux 内核): 位于Android系统架构栈的底部,整个Android系统基于该层,最新的Android Kitkat 4.4基于Linux Kernel 3.8构建的.它提供的硬件设备抽象接口,以供其他架构层

微商下单系统开发返利系统

微商下单系统开发返利系统(小古:182-0099-0522微.电),微商下单管理系统开发,微商代理管理系统开发下单系统 一.微商现状: 2016年除了互联网+以外,"微商"肯定还会继续火热,不光媒体报道.身边朋友,甚至越来越多的传统企业加入到微商的大军中.据报道,在中国有2000~3000万微商.但他们的日子也没有想象中来得"滋润",痛点明显.代理管理混乱,价格混乱,货物真假又难以甄别.但反观整个市场,真正可以实现规范化管理的除了借助系统来进行管理似乎别无他法! 二

在CentOS 6.7部署wordpress博客系统Discuz论坛系统

在CentOS 6.7部署wordpress博客系统Discuz论坛系统 服务器操作系统:CentOS6.7 博客部署服务器:Httpd-2.2 后台语言:PHP 数据库:MySql 前端框架:WordPress 1.首先安装需要的软件 yum -y install mysql-server httpd phpphp-mysql 2.启动mysql以及httpd服务 service mysqld start service httpd start 3.创建虚拟主机 4.测试 PHP 和Httpd

实例365(2)---------调用系统api修改系统时间

一:截图 二:代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; namespace SetDate { public partial cl

win8系统换win7系统

吐槽一下先,win8换win7好费事~第一次弄,不过总算弄好了,记录一下吧. 首先,最坑人的就是,win8没法像win7那样按F1或者别的,直接进入BIOS,也就没法设置U盘引导,据说是由于win8的快速启动导致的,反正我是尝试多次都不行.于是找到了另一种方法,先附上原文链接:http://jingyan.baidu.com/article/359911f57e0c1557ff03067a.html ------------------------------------------------

获取系统联系人&&添加系统联系人

联系人在这个包下 contacts2.db数据库 查询所有的联系人; 需要读写contact权限,注意Uri   content是小写的 找这个错误找了一个小时,汗-  -!! 这个程序只是添加个按钮. package com.example.getcontacts; import android.app.Activity; import android.content.ContentResolver; import android.database.Cursor; import android

联想小新:预装linux系统刷win7系统

以U盘安装为例: 1.在windows系统下制作win7的U盘启动盘(可用 UltraISO 制作). 2.将U盘插入联想小新的usb接口,开机,按Fn+F2进入BIOS. 3.Boot--Boot Prioriry--Legacy First : Fn+F10 保存退出 :Fn+F12进入U盘启动开始安装win7: 4.过程中会出现"windows无法安装到这个磁盘,选中的的磁盘采用GPT分区形式."的问题,解决方案: 按shift+Fn+F10打开diskpart命令符,然后依次输