整理的不好,凑合着看吧

目录

1.内存及寻址
2.地址变换
3.分段机制
4.分页机制
5.保护
6.去到底部

一、内存及寻址

返回目录

二、地址变换

80X86 从 逻辑地址 到 物理地址 的转换:第一阶段是使用分段机制把程序的 逻辑地址变换成处理器可寻址的内存空间(称为线性地址空间)中的地址。 第二阶段使用分页机制把线性地址转换为物理地址。 在地址变换的过程中, 第一阶段的分段变换机制总是使用,第二阶段的分页机制是可选的,如果没有启用分页机制,那么分段机制产生的线性地址空间就直接映射到处理器的物理地址空间上。物理地址空间定义为处理器在其总线上能够产生的地址范围。

返回目录

三、分段机制

上图的分段机制,把处理器可寻址的地址空间划分成一些较小的称为段的受保护的地址空间区域。 用能够用来存放 程序代码、数据和堆栈,或者是系统的数据结构。运行多个程序的时候,给每个程序分配各自的段,确保各个程序不会互相干扰。 还可以对断进行分类,对不同类型的段分配不同的权限。

系统中所有使用的段都包含在处理器的线性地址空间中。 需要定位段中的某一个字节(这个就是寻址)的时候,程序必须要提供一个逻辑地址。 逻辑地址包含 一个段选择符 和一个偏移量 。

段选择符是在系统中是唯一的,在段选择符中提供了 段描述符的偏移量,段描述符是段描述符表中的一个数据结构。 每一个段都有一个段描述符,说明了 段的大小 、访问权限、 段的特权机、 段类型 和 段的基地址(段的第一个字节在星星地址空间中的位置,也叫段地址)

逻辑地址的偏移量(即偏移地址)加上段地址就可以定位到段中某一个字节的位置。 因此 段地址 + 偏移地址 就是处理器线性地址空间中的地址(线性地址)。

线性地址和物理地址具有相同的数据结构,对于两维的逻辑地址空间来说(为什么是两维? 段地址和偏移地址各算一维吗?), 它们都是一维的。

虚拟地址(逻辑地址)空间最多只能有 16k个段(2^14= 16348个段)分为两部分,前一半为全局地址空间,后一半为局部地址空间,每个段最长为 4GB ,这样虚拟地址空间最大就可以达到 64TB(2^14 ∗ 2^32 = 2^46)。 线性地址空间和物理地址空间都是 4GB 。 如果禁用了分页机制,那么线性地址空间就是物理地址空间。(实地址模式就是如此的吧!)

返回目录

四 、 分页机制

多任务系统通常定义的线性地址空间比实际的物理内存大很多, 所以需要使用某种“虚拟化”线性地址空间的方法,即虚拟存储技术。 虚拟存储是一种内存管理技术,使用这种技术可以让编程人员产生内存空间要比实际物理内存大很多的错觉。

分页机制支持虚拟存储技术。使用小块的物理内存(RAM 或 ROM)和某些外部存储空间(如硬盘)来模拟大容量的线性地址。 把每个段划分成相同大小(通常每页为 4KB)的页,操作系统维护着一个页目录和一些页表,当程序要访问线性地址空间中的某一个位置时,处理器就会根据页目录和页表把线性地址转换成一个物理地址,然后就可以在该内存位置上进行读写操作了。 如果当前被访问的页面不在物理内存中,处理器就会产生一个页错误异常来中断程序的执行,然后操作系统就可以从硬盘上把该页面读入物理内存中,并继续执行被中断的程序。如果操作系统严格地实现了分页机制,那么对于正确 执行的程序来说页面在物理内存和硬盘之间的交换就是透明的。

分页机制使用了大小固定的内存块,而分段机制使用了大小可变的内存,不管在物理内存上还是在硬盘上,分页使用固定大小的块更为适合物理内存,分段机制使用大小可变的块更为适合处理复杂系统的逻辑分区,可以定义与逻辑块大小适合内存单元而不用受到固定大小的页面的限制,每个段都可作为一个单元来处理,简化了段的保护和共享。

返回目录

五、 保护

80X86支持两类保护: 任务之间的保护 和 特权级保护。

1. 任务之间的保护:给每个任务不同的逻辑地址空间来完全隔离各个任务,通过把每个任务的逻辑地址映射到不同的物理地址来实现 。

把每个任务放在不同的虚拟地址空间中,并对每个任务设置不同的 逻辑地址到物理地址变换映射的方式,一个任务的逻辑地址被映射到物理内存的一部分区域,另一个任务的逻辑地址又被映射到物理内存的另一个区域。 一个任务的逻辑地址不会映射到 其它任务的逻辑地址 所映射的那一片物理内存区域,这样所有的任务都被隔绝开了。 只需要给每个任务各自独立的映射表,每个任务就会有不同的地址变换函数。在80X86中,每个任务都有自己的段表和页表,当处理器切换去执行一个新的任务时,任务切换的关键就是切换到新任务的变换表。

在所有任务中安排相同的虚拟地址到物理地址映射部分,并且把操作系统存储在这个公共的虚拟地址空间部分,就实现了操作系统可以被所有任务共享。这个被所有任务都具有的 相同虚拟地址空间部分叫做全局地址空间。这也是现代Linux操作系统使用虚拟地址空间的部分。

每个任务唯一的虚拟地址空间叫做局部地址空间 。局部地址空间含有需要与系统中其它任务区别开的私有的代码和数据。由于每个任务具有不同的局部地址空间,因此两个不同的任务对相同虚拟地址处的引用将转换到不同的物理地址。 这就是操作系统可以给 每个任务相同的虚拟地址,但仍然能隔绝每个任务。 另一方面,所有任务在全局地址空间中对相同虚拟地址的的引用将被转换到同一个物理地址,这就给公共代码和数据(如操作系统)的共享提供了支持。

2.特权级保护

在一个任务中,定义了 4 个执行特权级,用来 依据段中含有的数据的敏感度 和 任务中不同程序部分的 受信程度,来限制对任务中各段的访问。最敏感的数据被赋予最高特权级,它们只能被任务中最受信任的部分访问。不太敏感的数据被赋予较低的特权级,它们可以被任务中较低特权级的代码访问。

特权级用数字 0 到 3 表示, 0 具有最高特权级,而 3 则是最低特权级。每个内存段都与一个特权级相关联。 这个特权级限制了只有具有足够特权级的程序才能访问这个段。 处理器从 CS 寄存器指定的段中取得和执行指令,当前特权级即CPL 就是当前活动代码段的特权级,它定义了当前所执行程序的特权级别,确定了哪些段能够被程序访问。

每当程序企图访问一个段时,当前特权级就会与段的特权级进行比较,以确定是否有访问许可。 在给定的 CPL 级别上执行的程序 能够访问同级别或低级别的数据段, 任何对高级别段的引用都是非法的,并且会引发一个异常来通知操作系统。 每个特权级都有自己的程序栈,以避免使用共享栈带来的保护问题。当程序从一个特权级切换到另一个特权级上执行时,堆栈段也随着改变到新级别的堆栈中。

返回目录

操作系统学习(一)、80x86保护模式内存管理的更多相关文章

  1. Linux操作系统基础(四)保护模式内存管理(2)【转】

    转自:http://blog.csdn.net/rosetta/article/details/8570681 Linux操作系统基础(四)保护模式内存管理(2) 转载请注明出处:http://blo ...

  2. 80X86保护模式及其编程(一)

    80x86系统寄存器和系统指令 1.标志寄存器(EFLAGS) 标志寄存器EFLAGS的标志位含义如下图: TF 位8是跟踪标志(Trace flag),当设置该位时可为调试操作启动单步执行方式.复位 ...

  3. 《linux 内核全然剖析》 chapter 4 80x86 保护模式极其编程

    80x86 保护模式极其编程       首先我不得不说.看这章真的非常纠结...看了半天.不知道这个东西能干嘛.我感觉唯一有点用的就是对于内存映射的理解...我假设不在底层给80x86写汇编的话.我 ...

  4. 80x86保护模式下IDT和中断调用过程分析

    80x86保护模式下IDT和中断调用过程分析 1.中断描述符表(IDT),将每个异常或中断向量分别与它们的处理过程联系起来.与GDT和LDT类似,IDT也是由8字节长度的描述符组成.IDT空描述符的存 ...

  5. ucore操作系统学习(五) ucore lab5用户进程管理

    1. ucore lab5介绍 ucore在lab4中实现了进程/线程机制,能够创建并进行内核线程的调度.通过上下文的切换令线程分时的获得CPU,使得不同线程能够并发的运行. 在lab5中需要更进一步 ...

  6. 【Spark-core学习之八】 SparkShuffle & Spark内存管理

    [Spark-core学习之八] SparkShuffle & Spark内存管理环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 ...

  7. ucore操作系统学习笔记(二) ucore lab2物理内存管理分析

    一.lab2物理内存管理介绍 操作系统的一个主要职责是管理硬件资源,并向应用程序提供具有良好抽象的接口来使用这些资源. 而内存作为重要的计算机硬件资源,也必然需要被操作系统统一的管理.最初没有操作系统 ...

  8. ucore操作系统学习(四) ucore lab4内核线程管理

    1. ucore lab4介绍 什么是进程? 现代操作系统为了满足人们对于多道编程的需求,希望在计算机系统上能并发的同时运行多个程序,且彼此间互相不干扰.当一个程序受制于等待I/O完成等事件时,可以让 ...

  9. 分布式缓存技术memcached学习(三)——memcached内存管理机制

    几个重要概念 Slab memcached通过slab机制进行内存的分配和回收,slab是一个内存块,它是memcached一次申请内存的最小单位,.在启动memcached的时候一般会使用参数-m指 ...

随机推荐

  1. Linux命令——磁盘管理

    Linux命令--磁盘管理 命令df 作用:查看已挂载磁盘的总容量.使用容量.剩余容量等 参数:-i,查看inodes的使用状况 参数:-h,使用合适的单位显示(推荐) 命令du 作用:查看某个目录或 ...

  2. Grunt-jsdoc生成JS API文档

    Grunt-jsdoc生成JS API文档 具体的请看官网 https://github.com/krampstudio/grunt-jsdoc 一:首先确保本机电脑上是否已经安装了nodejs和np ...

  3. jsonp小案例

    jsonp详解 例子:

  4. C++之语言概述

    C++语言是广泛使用的程序设计语言之一,因其特有的优势在计算机应用领域占有重要一席. C语言的发展 20世纪70年代初,贝尔实验室的Dennis Richie 等人在B语言基础上开发出C语言,最初是作 ...

  5. js 产生随机数

    这里整理了几个产生随机数的方法: 1.generateUUID() //获取一个唯一数 function generateUUID() { var d = new Date().getTime(); ...

  6. 采用PowerDesigner 设计数据库

    PowerDesigner设计数据库的教程网上都有,最好的是我一位同学写的,地址: 点击这里 我的大致流程如下: 首先要以管理员的身份打开PowerDesigner,如果没这么做,将导致后面无法创建S ...

  7. C#可空类型(转载)

    在程序开发中,有时候需要值类型也为可空类型,比如,在数据库中,我们可以把一个日期Datetime设置为null. 在C# 2.0中就出现了可空类型,允许值类型也可以为空(null),可空类型的实现基于 ...

  8. Transaction Check Error:file /usr/libexec/getconf/default conflicts between attempted installs of gcc-6.4.1-1.fc25.i686 and gcc-6.4.1-1.fc25.x86_64

    今天在我的ubuntu系统上使用yum来安装软件时出错了错误:Transaction Check Error:file /usr/libexec/getconf/default conflicts b ...

  9. 2.2《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)——列表

    也许最常用的Unix命令是ls了,它是'list'的简写(Listing 8) Listing 8 用ls以列表的形式显示文件和目录(内容输出跟各自电脑有关) $ ls Desktop Downloa ...

  10. centos7 sentry部署指南

    依赖说明 sentry官方推荐docker方式安装,使用到了docker-compose.docker至少是1.10.3以上的版本.为此需要使用centos7. 安装docker #添加yum 源 # ...