第十七课 保护模式中的特权级(下)

问题:

  使用调用门如何实现不同特权级代码之间的跳转(如:从高特权级到低特权级)?

不幸的事实:

  调用门只支持从低特权级到高特权级执行

  无法利用调用门从高特权级到低特权级执行

从高特权级的代码段通过return  far可以返回到低特权级的代码段执行。这时return  far是一个跳转指令,完成从高特权级到低特权级的跳转,这正是我们想要的。

return的本质是做跳转的,而不是我们根深蒂固的做返回的。只是最常用的方式是做返回使用。

思路整理:

  调用门的特权级跳转:

    1、通过远调用(call  far),低特权级 -> 高特权级

    2、通过远返回(retf),高特权级 -> 低特权级

retf的本质就是恢复cs和eip的值,因此,我们需要首先将cs和eip的值放入栈中。

需要提前知道的事实:

  x86处理器对于不同的特权级需要使用不同的栈

  每一个特权级对应一个私有的栈(最多四个栈)

  特权级跳转变化之前必须指定好相应的栈

解决方案(高特权级 -> 低特权级)

  1、指定目标栈段选择子(push)

  2、指定栈顶指针位置(push)

  3、指定目标代码段选择子(push)

  4、指定目标代码段偏移(push)

  5、跳转(retf)

  

原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9623482.html

时间: 2024-10-13 04:04:07

第十七课 保护模式中的特权级(下)的相关文章

第16课 - 保护模式中的特权级(中)

一种新的描述符:门描述符(Gate Descriptor) 通过门描述符在不同特权级的代码间进行跳转 根据应用场景的不同,门描述符分为: 调用门(Call Gates) 中断门(Interrupt Gates) 陷阱门(Trap Gate) 任务门(Task Gate) 门描述符的内存结构 每一个门描述符占用8字节内存 不同类项门描述的内存含义不同 调用门描述符(Call Gates)的定义 调用门描述符的工作原理 调用门描述符的使用 汇编小贴士 汇编语言中的跳转方式 段内跳转:call,jmp

第十一课 实模式到保护模式 中

为了解决内存访问越界的问题,英特尔发明了80286处理器,这款处理器引入了保护模式,为现代操作系统和应用程序奠定了基础,但是80286在设计上有些奇葩,例如: 段寄存器为24位,通用寄存器为16位,这样显得不伦不类. 理论上,段寄存器中的数值可以直接作为段基址.80286中16位寄存器最多访问64K的内存,为了访问16M的内存,必须不停的切换段基址. 虽然存在以上的问题,但是80286引入的保护模式是成功的,为了改进以上存在的问题,英特尔设计出了80386,这时计算机进入新时期的标志,80386

操作系统中的特权级检查

这里涉及到的几个概念:DPL.RPL.CPL DPL:存在于段描述符中,描述访问此段的最低特权级,即访问此段的进程CPL和RPL必须大于等于此段的DPL RPL:存在于段选择符中的最低两位,成为请求特权级即进程的请求权限,这个可以由程序员自己设置但是其功能受到CPL的制约 CPL:存在于cs和ss寄存器中的最低两位,是当前执行程序或者任务的特权级. 一个段描述符的DPL为0表示只允许内核层的进程访问,为3表示允许任意进程访问. 在实模式下,由于段寄存器是16位的,地址线有20根,当时的寻址是通过

第六十五课、c++中的异常处理(下)

一.catch语句中可以抛出异常 (1).catch语句中抛出的异常需要外层的try...catch...捕获 (1).catch中捕获的异常可以被重新解释后抛出 (2).工程中使用这样的方式统一异常类型 #include <iostream> using namespace std; //演示在catch块中可以抛出异常 void Demo() { try { try { throw 'c'; } catch(int i) { cout << "Inner:catch(

CPU 实模式 保护模式 和虚拟8086模式

从80386开始,CPU有三种工作方式:实模式,保护模式和虚拟8086模式.只有在刚刚启动的时候是real-mode,等到操作系统运行起来以后就切换到protected-mode.实模式只能访问地址在1M以下的内存称为常规内存,我们把地址在1M 以上的内存称为扩展内存.在保护模式下,全部32条地址线有效,可寻址高达4G字节的物理地址空间; 扩充的存储器分段管理机制和可选的存储器分页管理机制,不仅为存储器共享和保护提供了硬件支持,而且为实现虚拟存储器提供了硬件支持; 支持多任务,能够快速地进行任务

实模式与保护模式

1. 实模式,又叫实地址模式,CPU完全按照8086的实际寻址方法访问从00000h--FFFFFh(1MB大小)的地址范围的内存,在这种模式下,CPU只能做单任务运行:寻址公式为:物理地址=左移4位的段地址+偏移地址,即:物理地址是由16位的段地址和16位的段内偏移地址组成的. 2.保护模式,又叫内存保护模式,寻址采用32位段和偏移量,最大寻址空间4GB,在这种模式下,系统运行于多任务,设计这种模式的原因和好处是:保护模式增加了寻址空间,增加了对多任务的支持,增加了段页式寻址机制的内存管理(分

Linux下的实模式和保护模式

实模式:(即实地址访问模式)它是Intel公司80286及以后的x86(80386,80486和80586等)兼容处理器(CPU)的一种操作模式.实模式被特殊定义为20位地址内存可访问空间上,这就意味着它的容量是2的20次幂(1M)的可访问内存空间(物理内存和BIOS-ROM),软件可通过这些地址直接访问BIOS程序和外围硬件.实模式下处理器没有硬件级的内存保护概念和多道任务的工作模式.但是为了向下兼容,所以80286及以后的x86系列兼容处理器仍然是开机启动时工作在实模式下.80186和早期的

01保护模式

在X86 CPU的三个模式:实模式,保护模式和虚拟的8086模式 实模式:直接读写真正的物理内存 <建立在实模式的系统称为纯DOS> 保护模式:保护内存,限制内存访问的权限: 虚拟的8086模式:在保护模式下模拟的一个实模式的运行环境 在操作系统启动的时候现在实模式下运行然后进入到保护模式... 在保护模式中,CPU通过两种方法来保护内存 1.段 2.页 <通过段页机制保护内存> 学习推荐书:<Intel白皮书第三卷>

一个操作系统的实现(3)-保护模式进阶

上节内容是从实模式进入到保护模式,只是进入保护模式打印了一个字母P.但是没有体现出保护模式的优势,也没有从保护模式中返回.这节就是要体验保护模式下读写大地址内存的能力和从保护模式返回到实模式. 这节要做的内容如下:首先在屏幕的第11行输出In Protect Mode now. ^-^.然后在屏幕第12行输出内存中起始地址为5MB的连续的8个字节.然后向这个以5MB开始的内存中写入ABCDEFGH.再次在第13行输出这8个字节.结果演示如下: 源代码300多行,很长,分段讲述,主要讲新增的部分