DAY 0x0F

两种JMP指令

near jmp只修改IP寄存器的值,而far jmp同时修改IP寄存器和CS寄存器的值(用:隔开) 用于任务切换的JMP命令就属于far-JMP命令,用于任务切换的JMP命令在切换回这个任务后,会从这条JMP命令后继续执行。

GDT中的TSS段

TSS(task status segment),全称任务状态段 CPU在执行带有段地址的指令时,会去确认GDT中对应项的配置,可用此判断是JMP指令还是far-JMP,

TR(task register)寄存器

TR寄存器记录当前正在运行的是哪一个任务,任务切换时,寄存器的值会自动变化,每次给TR寄存器赋值的时候,需要将其在GDT中的序号乘以8。

两个任务交替进行输出: 两个任务交替进行输出

DAY 0x10

作者原先只定义了两个任务,并且只是在超时之后将其强行进行切换,但是实际中的场景比这样的复杂得多,因而封装了切换任务的的逻辑,并且在这样的基础上实现任务增减、任务优先级设置,因此我这里模仿CanvasCtl的结构去实现task的管理

多窗口

多任务建立起来以后,窗口(window)的数量也相应增加,为此实现了窗口和任务的绑定关系、窗口焦点的变化。

优先级

原先的task切换时,采用的是公平竞争的方式,每个任务被执行的几率相等,但是在实际的操作系统中,往往需要让某些进程拥有更高的优先级。要实现这样的功能,只要在task中加入priority字段,然后在切换任务时考虑这个字段即可。 task不同的优先级

DAY 0x11

命令行窗口

这一天的内容基本上是对现有知识的应用,读取键盘输入、keytable的转换、按键的不同情况的响应等。 由于我之前写了log输出模块,可以像命令行那样一行一行显示日志文本,所以这个命令行窗口其实和我之前的那个日志模块有些类似,因此我直接将原先的代码进行修改,结合作者的实现,加入读取键盘输入的逻辑。 对各种按键锁的支持其实就是获取锁的状态,并进行记录,然后在触发按键响应过程中判断锁的状态,以此进行过滤。 但是一些组合键的响应支持还不够完善,期待下一天的相关内容。