操作系统学习(一)、80x86保护模式内存管理

整理的不好,凑合着看吧

目录

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操作系统使用虚拟地址空间的部分。

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

  1. 特权级保护

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

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

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

返回目录

原文地址:https://www.cnblogs.com/ay-a/p/8321963.html

时间: 2024-10-01 02:59:31

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

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

80x86系统寄存器和系统指令 1.标志寄存器(EFLAGS) 标志寄存器EFLAGS的标志位含义如下图: TF 位8是跟踪标志(Trace flag),当设置该位时可为调试操作启动单步执行方式.复位时则禁止单步执行.在单步执行方式下,处理器会在每个指令执行后产生一个调试异常,这样我们可以观察执行程序在每条指令执行后的状态. IOPL 位13-12时I/O特权级(I/O Privilege Level)字段.该字段指明当前运行程序或任务的I/O特权级别IOPL.当前任务或程序的CPL必须小于这个

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

1.中断描述符表(IDT),将每个异常或中断向量分别与它们的处理过程联系起来.与GDT和LDT类似,IDT也是由8字节长度的描述符组成.IDT空描述符的存在标志位必须是0.IDT表可以驻留在线性地址空间的任何地方,处理器使用IDTR寄存器来定位IDT表的位置. LIDT指令可以把内存中的限长值和基地址操作数加载到IDTR寄存器中,该指令仅能由当前特权级CPL是0的代码执行,通常被用于创建IDT时的操作系统初始化代码中.SIDT作用相反,但可以在任何特权级执行. 2.IDT描述符 IDT表中可以存

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

[Spark-core学习之八] SparkShuffle & Spark内存管理环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark-1.6 一.SparkShuffle1. SparkShuffle概念reduceByKey会将上一个RDD中的每一个key对应的所有value聚合成一个value,然后生成一个新的RDD,元素类型是<key,v

分布式memcached学习(三)&mdash;&mdash;memcached内存管理机制

  几个重要概念 Slab memcached通过slab机制进行内存的分配和回收,slab是一个内存块,它是memcached一次申请内存的最小单位,.在启动memcached的时候一般会使用参数-m指定其可用内存,但是并不是在启动的那一刻所有的内存就全部分配出去了,只有在需要的时候才会去申请,而且每次申请一定是一个slab.Slab的大小固定为1MB(1MB=1024KB=1024×1024B=1048576B,1048576字节),一个slab由若干个大小相等的chunk组成. Slab的

(Object-C)学习笔记(三) --OC的内存管理、封装、继承和多态

OC的内存管理 iOS7以前使用的是MRC手动内存管理,现在都使用ARC自动内存管理,一般不会出现内存泄漏问题. 封装 封装就是有选择的保护自己的代码.将给别人使用的接口留出来让人看见,其他的都隐藏起来.增加了代码的可读性.可维护性.可拓展性. 将给别人看的代码放在 interface当中(.h or .m),不让看的放在implementation当中.这就是封装对象. 继承 子类可以继承父类非私有的属性和方法. 继承的优点:1.代码复用 2.制定规则 3.为了多态 继承的缺点:1.提高了代码

IOS 阶段学习第九天笔记(内存管理)

IOS学习(C语言)知识点整理 一.内存管理 1)malloc , 用于申请内存; 结构void *malloc(size_t),需要引用头文件<stdlib.h>:在堆里面申请内存,size_t,表示申请空间的大小,单位是字节:如果申请成功,返回这段内存的首地址,申请失败,返回NULL;需要手动初始化 注意点: 1.可能会申请失败,所以需要判断返回是否是NULL. 2.申请的内存需要强制转换为指定的数据类型,例如:(int*)malloc(10*sizeof(int)) 3.分配的内存是未初

《objective-c基础教程》学习笔记(十)—— 内存管理之对象生命周期

本篇博文,将给大家介绍下再Objective-C中如何使用内存管理.一个程序运行的时候,如果不及时的释放没有用的空间内存.那么,程序会越来越臃肿,内存占用量会不断升高.我们在使用的时候,就会感觉很卡,最终使得程序运行奔溃.因此,将无效的内存及时清理释放,是非常有必要的. 一个对象在最初创建使用,到最后的回收释放,经历的是怎样一个过程呢?包括:诞生(通过alloc或new方法实现).生存(接收消息并执行操作).交友(通过复合以及向方法传递参数).最终死去(被释放掉). 一.引用计数 在对象创建的时

操作系统学习笔记:保护

保护是指一种控制程序.进程或用户对计算机系统资源进行訪问的机制. 操作系统中的进程必须加以保护,使其免受其它进程活动的干扰.为此.系统採用了各种机制确保仅仅有从操作系统中获得了恰当授权的进程才干够操作对应的文件.内存段.CPU和其它的资源. 一.保护目标 提供保护的理由是首先须要防止用户的恶意操作.其次是以规定的策略一致的方式使用系统资源. 二.保护原则 最小特权原则. 三.保护域 进程仅仅能訪问那些已经获得了授权的资源,并且.仅仅能訪问完毕当前任务所须要的资源:其次是须要才知道原则(need-

【OC学习-11】ARC和内存管理里面的alloc、assign、new、retain、copy、mutableCopy、release说明

一般我们在开发程序时,只管alloc,不需要管release,因为有ARC帮我们管理.但是在学习时仍需要了解:内存是有限的,在堆区分配了内存后,如果不需要,则要回收,不然内存不够引起崩溃. 所以原则是:有分配,就有回收.但是这个分配有可能分配好几次,那么回收怎么知道回收几次呢?这就是引用计数的作用.创建一个对象时,它自带了这个引用计数. (1)alloc.new.copy.mutableCopy和retain时,引用计数+1,即retainCount+1; (2)release时,引用计数ret