目录

1. 多任务和任务切换概述

1.1 多任务系统

1.2 任务切换含义

1.2.1 切换任务上下文

1.2.2 上下文是什么

1.3 任务切换方式概述

1.3.1 协同式任务切换

1.3.2 抢占式任务切换

1.4 任务切换实现方法概述

1.4.1 硬件自动切换

1.4.2 软件手动切换

2. 示例代码任务结构

2.1 内核任务与用户任务

2.1.1 内核任务

2.1.2 用户任务

2.2 内核任务的创建

2.3 用户任务的创建

3. 任务切换的方法

3.1 任务门描述符

3.2 由中断触发任务切换

3.2.1 保护模式中断处理概述

3.2.2 中断 + 任务门触发的任务切换处理过程

3.2.3 中断 + 任务门触发的任务切换返回

3.3 由call / jmp指令触发任务切换

3.3.1 指令格式

3.3.2 使用call指令触发任务切换

3.3.3 使用jmp指令触发任务切换

4. 示例代码任务切换分析

4.1 从内核任务切换到用户任务

4.2 从用户任务返回内核任务

4.3 再次从内核任务切换到用户任务

4.4 再次从用户任务返回内核任务

5. 任务切换知识点总结

5.1 处理器将控制转移到其他任务的4种方法

5.2 任务切换时处理器执行的操作

5.2.1 获取新任务TSS选择子

5.2.2 特权级检查

5.2.3 目标TSS段有效性检查

5.2.4 检查新任务Busy位

5.2.5 段有效性检查

5.2.6 处理旧任务Busy位

5.2.7 处理旧任务EFLAGS NT标志

5.2.8 保存旧任务上下文

5.2.9 处理新任务EFLAGS NT标志

5.2.10 处理新任务Busy位

5.2.11 加载新任务的TSS段

5.2.12 恢复新任务上下文

5.2.13 加载段描述符


1. 多任务和任务切换概述

1.1 多任务系统

① 从80286开始的处理器是面向多任务系统设计的,在多任务的环境中,可以同时存在多个任务,每个任务有自己的TSS和LDT

在这些任务中,有一个是当前任务,由TR寄存器指向其TSS段,由LDTR寄存器指向其LDT段

② 可以在多个任务之间切换,使他们可以轮流执行

说明:上一章介绍的调用门,是实现任务内部从低特权级的局部空间到高特权级的全局空间的控制转移。本章介绍的内容,则是任务之间的控制转移

1.2 任务切换含义

1.2.1 切换任务上下文

任务切换以任务为单位,是指离开一个任务,转到另一个任务中去执行。当一个任务正在执行时,处理器的各个部分都和该任务密切相关(e.g. 段寄存器指向该任务所使用的内存段,通用寄存器保存着该任务的中间结果),因此在切换任务时,需要完成2个步骤,

① 保存旧任务的上下文

保存旧任务当前的执行状态

② 恢复新任务的上下文

恢复新任务的运行环境

说明:任务首次执行时的上下文

① 在切换任务的上下文时,恢复的新任务的上下文就是该任务上一次被切换走时保存的上下文

② 当一个任务是首次执行时,就需要操作系统为其设置上下文,也就是任务运行的初始状态(e.g. 从任务的入口点开始执行等,详见下文代码分析)

1.2.2 上下文是什么

① 任务的上下文就是任务当前的执行状态,而这些状态就反应在处理器的各个寄存器中

② 为了在任务切换时保存上下文,并在将来重新执行时恢复上下文,就需要用到每个任务的任务状态段TSS,在任务切换时,

a. 将当前任务的执行状态都保存在他的TSS中,也就是将当前任务的状态从处理器中取出,保存在TSS中

b. 取出目标任务的TSS,使用TSS中的内容恢复任务执行状态,也就是将TSS中的值加载到处理器中

说明:上文提到,当一个任务是首次执行时,需要操作系统为其设置上下文,这里设置的就是该任务TSS中的各个字段

1.3 任务切换方式概述

1.3.1 协同式任务切换

① 需要当前任务主动放弃执行权,或者在任务通过调用门请求操作系统服务时,由操作系统"趁机"切换

② 这种方式依赖每个任务的自律性,当一个任务失控时,其他任务可能得不到执行的机会

1.3.2 抢占式任务切换

① 可以安装一个定时器中断,并在中断服务程序中实施任务切换

② 由于定时器中断会定期到达,因此每个任务都能得到执行机会;且一个任务失控,其他任务仍能得到机会执行

1.4 任务切换实现方法概述

1.4.1 硬件自动切换

只需要给出新任务的TSS选择子或者任务门选择子,切换的过程由处理器固件完成

说明1:在使用硬件任务切换时,处理器只负责具体的切换过程,即切换新旧任务上下文。但是何时切换,以及切换到哪一个任务,由操作系统负责

说明2:主流操作系统不再使用硬件任务切换

① 在执行硬件任务切换的过程中,处理器要进行各种检查,非常耗时。因此,在Linux & Windows等主流的操作系统中,目前不再使用硬件切换

② 很多体系结构并不提供任务硬件任务切换功能,这也促使要兼容不同体系结构的操作系统不再使用这种"独门秘笈"

③ 因为实际不再使用,在64位X86体系结构中,除非运行在兼容模式,也已不再支持硬件任务切换

1.4.2 软件手动切换

① 由程序员自行追踪任务之间的关系

② 手工对任务寄存器TR和局部描述符表寄存器LDTR进行设置

③ 手工保存旧任务的所有寄存器

④ 手工恢复新任务的所有寄存器

2. 示例代码任务结构

2.1 内核任务与用户任务

2.1.1 内核任务

① 内核任务只有特权级为0的部分,即只在内核态运行。这也说明,任务的组成是灵活的,并不一定要有低特权级的私有部分

② 内核任务可以完成一些管理和控制功能,比如提供一个界面和用户进行交互。在本章示例中,内核任务起到任务管理器的作用,他会创建用户任务并发起任务切换

2.1.2 用户任务

① 用户任务的实现与之前类似,只是在任务结束时增加了任务切换的操作

② 2个用户任务使用的是同一份代码,只是从硬盘上被加载了2次,这也体现了程序和任务(进程)的关系

2.2 内核任务的创建

说明1:创建内核任务的TSS段

对于一个任务,处理器允许他没有LDT,但是一定要有TSS。任务状态段TSS是一个任务存在的标志,没有他就无法进行任务切换

对比上一章的示例程序,上一章程序内核部分并不是一个任务,因为他没有创建TSS段,也就无法参与调度

说明2:内核任务填充的TSS字段

下面先说明一下填充的字段,

① LDT段选择子设置为0

内核任务没有LDT,处理器也允许任务没有LDT

② IO映射基地址设置为103,也就是TSS段界限值

说明内核任务没有IO许可位串,其实内核任务也不需要IO许可位串,因为内核任务在特权级0运行,有完全的IO操作权限

③ 反向链(前一个任务的指针)设置为0

该字用于维护任务切换时的嵌套关系,此处给出图示,详情见下文

④ CR3设置为0

该位为任务的页目录地址,目前尚未启用分页机制,因此设置为0

⑤ T位设置为0

关闭任务切换时的调试中断

下面再说明一下为何有些字段没有填充,

① 高特权级栈信息

这部分需要登记比任务优先级更高特权级的栈段信息,用于在特权级切换时使用。但是内核任务已经运行在最高优先级,因此无需设置

② 段寄存器 & 通用寄存器

目前处理器中正在运行的正是内核任务,因此段寄存器 & 通用寄存器中记录的就是内核任务的执行状态,所以也无需设置

说明3:加载内核任务的TSS选择子

将任务寄存器TR指向内核任务的TSS段,可以达到2个目的,

① 内核任务真正成为一个任务,而且是当前任务

② 内核任务可以参与任务切换

2.3 用户任务的创建

内核加载用户程序的流程与之前类似,只是需要填充TSS中的更多字段,用于设置任务的初始上下文。而设置任务初始上下文的目标,就是当该任务被首次切换到时,可以正确运行

下面这部分TSS设置内容是新增的,目的是初始化任务的运行状态

我们对照TSS和用户程序头部段,来说明任务的初始上下文状态

可见经过设置后,当用户任务被首次切换执行时,

① [CS:EIP]指向用户程序入口点

② DS指向用户程序头部段,这与之前的实现效果是一致的

③ SS指向用户栈段

④ 使用内核当前的EFLAGS初始化任务的EFLAGS字段,在这里可以设置用户任务的IOPL,以及中断的开关状态

说明:用户任务IOPL初值

在创建用户任务时,使用内核任务的EFLAGS来填充用户任务TSS中的相应成员,而内核任务EFLAGS中的IOPL字段为0。因此,当用户任务开始运行时,其IOPL值为0,即不具备IO操作权限

3. 任务切换的方法

3.1 任务门描述符

① 任务门(Task Gate)描述符也是系统描述符的一种

② 任务门描述符的格式如下

a. type

门描述符类型字段为0b00101,标识该描述符为系统描述符中的任务门描述符

b. TSS选择子

要切换到的目的任务的TSS段选择子,这是任务门的主要内容

c. P位

标识该任务门是否有效,当P = 0时,不允许通过此门实施任务切换

d. DPL

任务门描述符的特权级,当以非中断方式通过任务门实施任务切换时,用于实施权限检查

说明:中断不进行门级检查

① 如果将任务门描述符部署在中断描述符表IDT中,当相应中断发生时,将会触发任务切换

② 对于因中断而发起的任务切换,任务门中的DPL字段不起作用,处理器不按特权级施加任何保护。也就是说,中断不进行门级检查

3.2 由中断触发任务切换

3.2.1 保护模式中断处理概述

① 实模式中断处理使用中断向量表IVT,共256个中断,每个中断向量4B(中断处理程序的段地址 + 偏移地址)

② 保护模式中断处理使用中断描述符表IDT,共256个中断,每个门描述符8B

③ 在IDT中可部署多种门描述符,包括中断门、陷阱门和任务门

a. 如果部署的是中断门或陷阱门,则进行一般的中断处理

b. 如果部署的是任务门,则进行任务切换,此时需要中断当前任务的执行,保护当前任务的现场,并转换到任务门指向的任务去执行

说明:中断门和陷阱门允许在任务内实施中断处理,转到全局空间去执行一些系统级的管理工作,本质上,也是任务内的控制转移行为

3.2.2 中断 + 任务门触发的任务切换处理过程

① 当中断发生时,处理器用中断号乘以8作为索引,访问中断描述符表

② 处理器取出对应的门描述符,解析出类型为任务门,知道应当发起任务切换

③ 处理器从任务门描述符中取出TSS选择子;再用TSS选择子访问GDT,取出新任务的TSS描述符

④ 当前任务的TSS段由任务寄存器TR指向,所以处理器将当前任务的上下文保存在TR指向的TSS段中

⑤ 处理器访问新任务的TSS段,从中恢复新任务的上下文,包括通用寄存器、标志寄存器、段寄存器、指令指针寄存器EIP、栈指针寄存器ESP,以及局部描述符表寄存器LDTR等

⑥ 将任务寄存器TR指向新任务的TSS,处理器开始执行新的任务。一旦新任务开始执行,处理器固件会自动将其TSS描述符的B(Busy)位置为1,表示该任务状态为忙

说明:从上述处理流程可以看出,TSS段描述符只有安装在GDT中才能实际使用。因为处理器只能访问当前任务的LDT(如果有的话),但是当中断到来时,当前任务是不固定的,如果将TSS段描述符安装在LDT中,则需要安装在所有任务的LDT中,而且还必须是相同的entry,这显然是不可行的

作为对比,任务门描述符可以安装在中断描述符表IDT中,也可以安装在全局描述符表GDT或局部描述符表LDT中

3.2.3 中断 + 任务门触发的任务切换返回

当中断发生后,无论是进行一般的中断处理,还是进行任务切换,最后都是通过iret指令返回。前者是返回到同一任务的不同代码段;后者是返回到被中断的那个任务。因此,处理器需要能区分这2种场景

3.2.3.1 EFLAGS NT位

① 32位处理器的EFLAGS有NT位,为嵌套任务标志(Nested Task Flag)

② 如果当前任务EFLAGS的NT位为1,表示当前正在执行的任务嵌套于其他任务内,并且能够通过TSS任务链接域返回到前一任务

③ 因中断而引发任务切换时,取决于当前任务(旧任务)是否嵌套于其他内务内,其EFLAGS的NT位可能是0,也可能是1。处理器不会改变他,而是和其他寄存器一起,写入旧任务的TSS保存起来

3.2.3.2 TSS任务链接域

① 每个任务的TSS中都有一个任务链接域,可以填写为前一个任务的TSS描述符选择子

② 当进行任务切换时,处理器进行如下操作,

a. 将旧任务的TSS选择子填写到新任务TSS中的任务链接域

b. 将新任务EFLAGS的NT位置为1

c. 将新任务TSS描述符的B位置为1(busy)

3.2.3.3 iret任务切换返回

当处理器执行iret指令时,检查当前EFLAGS中的NT位,

① 如果NT = 0,表示是一般的中断过程,按一般的中断返回处理

② 如果NT =1,表示当前任务之所以能够执行,是因为中断了别的任务。因此,应当返回原先被中断的任务继续执行

说明:当通过iret指令进行任务切换返回时,处理器进行如下操作,

① 将当前任务EFLAGS的NT位置为0

② 将当前任务TSS描述符的B位置为0

③ 通过当前任务TSS中的任务链接域找到之前被打断的任务

④ 在保存了当前任务的状态后,用新任务(被中断的任务)的TSS恢复现场

3.3 由call / jmp指令触发任务切换

3.3.1 指令格式

① 除了因中断触发任务切换,还可以使用远过程调用指令call或者远跳转指令jmp直接发起任务切换,指令格式如下,

jmp TSS选择子:将被忽略的32位偏移量
call TSS选择子:将被忽略的32位偏移量jmp 任务门选择子:将被忽略的32位偏移量
call 任务门选择子:将被忽略的32位偏移量

② 当处理器执行上述指令时,首先用指令中的描述符选择子访问指定的描述符表(根据描述符选择子中的TI部分),取出对应的描述符并分析其类型。如果是TSS描述符或者任务门,则进行任务切换。此时,指令中给出的32位偏移量将被忽略

3.3.2 使用call指令触发任务切换

使用call far指令发起的任务切换与因中断发起的任务切换类似,即可以保存切换任务的嵌套关系,并通过iret指令返回到前一任务。在任务切换时,

① 当前任务(旧任务)TSS描述符的B位保持原来的1不变

② EFLAGS寄存器的NT位也保持不变,并保存到旧任务的TSS中

③ 新任务TSS描述符的B位置为1

④ 新任务EFLAGS的NT位也置为1

⑤ 新任务TSS任务链接域设置为旧任务的TSS描述符选择子

3.3.3 使用jmp指令触发任务切换

使用jmp far指令发起的任务切换不会形成任务之间的嵌套关系,自然也就不能使用iret指令返回,这也是可以理解的,因为jmp指令本身就是"有去无回"的。在任务切换时,

① 当前任务(旧任务)TSS描述符的B位清零

② EFLAGS寄存器的NT位不变,并保存到旧任务的TSS中

③ 新任务TSS描述符的B位置为1

④ EFLAGS寄存器的NT位保持从TSS中加载时的状态不变

⑤ 新任务TSS任务链接域内容不变

说明1:任务的不可重入性

① 任务是不可重入的

② 任务不可重入的本质体现在执行任务切换时,新任务的状态不能为忙

③ 处理器通过TSS描述符的B位来检测重入

说明2:call / jmp指令任务切换对任务重入场景的影响

任务不可重入的第一种场景,是执行任务切换时,新任务不能是当前任务自己。如果允许这种情况发生,处理器将无法进行保存和恢复上下文的操作

而call / jmp指令任务切换的不同之处,会影响如下这种重入场景,

① 如果使用call far指令进行任务切换,并构成如下的任务嵌套关系,

此时在任务3中是不允许使用call far指令切换到任务2的,如果允许这种情况发生,维护任务之间嵌套关系的TSS任务链接域将被破坏

② 如果使用jmp far指令进行任务切换,由于是将旧任务的TSS描述符B位清零,因此可以使用jmp far指令切换回去

4. 示例代码任务切换分析

4.1 从内核任务切换到用户任务

内核首先使用call far指令切换到用户任务,此时用户任务与内核任务将构成嵌套关系,可以从用户任务中使用iret指令返回内核任务

说明:[es:ecx]指向的是用户任务的TCB,其中0x14偏移的位置是4B的TSS基地址 + 2B的TSS选择子。当call far指令解析出描述符类型为TSS段之后,会忽略作为4B占位偏移量的TSS基地址

4.2 从用户任务返回内核任务

用户程序通过调用门调用内核例程TerminateProgram实现返回,需要特别注意的是,当控制通过调用门转移到内核例程段的terminate_current_task函数时,执行的任务依然是用户任务,只是当前在用户任务的全局空间执行,是任务内的控制转移

说明:terminate_current_task函数

terminate_current_task函数根据当前EFLAGS寄存器中的NT位,判断切换到本任务的方式,并使用不同的方式返回内核任务

4.3 再次从内核任务切换到用户任务

内核此次使用jmp far指令切换到用户任务,不会构成任务间的嵌套关系

4.4 再次从用户任务返回内核任务

如上文分析,此次用户任务使用jmp far [prgman_tss]的方式返回内核任务,其中prgman_tss标号处存储的,是创建内核任务时分配的TSS基地址及生成的TSS选择子

5. 任务切换知识点总结

5.1 处理器将控制转移到其他任务的4种方法

① 当前任务执行一条将控制转移到GDT内某个TSS描述符的jmp或者call指令

② 当前任务执行一条将控制转移到GDT或者当前LDT内某个任务门描述符的jmp或者call指令

③ 一个异常或者中断发生时,中断号指向中断描述符表内的任务门

④ 在EFLAGS寄存器的NT位为1的情况下,在当前任务执行iret指令

5.2 任务切换时处理器执行的操作

5.2.1 获取新任务TSS选择子

从jmp或者call指令的操作数、任务门或者当前任务的TSS任务链接域取得新任务的TSS描述符选择子

最后一种方法适用于以iret指令发起的任务切换

5.2.2 特权级检查

检查是否允许从当前任务(旧任务)切换到新任务

① 对于jmp或者call指令引起的任务切换

依据数据访问的特权级检查规则进行检查,当前任务(旧任务)的CPL和新任务选择子的RPL必须在数值上小于等于目标TSS或者任务门的DPL

因此示例程序从用户任务切换回内核任务,需要通过调用门先转移到内核态,之后在内核态中触发任务切换

② 对于异常、中断(除了以int n指令引发的中断)和iret指令引起的任务切换,忽略目标任务门或者TSS描述符的DPL

③ 对于int n指令产生的中断,需要检查DPL,当前任务(旧任务)的CPL必须在数值上小于等于目标TSS或者任务门的DPL

5.2.3 目标TSS段有效性检查

通过目标TSS段描述符检查目标TSS段的有效性,

① 检查新任务的TSS描述符是否已经标记为有效(P = 1),即目标TSS段是否在内存中

② 检查目标TSS段界限是否有效(大于等于103B)

5.2.4 检查新任务Busy位

检查新任务是否可用,

① 对于以call、jmp、异常或者中断发起的任务切换,要求B = 0,即任务不忙

② 对于以iret发起的任务切换,要求B = 1,即任务忙

5.2.5 段有效性检查

检查当前任务(旧任务)和新任务的TSS,以及所有在任务切换时要用到的段描述符是否已经在系统内存中

5.2.6 处理旧任务Busy位

① 如果任务切换由jmp或者iret发起,处理器清除当前任务(旧任务)的忙(B)标志

② 如果任务切换由call指令、异常或者中断发起,旧任务的忙(B)标志保持不变

5.2.7 处理旧任务EFLAGS NT标志

① 如果任务切换由iret指令发起,处理器建立EFLAGS寄存器的一个临时副本并清除其NT标志

② 如果任务切换由call指令、jmp指令、异常或者中断发起,副本中的NT标志不变

5.2.8 保存旧任务上下文

保存当前任务(旧任务)的状态到他的TSS中,处理器从任务寄存器TR中找到当前任务的TSS段,然后将以下寄存器的状态复制到当前任务的TSS段中,

① 所有通用寄存器

② 段寄存器中的段选择子部分

③ 上一步中创建的EFLAGS寄存器副本

④ 指令指针寄存器EIP

5.2.9 处理新任务EFLAGS NT标志

① 如果任务切换由call指令、异常或者中断发起,处理器将从新任务加载的EFLAGS寄存器的NT标志置位

② 如果任务切换由iret或者jmp指令发起,处理器保持从从新任务加载的EFLAGS寄存器的NT标志不变

5.2.10 处理新任务Busy位

① 如果任务切换由call指令、jmp指令、异常或者中断发起,处理器将新任务TSS描述符中的B位置位

② 如果任务切换由iret指令发起,B位保持原先的状态不变

5.2.11 加载新任务的TSS段

用新任务的TSS选择子和TSS描述符加载任务寄存器TR,也就是新任务成为当前任务

说明:如果从第1到第11步的过程中发生了不可恢复的错误,处理器不能完成任务切换,并确保处理器返回到执行发起任务切换的那条指令之前的状态

5.2.12 恢复新任务上下文

将新任务的TSS状态数据加载到处理器中,包括,

① LDTR寄存器

② CR3(PDBR)

③ EFLAGS寄存器

④ EIP寄存器

⑤ 通用寄存器

⑥ 段选择子

说明:载入状态期间,也就是第12步,只要发生一个故障,架构状态就会被破坏

5.2.13 加载段描述符

与段选择子相对应的描述符在经过验证后也被加载,与加载和验证新任务环境有关的任何错误豆浆破坏架构状态

说明1:从上述过程可见硬件任务切换的检查步骤确实非常复杂,因此非常耗时

说明2:任务切换时,新任务的特权级并不是从被挂起的任务继承来的,而是由新任务TSS中CS段寄存器的低2位决定的。因为每个任务都有自己的独立的地址空间LDT和任务状态段TSS,所以任务之间是彼此隔离的

X86汇编语言从实模式到保护模式17:协同式任务切换相关推荐

  1. <X86汇编语言:实模式到保护模式>四十四 协同式任务切换

    多任务和任务切换概述 什么时候切换到另一个任务? 以及切换到哪一个任务? 都是操作系统决定. 内核任务的创建和I/O特权级IOPL 0特权级始终高于或等于 IOPL 先使用and,将iopl清0,再使 ...

  2. x86汇编语言从实模式百度云_Intel x86 CPU 32位保护模式杂谈之任务切换 上

    目录: 什么是任务 任务由什么组成 任务门描述符是什么东东?有了TSS描述符为什么要有任务门描述符? 参考文献 什么是任务 任务(task)是处理器可以分配.执行.挂起的工作单位,笔者认为和我们操作系 ...

  3. 硬盘和显卡的访问与控制(一)——《x86汇编语言:从实模式到保护模式》读书笔记01

    本文是<x86汇编语言:从实模式到保护模式>(电子工业出版社)的读书实验笔记. 这篇文章我们先不分析代码,而是说一下在Bochs环境下如何看到实验结果. 需要的源码文件 第一个文件是加载程 ...

  4. 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16...

    一.Intel 32 位处理器的工作模式 如上图所示,Intel 32 位处理器有3种工作模式. (1)实模式:工作方式相当于一个8086 (2)保护模式:提供支持多任务环境的工作方式,建立保护机制 ...

  5. 《x86汇编语言:从实模式到保护模式》视频来了

    <x86汇编语言:从实模式到保护模式>视频来了 很多朋友留言,说我的专栏<x86汇编语言:从实模式到保护模式>写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节. ...

  6. 《x86汇编语言:从实模式到保护模式》读书笔记之后记

    本来打算把整本书的读书笔记写完,可是由于有其他的计划(就叫做"B计划"吧)且优先级更高,所以我的读书笔记搁浅了.为了全力以赴执行B计划,我的博客要荒芜一段时间(我希望不要永远荒芜下 ...

  7. 处理器在实施任务切换时的操作——《x86汇编语言:从实模式到保护模式》读书笔记39

    处理器在实施任务切换时的操作--<x86汇编语言:从实模式到保护模式>读书笔记39 处理器可以通过以下四种方法实施任务切换: 1. call指令或者jmp指令的操作数是GDT内的某个TSS ...

  8. 任务切换——《x86汇编语言:从实模式到保护模式》读书笔记38

    任务切换--<x86汇编语言:从实模式到保护模式>读书笔记38 本文及后面的几篇博文是原书第15章的学习笔记. 本章依然使用第13章的主引导程序. 1. 协同式多任务与抢占式多任务 有两种 ...

  9. 任务切换的方法——《x86汇编语言:从实模式到保护模式》读书笔记37

    任务切换的方法--<x86汇编语言:从实模式到保护模式>读书笔记37 1. 中断门和陷阱门 在实模式下,内存最低端的1M是中断向量表,保存着256个中断处理过程的段地址和偏移.当中断发生时 ...

  10. 任务和特权级保护(五)——《x86汇编语言:从实模式到保护模式》读书笔记36

    任务和特权级保护(五)--<x86汇编语言:从实模式到保护模式>读书笔记36 修改后的代码,有需要的朋友可以去下载(c14_new文件夹).下载地址是: GitHub: https://g ...

最新文章

  1. hbase基础建表语句
  2. centos 多个yum源,系统怎么选择
  3. matlab同时给多个变量赋值(deal)
  4. [转载]编译中的常见分析方法
  5. 唯品会 1000+ 台 Hadoop 集群优化经验
  6. php生成图片验证码-附五种验证码
  7. 田溯宁:云基地就像一个苗圃
  8. bullet HashMap 内存紧密的哈希表
  9. mysql 递归实现树形_Mysql实现树形递归查询
  10. oracle数据库给用户解锁和修改密码和提升权限的命令
  11. Spring Cloud 微服务下的权限解决方案
  12. 订阅github release(官方+IFTTT)
  13. mysql 索引优化分析
  14. Croe文件在线预览
  15. mac录制视频——OBS
  16. 170323 PyQt5 ListWidget的删除
  17. 基于Django的在线学习资源分享与推荐系统(mysql)-python.VUE【数据库设计、论文、源码、开题报告】
  18. 用NSIS制作安装文件
  19. 基于三维激光扫描技术的古建筑测绘工作
  20. IAP的无线版(stm32无线下载程序)(基于有线升级)

热门文章

  1. flutter 微信语言选择_flutter实战项目,教你使用flutter打造微信app页面!
  2. 如何使用定时器产生两路频率可调的PWM波
  3. Spring RestTemplate: 比httpClient更优雅的Restful URL访问, java HttpPost with header
  4. 腾讯地图api-前端定位组件
  5. Linux下的less命令
  6. mysql卡住如何定位_MySQL 5.7中如何定位DDL被阻塞的问题
  7. Delete带有子查询的sql优化,改为innerJoin解决
  8. 数字电路与微型计算机原理,电子科技大学1999年考研真题-微机原理与数字电路...
  9. 深度搜索 java_java实现的深度搜索与广度搜索算法BFS,DFS以及几种最短路径算法...
  10. promentheus的组件有_Prometheus实施架构小结 PDF 下载