2.2调度内核实现所用到的数据结构
interrupt 类型
当说明一个函数为interrupt类型时,它告诉编译器自动保存所有寄存器(sp和ss除外)的值,并且IRET指令终止该函数。每当进入到interrupt函数时,执行下列指令:
push ax, push bx, push cx,
push dx, push es, push ds
push si, push di, push bp
发生中断时,CPU自动将Flags,cs和IP寄存器压栈。我们将利用interrupt函数的栈的安排方式对要执行的任务的堆栈进行初始化。
BpDI
SI
DS
ES
DX
CX
BX
AX
IP
CS
PLAGS
任务中使用的寄存器的数据结构
typedef struct int_regs{
unsigned bp;
unsigned di;
unsigned si;
unsigned ds;
unsigned es;
unsigned dx;
unsigned cx;
unsigned bx;
unsigned ax;
unsigned ip;
unsigned cs;
unsigned flags;
};
此结构严格按照interrupt函数入口处堆栈的结构定义,初始化时,将结构中的代码段(CS),指令指针(IP)设置成构成此任务的函数的段地址和偏移地址。
用于任务管理的数据结构
struct task_struct{
unsigned sp;
unsigned ss;
unsigned char *stck;
unsigned LastTask;
unsigned IntNum;
unsigned Status;
}
当执行任务切换时,sp和ss保存当前栈指针和堆栈段地址,而任务调度程序将当前栈指针(_SP)和栈地址(_SS)设置成下一个将要执行的任务的栈指针和栈地址,当调度程序结束运行时,由于从栈中弹出的各个寄存器,包括代码段和指令指针都是指向新任务的,因此,新任务将自动运行,从而达到任务切换的目的。
2.2调度内核实现所用到的数据结构
interrupt 类型
当说明一个函数为interrupt类型时,它告诉编译器自动保存所有寄存器(sp和ss除外)的值,并且IRET指令终止该函数。每当进入到interrupt函数时,执行下列指令:
push ax, push bx, push cx,
push dx, push es, push ds
push si, push di, push bp
发生中断时,CPU自动将Flags,cs和IP寄存器压栈。我们将利用interrupt函数的栈的安排方式对要执行的任务的堆栈进行初始化。
BpDI
SI
DS
ES
DX
CX
BX
AX
IP
CS
PLAGS
任务中使用的寄存器的数据结构
typedef struct int_regs{
unsigned bp;
unsigned di;
unsigned si;
unsigned ds;
unsigned es;
unsigned dx;
unsigned cx;
unsigned bx;
unsigned ax;
unsigned ip;
unsigned cs;
unsigned flags;
};
此结构严格按照interrupt函数入口处堆栈的结构定义,初始化时,将结构中的代码段(CS),指令指针(IP)设置成构成此任务的函数的段地址和偏移地址。
用于任务管理的数据结构
struct task_struct{
unsigned sp;
unsigned ss;
unsigned char *stck;
unsigned LastTask;
unsigned IntNum;
unsigned Status;
}
当执行任务切换时,sp和ss保存当前栈指针和堆栈段地址,而任务调度程序将当前栈指针(_SP)和栈地址(_SS)设置成下一个将要执行的任务的栈指针和栈地址,当调度程序结束运行时,由于从栈中弹出的各个寄存器,包括代码段和指令指针都是指向新任务的,因此,新任务将自动运行,从而达到任务切换的目的。
举报