操作系统学习(一)、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操作系统使用虚拟地址空间的部分。
每个任务唯一的虚拟地址空间叫做局部地址空间 。局部地址空间含有需要与系统中其它任务区别开的私有的代码和数据。由于每个任务具有不同的局部地址空间,因此两个不同的任务对相同虚拟地址处的引用将转换到不同的物理地址。 这就是操作系统可以给 每个任务相同的虚拟地址,但仍然能隔绝每个任务。 另一方面,所有任务在全局地址空间中对相同虚拟地址的的引用将被转换到同一个物理地址,这就给公共代码和数据(如操作系统)的共享提供了支持。
2.特权级保护
在一个任务中,定义了 4 个执行特权级,用来 依据段中含有的数据的敏感度 和 任务中不同程序部分的 受信程度,来限制对任务中各段的访问。最敏感的数据被赋予最高特权级,它们只能被任务中最受信任的部分访问。不太敏感的数据被赋予较低的特权级,它们可以被任务中较低特权级的代码访问。
特权级用数字 0 到 3 表示, 0 具有最高特权级,而 3 则是最低特权级。每个内存段都与一个特权级相关联。 这个特权级限制了只有具有足够特权级的程序才能访问这个段。 处理器从 CS 寄存器指定的段中取得和执行指令,当前特权级即CPL 就是当前活动代码段的特权级,它定义了当前所执行程序的特权级别,确定了哪些段能够被程序访问。
每当程序企图访问一个段时,当前特权级就会与段的特权级进行比较,以确定是否有访问许可。 在给定的 CPL 级别上执行的程序 能够访问同级别或低级别的数据段, 任何对高级别段的引用都是非法的,并且会引发一个异常来通知操作系统。 每个特权级都有自己的程序栈,以避免使用共享栈带来的保护问题。当程序从一个特权级切换到另一个特权级上执行时,堆栈段也随着改变到新级别的堆栈中。
操作系统学习(一)、80x86保护模式内存管理的更多相关文章
- Linux操作系统基础(四)保护模式内存管理(2)【转】
转自:http://blog.csdn.net/rosetta/article/details/8570681 Linux操作系统基础(四)保护模式内存管理(2) 转载请注明出处:http://blo ...
- 80X86保护模式及其编程(一)
80x86系统寄存器和系统指令 1.标志寄存器(EFLAGS) 标志寄存器EFLAGS的标志位含义如下图: TF 位8是跟踪标志(Trace flag),当设置该位时可为调试操作启动单步执行方式.复位 ...
- 《linux 内核全然剖析》 chapter 4 80x86 保护模式极其编程
80x86 保护模式极其编程 首先我不得不说.看这章真的非常纠结...看了半天.不知道这个东西能干嘛.我感觉唯一有点用的就是对于内存映射的理解...我假设不在底层给80x86写汇编的话.我 ...
- 80x86保护模式下IDT和中断调用过程分析
80x86保护模式下IDT和中断调用过程分析 1.中断描述符表(IDT),将每个异常或中断向量分别与它们的处理过程联系起来.与GDT和LDT类似,IDT也是由8字节长度的描述符组成.IDT空描述符的存 ...
- ucore操作系统学习(五) ucore lab5用户进程管理
1. ucore lab5介绍 ucore在lab4中实现了进程/线程机制,能够创建并进行内核线程的调度.通过上下文的切换令线程分时的获得CPU,使得不同线程能够并发的运行. 在lab5中需要更进一步 ...
- 【Spark-core学习之八】 SparkShuffle & Spark内存管理
[Spark-core学习之八] SparkShuffle & Spark内存管理环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 ...
- ucore操作系统学习笔记(二) ucore lab2物理内存管理分析
一.lab2物理内存管理介绍 操作系统的一个主要职责是管理硬件资源,并向应用程序提供具有良好抽象的接口来使用这些资源. 而内存作为重要的计算机硬件资源,也必然需要被操作系统统一的管理.最初没有操作系统 ...
- ucore操作系统学习(四) ucore lab4内核线程管理
1. ucore lab4介绍 什么是进程? 现代操作系统为了满足人们对于多道编程的需求,希望在计算机系统上能并发的同时运行多个程序,且彼此间互相不干扰.当一个程序受制于等待I/O完成等事件时,可以让 ...
- 分布式缓存技术memcached学习(三)——memcached内存管理机制
几个重要概念 Slab memcached通过slab机制进行内存的分配和回收,slab是一个内存块,它是memcached一次申请内存的最小单位,.在启动memcached的时候一般会使用参数-m指 ...
随机推荐
- Python高级网络编程系列之基础篇
一.Socket简介 1.不同电脑上的进程如何通信? 进程间通信的首要问题是如何找到目标进程,也就是操作系统是如何唯一标识一个进程的! 在一台电脑上是只通过进程号PID,但在网络中是行不通的,因为每台 ...
- Grunt-Kmc基于KISSY项目打包
Grunt-Kmc基于KISSY项目打包 1. Grunt-Kmc 是基于nodejs开发的,所以未安装nodeJS,先需要安装nodejs.安装步骤如下: 1. 下载安装文件,下载地址 ...
- Java java.text.ParseException: Unparseable date
用java将字符串转换成Date类型是,会出现java.text.ParseException: Unparseable date异常. 例如下面的这段代码就会出现上面的异常: public bool ...
- 添加默认的过滤条件xml
<search string="Search Sales Origin"> <field name="name"/> <field ...
- sql语句之随机查询记录和批量插入--基于mysql
本周遇到了好几次数据库方面的问题,一个是上一篇文章提到的因为要修改数据结构引起的在表间复制字段的需求,另一个就是这篇文章要写的:1,从某个数据表中按照某个字段不重复的随机选取几百条记录:2,然后把这些 ...
- python之Django实现商城从0到1
dailyfresh-B2Cdailyfresh mall based on B2C model 基于B2C的天天生鲜商城 项目托管地址:https://github.com/Ylisen/daily ...
- China Internet Conference(2018.07.12)
中国互联网大会 时间:2018.07.12地点:北京国家会议中心
- 2017-2018-1 20155232 嵌入式C语言——时钟
2017-2018-1 20155232 嵌入式C语言--时钟 任务: 在作业本上完成附图作业,要认真看题目要求. 提交作业截图 作弊本学期成绩清零(有雷同的,不管是给别人传答案,还是找别人要答案都清 ...
- EZ 2018 02 26 NOIP2018 模拟赛(一)
这次是校内OJ(HHHOJ)线上比赛,网址:http://211.140.156.254:2333/contest/51 (我去刚刚快写完了手贱关掉了) 这次总体难度也不高,T1&&T ...
- makefile怎么写?
参考:https://blog.csdn.net/haoel/article/details/2886 https://blog.csdn.net/haoel/article/details/2 ...