IA初始化后状态 实地址模式 保护模式 任务管理

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


 

 

 



 



 




 


 

 


  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 




 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值