[转载]使用 task gate 进行任务切换

指令:

  call 0x20:00000000   jmp 0x20:00000000

-----------------------------------

selector 0x20 是个 task gate 的 selector

  这里使用 task gate 任务切换与使用 TSS selector 的情形基本一样。

值得注意的是,使用 task gate 在权限的 check 方面与 call gate 不同的是:

(1)call-gate 的权限 check 中:CPL <= DPLg && RPL <= DPLg  并且 CPL >= DPLs(或 CPL == DPLs)
(2)task-gate 的权限 check 中:CPL <= DPLg && RPL <= DPLg,忽略和 DPLs 的校验。

task-gate 的权限 check:
  CPL <= DPLg && RPL <= DPLg

时间: 2024-08-23 13:10:41

[转载]使用 task gate 进行任务切换的相关文章

[转载]通过 call gate 访问目标 code segment

直接 call / jmp 目标 code segment 不能改变当前的 CPL,若要 call / jmp 高权限的 code segment 必须使用 call gate,在 x86 下还要可以 call / jmp TSS descriptor 或者 call / jmp task gate,但在 64 bit 模式下 TSS 任务切换机制不被支持. 同样以下面的指令为例:(1) call  0x20:0x00040000 (2) jmp 0x20:0x00040000 --------

[转载]使用 TSS selector 进行任务切换

指令: call 0x20:00000000 jmp 0x20:00000000 ----------------------------------- selector 0x20 是个 TSS descriptor 的 selector. TSS descriptor 与 segment descriptor 的格式一致,不同的是 type,在 x86 和 long mode 的 compatibility 模式下有: available/busy 16-TSS 和 available/bus

[转载]long mode 模式下 system/gate descriptor 的疑惑

1. 32 位的 system descriptor 与 64 位的 system descriptor (1)compatibility 模式下,LDT / TSS descriptor 还是原来的 32 位的 descriptor,与原来 x86 的 LDT / TSS 意义一致. (2)64 bit 模式下,LDT / TSS descriptor 扩展为 64 位的 descriptor. descriptor 的 type 被相应改烃.由原来的 32 bit-LDT 改为 64 bit

[转载]x86 的 TSS 任务切换机制

segment descriptors 构建保护模式下的最基本.最根本的执行环境.system descriptors 则构建保护模式下的核心组件: 1.TSS descriptor 提供硬件级的进程切换机制 2.LDT descriptor 供进程使用多个 descriptor 3.Gate descriptor 提供 processor 权限级别的切换机制. 5.7.1. TSS 提供的进程切换机制 TSS 是一段内存区域,存放进程相关的执行环境信息.初始化的 TSS 是由用户提供,进程切换

【译】x86程序员手册26-7.5任务切换

7.5 Task Switching 任务切换 The 80386 switches execution to another task in any of four cases: 80386在以下四种情况下会切换另一个任务去执行: The current task executes a JMP or CALL that refers to a TSS descriptor. 当前任务执行了一个引用了TSS描述符的JMP或CALL. The current task executes a JMP

[转载]使用 int n 调用系统例程

IDT(Interrupt Descriptor Table)仅能存放 interrupt-gate.trap-gate 和 task-gate. 指令: int 0x80 ----------------------------------- 0x80 是 vector (中断向量号) 在 x86 下,gate-descriptor 是 8 个字节,所以:gate = IDTR.base + vector * 8,在 long mode 下,gate-descrptor 是 16 字节,所以:

[转载]使用 call/jmp 直接调用/跳转目标 code segment

直接调用/跳转的形式是: call / jmp selector:offset 这里的 selector 是 code segment selector 直接使用 selector 来索引 code segment,这将引发 CS 的改变,code segment descriptor 最终会被加载到 CS 寄存器里. 在 code segment descriptor 加载到 CS 之前,processor 会进行一系列的检查,包括权限检查.type 检查.limit 检查等,在通过检查后,p

[转载]目标 code segment 的访问

当程序中使用指令 call / jmp,以及通过 int 引发中断例程的执行,这将都是对目标的 code segment 进行访问,当通过权限的检查后程序将会跳转到目标的 code segment 进行执行. 在 code segment 的访问过程中涉及到权限级别的改变,stack 的改变等问题. 访问目标 code segment 的几种情形: 1.call / jmp offset 在段内直接 call / jmp,不改变目标 code segment 2.call / jmp code_

基于JOS 80x86 的堆栈切换简要分析

这个问题一直困扰很久,发现还是有点粗心,源头--堆栈初始化没怎么搞明白. 这里首先强调,一定一定要搞清楚分段和分页保护的机制. 现有分段,后有分页,分页可有可无,看寄存器cr0是否开启PE位(page enable. 在JOS系统的boot.S里就已经开启了) 文章从三个方面对栈进行分析 0. GDT 全局段寻址描述表 1. 栈的初始化. 2.用户栈到内核栈的切换 3.内核栈到用户栈的切换 0. GDT 全局段寻址描述表 你能看见第0个段这个时候是不允许访问的,GD_KT右移三位变成 (0x8