• 任务和特权级保护


            每个任务有EFLAGS寄存器的副本,其内容在任务创建的时候由内核或操作系统初始化.在多任务系统中,每次当任务恢复运行时,就由处理器固件自动从TSS中恢复.

            EFLAGS寄存器的IOPL位决定了当前任务的I/O特权级别.如当前特权级高于或等于IOPL的特权级,所有IO操作都是允许的.

            如当前特权级低于IOPL的特权级,需进一步结合任务TSS的I/O许可位串.

            处理器检查I/O许可位的方法是先计算它在I/O许可位映射区的字节编号,并读取该字节,然后测试.

            IO端口读出,写入操作单位是字节.

    1.用户程序的执行

            CALL FAR

            JMP FAR

            栈切换过程:

            1.使用目标代码段的DPL到当前任务的TSS中选择一个栈,包括栈段选择子,栈指针

            2.从TSS读取选择的段选择子,栈指针,并用该选择子读取栈段描述符.

            3.检查栈段描述符的特权级,类型.

            4.临时保存当前栈段寄存器SS和栈指针ESP内容

            5.把新的栈段选择子,栈指针代入SS和ESP寄存器,切换到新栈

            6.将刚才临时保存的SS和ESP内容压栈.

            7.依据调用门描述符"参数个数"指示,从旧栈将所有参数复制到新栈.

            8.将当前寄存器CS和指令指针寄存器EIP压入新栈.

            9.从调用门描述符将目标代码段选择子和段内偏移传送到CS和EIP寄存器,开始执行被调用过程.

            控制返回:

            1.检查栈中保存的CS寄存器的内容,根据其RPL决定返回时是否需改变特权级别

            2.从当前栈读取CS和EIP寄存器的内容,针对代码段描述符,代码段选择子的RPL字段实施特权级检查.

            3.如远返回带参数,将参数和ESP寄存器当前值相加,以跳过栈中参数部分.

            4.如返回时,需改变特权级,从栈中将SS和ESP压栈值代入段寄存器SS和ESP.切换到调用者的栈.

            5.如远返回指令带参数,将参数和ESP当前值相加

            6.如返回时需改变特权级,检查DS,ES,FS,GS内容.

    2.任务切换

            实模式下,内存最低地址段1KB是中断向量表.

            保护模式下,中断向量表不再使用,取而代之是,中断描述符表.它保存的是门描述符,包括中断门,陷阱门,任务门.

            调用门,从任务的局部空间转移到更高特权级的全局空间去执行.

            中断门,陷阱门允许在任务内实施中断处理,转移到全局空间去执行一些系统级的管理工作.

            当中断发生时,处理器用中断号乘以8作为索引访问中断描述符表.当它发现这是一个任务门描述符时,就知道应发起任务切换.于是,它取出任务门描述符;从任务门描述符取出新任务的TSS选择子;再用TSS选择子访问GDT,取出新任务的TSS描述符.

            转到新任务执行前,处理器先把当前任务的状态保存起来.

            处理器访问新任务的TSS,从中恢复各个寄存器的内容,包括通用寄存器,标志寄存器,段寄存器,指令指针寄存器,栈指针寄存器,局部描述符表寄存器等.

            最终,任务寄存器TR指向新任务的TSS,而处理器旋即开始执行新的任务.一旦新任务开始执行,处理器固件会自动将其TSS描述符的B位置"1",表示该任务的状态为忙.

            中断发生时,可执行常规的中断处理过程,也可进行任务切换.它们都使用iret指令返回.一个是返回一个任务内的不同代码段,一个是返回到被中断的任务.

            32位处理器的EFLAGS有NT位,意思是嵌套任务标志.

            每个任务的TSS都有一个任务链接域,可以填写为前一任务的TSS描述符选择子.如当前任务EFLAGS寄存器的NT位是"1",则表示当前正执行的任务嵌套于其他任务内,且能通过TSS任务链接域的指针返回到前一个任务.

     

     

  • 相关阅读:
    干货分享!各大跨境电商平台入驻指南及跨境电商实用工具推荐!
    闭包(函数)
    windows service项目里关于定时器的用法
    【Java基础面试三十四】、接口中可以有构造函数吗?
    微信小程序常用组件实战
    递增删除图象
    Java 线程的核心知识
    STL- 函数对象
    基于纯前端类Excel表格控件实现在线损益表应用
    Vue3 + VueRouter + Vite + pinia组件化开发实战入门
  • 原文地址:https://blog.csdn.net/x13262608581/article/details/125570937