IA处理器初始化: P4,P6,Pentium
寄存器
EFLAG: 0000 0002H
EIP: 0000 FFF0H
CR0: 0600 0010H
CR2,CR3,CR4:
0000 0000H
CS:
段选择符:F000H
段基址: FFFF 0000H
段界限: FFFFH
SS,DS,ES,FS,GS:
段选择符:0000H
段基址: FFFF 0000H
段界限: FFFFH
EAX:
P4:0*
P6,Pentium:0
EBX,ECX,ESI,EDI,EBP,ESP: 0000 0000H
GDTR,IDTR:
基址: 0000 0000H
界限: FFFFH
LDTR,TR:
选择符:0000H
段基址:0000 0000H
段界限:FFFFH
时间戳计数器,性能计数器和事件选择:
加电或复位 0h, init不变
所有其它MSRs:Pentium无
MTRRs:Pentium无
机器检测结构: pentium无
数据和代码Cache,TLBs: 无效
APIC: 加电或复位:使能. init:不变
硬件复位将使处理器进入实地址模式,并初始化寄存器。
复位后,自引导处理器会立即执行从ffff0h地址开始的软件初始代码。
实地址模式下初始化:
1.IA-32加电和复位后,就进入实地址模式,配置必要的数据结构 ,如 配置中断向量表来处理中断和异常。
2.开始执行 位于物理地址FFFF0H处的代码。
。。。加载其它数据结构运行于实地址模式或捉住模式。
保护模式下初始化:
BEGIN=>加载IDT,GDT,TSS,LDT(可选)=>B
B=>使用页?YES(to C): NO(to D);
C=>至少加载一个页目录和一张页表=>D
D=>加载包含了处理器进入保护模式后需要执行的代码的代码段=>II
II=>加载包含必要的中断和异常处理程序=>
E=>初始化GDTR,CR1~4,MTRRs=>
F=>[初始化IDTR]=>G
G=>通过设置CR0.PE值来进入保护模式.=>H
H=>[初始化IDTR]=>
END;
实地址模式转至保护模式:
1. cli关中断
2.lgdt 来将 gdt的基址装载到gdtr中.
3.执行 mov cr0,reg指令来设置cro中pe位(如果允许页式管理还要设置pg位)
4.mov cr0,reg指令后立即执行一个far jmp进入保护模式!!!!!
5.如果要使用局部描述符表则执行lldt将ldt的段选择符加载到ldtr中.
6. LTR指令加载指向初始的保护模式段选择符到任务寄存器。
7.进入保护模式后,段寄存器会继续保留它们在实地址模式下的内容,第4步的远跳会复位CS寄存器,而其它的段则要进行必要的设置。???? how?
8.执行LIDT将保护模式IDT的地址和界限装载至IDTR.(中断描述符表)
9.执行sti指令来取消对硬件中断的屏蔽.
从保护模式到实模式:
1.CLI 屏蔽硬件中断.
2.如果保护模式下使用了页式管理,则 ????
3.将程序控制传送到一个只有64KB大小的可读段中,这一操作使CS中段符合实地址模式的限制.
4.为ss,ds,es,fs,gs 加载选择符......
5.lidt来指向实地址模式的中断向量表....应在1MB的实地址空间中.
6.将CR0.PE清零,转到实地址模式.
7.执行一条 far jmp中转到实地址模式的程序中.这一操作清空了指令队列,将相应的基地址访问权限载进了CS寄存器 . ???
8.装载ss,ds,es,fs,
9. sti
任务管理:
任务执行空间: 代码段,数据段,堆栈段。
任务状态段TSS(共100个字节 ,其包含的内容如下...):
段寄存器,通用寄存器,EFLAGE,EIP,CR3,任务寄存器,LDTR中内容.
I/O映象基址和I/O映象。
特权级0,1,2下堆栈的指针。
指向前一个任务的链接指针。
任务状态段的描述符如下: 8个字节.
界限(2Byte),基址 (3Byte),(TYPE等...2个字节),(基址1Byte).
type=1001B表示是非活动任务,type=1011B表示处于忙状态.
TSS描述符只能放在GDT中,不能在LDT或IDT中.
任何一个CPL值小于或等于TSS描述符中DPL值的程序或过程,都可以用call或jmp来调度这个任务.
任务切换的原因 :
1.当前的程序或过程执行一个到GDT中TSS描述符的jmp或call 指令.
2.当前的程序或过程执行一条到GDT中或当前LDT中任务门描述符的jmp或call
3.一个向量指向IDT中任务门的中断或异常发生.
4.当EFLAGS中NT位被置上时,当前任务执行了一个IRET指令.
任务切换的步骤:
1.从当前或前一个任务链接域中获得新任务的TSS选择符任务jmp或call 的操作数...
//然后会发生什么呢?
2.检查当前任务是否允许切换新任务.
3.确认新任务的TSS描述符标识为当前的,并且段界限大于等于67H.验证新任务是可用的。
4.确认当前TSS,新TSS以所有任务切换中用到的段描述符都被分页存储到系统存储区中。
5.。
7.从任务寄存器中取出当前TSS的基址并将通用寄存器、段选择符、EFLAGS的映像和EIP的内容拷贝到当前任务的TSS中。
8.如果任务切换是由CALL,异常或中断引起,则将任务的EFLAGS中NT置1
9.如果任务切换是由call,jmp,异常或中断引起,则将新任务的TSS描述符忙标志置1
10.从任务寄存器中将新任务TSS的段选择符和描述符取出来。
11.将新TSS内容装入到处理中,包括LDTR,CR3,EFLAGs,EIP...
12.装入新任务TSS段选择符相关的描述符。
13.开始执行新任务.
BIOS