Intel处理器的保护模式

  • 时间:
  • 浏览:0
  • 来源:大发5分排列3_大发5分排列3官方

 本文转自 dog2500 51CTO博客,原文链接:http://blog.51cto.com/dog2500/1268898

        计算机OS的运行,最终要落实到访问物理内存,毕竟所有的数据还会 来自于物理内存,而访问物理内存就时要先知道物理内存的地址,你你这名 地址是实随便说说在的地址。然而愿意 们 的守护进程中使用的地址却何必 一定要和你你这名 最终的物理地址相等,那末要怎样将守护进程中使用的地址对应到实随便说说在的物理地址,这是一门技术,不知其所以然的人必须将其当成并也有魔法!

物理内存地址生成法子:

虚拟地址概念:所谓虚拟地址,那是除理器为应用守护进程提供的另兩个 概念,对于Intel除理器来讲,它要么是分段虚拟地址,要么是分页虚拟地址。对于哪些是分段和分页,我相信能看多这篇文章的家伙一定都很本来我原因比我更了解。

分段模式的物理地址形成:定位段寄存器-〉找到段选着子-〉找到段-〉定位段的base地址-〉base地址加在指令值即offset-〉得到物理地址。分页模式的物理地址形成:定位cr3寄存器指示的内存-〉读取其值-〉虚拟地址拆分为几块段-〉查找页表-〉得到物理地址。

        愿意 们 看多,分段模式和分页模式得到物理地址的法子截然不同,它们到底哪些区别跟生系呢?本质上,Intel除理器32位保护模式的宗旨在于另兩个 概念,那本来我特权环,另兩个 守护进程仅仅还时要在被允许的特权环内运行,而特权环的实现本来我分段。

2.GDT/LDT:隔离各个任务除却分段机制,32位保护模式还有另兩个 概念,那本来我分页:分页:提供了对虚拟内存的支持,还时要使守护进程可用的地址空间突破物理内存的限制,整个磁盘空间被认为是虚拟的内存(原因不使用file map,那末本来我整个swap空间)。在不启用分页的具体情况下,所有的守护进程共享整个内存,你时要在GDT中为每另兩个 守护进程预留另兩个 位置,时要前一天预知每个守护进程大致时要多大的内存...本来我用虚拟内存,则整个4G的地址空间为另兩个 守护进程独占。

Intel 32位保护模式分为另兩个 层次,另兩个 是分段,另兩个 是分页

分页是位于分段之上更强的针对应用守护进程的保护,然而何必 能完整被抛弃分段。

分段:针对整部机器的特权保护,分为了几块特权环分页:针对守护进程的内存隔离保护,另兩个 守护进程使用另兩个 页表二者结合使用才是真正的所含虚拟内存的32位保护模式

关于TSS:任务切换

守护进程的概念:守护进程本来我另兩个 执行绪,其指令是时要保存于内存当中的,原因OS是无虚拟内存支持的,那末GDT/LDT的重要性就会很大,时要为每另兩个 守护进程单独开辟一块内存,使用LDT来将此块内存与或多或少守护进程的内存隔被抛弃来,原因使能了虚拟内存,那末就由CR3寄存器指示的页目录来完成内存隔离。在那末虚拟内存的具体情况下,所谓的守护进程本来我另兩个 任务,其切换法子本来我Intel定义的任务切换,也本来我另兩个 long jmp,jmp到哪里呢?当然是jmp到目标守护进程的LDT所指示的内存区域了。

所含虚拟内存保护:以分段为依托(原因愿意 励志的话 ,让人最小化使用分段),仅仅将分段用于OS核心与应用守护进程之间的隔离,本来我只时要另兩个 代码段和另兩个 数据段即可,对于所有守护进程,共享另兩个 段,原因守护进程之间还时要使用分页机制来互相隔离。使用分段来把你你这名 系统分为系统空间和用户空间,本来我再用分页机制将用户空间划分为不同的守护进程空间...上方的让人不说了吧

随便说说,愿意 们 何必 被书籍欺骗

千万何必 随便说说本来我我实现另兩个 32位的OS,就要想尽一切法子打开A20总线,开启分页...这你说歌词 原因你看多于渊那个学院派学者的著作,原因你再看看轻量级编程大师的著作,比如《500天自制操作系统》,你就会发现,编写另兩个 OS随便说说真的很简单,那末必要打开A20,也何必 一定必须开启分页...另兩个 纯分段的OS,仍然是另兩个 32位保护模式的OS!

任务切换:Intel并那末将任务和守护进程等同起来。所谓的任务切换,Intel定义为本来我另兩个 long jmp,所谓的long jmp本来我另兩个 切换段寄存器的jmp,本来我Intel定义的任务着重在于和GDT的关系而非和守护进程的关系。Intel的任务切换是另兩个 广义的概念,涉及特权级的切换也是任务切换的并也有,原因一般而言,OS核心和应用守护进程那末了另兩个 特权环,当然本来我在另兩个 段中,本来我在切换时肯定涉及到了段寄存器的重载,当然TR寄存器指示的TSS也被看作是一般的段,CPU能区分目标段是一般的GDT/LDT段还是TSS,原因是TSS,那末就共要切换了另兩个 “守护进程”。对于守护进程切换,更重要的是页表的切换,也本来我CR3寄存器的重载,本来我对于守护进程切换,TSS切换的意义并还会 很大,本来我我能保证寄存器上下文以及守护进程栈的正确save/restore即可,而哪些东西完整还时要都保位于栈上,本来我只时要能保证栈的切换即可

32位OS的实现:

不所含虚拟内存保护:完整的以分段为依托的实现,仅仅实现OS和应用守护进程的隔离,本来我整个应用守护进程的内存空间受制于安装的物理内存大小。也必须另另兩个 ,本来我多出去的内存数据放入哪里呢?