简介
在单CPU计算机中进程是模拟多CPU实现多个任务“同时”运行的机制。单CPU计算机中CPU在任意时刻只能执行一个功能,如果CPU在多个功能之间快速的切换就实现了一种“同时”运行的错觉,给人一种同时运行的假象,能同时听歌、同时浏览网页。
目标
实现一个简单的进程,初步建立进程切换和保存相关进程信息的概念!
1.发生任务切换时,CPU需要保存正在运行进程的相关信息如cs、eip等,将来任务切换回来后还可以继续执行。实现这样的功能intel X86架构的CPU专门提供任务门描述符,数据结构描述如下:
新建multi_task.h
typedef struct _TSS32 {
int backlink, esp0, ss0, esp1, ss1, esp2, ss2, cr3;
int eip, eflags, eax, ecx, edx, ebx, esp, ebp, esi, edi;
int es, cs, ss, ds, fs, gs;
int ldtr, iomap;
}TSS32;
实现任务的切换还需要称为任务门的全局描述符指向相关的TSS32 数据结构(共104字节长度),只不过该描述符在进入保护模式后可以使用C语言实现相关数据的填充、初始化。
multi_task.h 增加段描述符如下:
//全局描述符数据结构
//与汇编全局描述符的数据结构定义完全是等价
typedef struct _SEG_DESC {
short limit_low, base_low;
char base_mid, access_right;
char limit_high, base_high;
}SEG_DESC;
//设置描述符信息
//seg 描述符
//limit 段偏移
//base 段基质
//ar 段属性
void set_segd