内存管理寄存器

处理器提供了4个内存管理寄存器(GDTR、LDTR、IDTR和TR),用于指定 分段内存管理所使用的系统表的基地址。处理器为这些寄存器加载和保存提供了特定的指令。
 
 
GDTR、LDTR、IDRTR和TR都是段基址寄存器,这些段中包含分段机制的重要信息表,GDTR、IDTR和LDTR用于寻址存放段描述符的段。TR用于寻址一个特殊任务状态段TSS(Task State Segment)。TSS段中包含当前窒息感任务的重要信息。
1.全局描述符表寄存器GDTR
GDTR寄存器中用于存放全局描述符表GDT的32位线性基地址和16位表长度值。基地址指定GDT表中字节0在线性地址空间中的地址,表长度指明GDT表的字节长度值。指令LGDT和SGDT用于加载和保存GDTR寄存器的内容。在机器刚加电或处理器复位后,默认基地址设置为0,而长度被设置成0XFFFF,在保护模式初始化过程中必须给GDTR加载一个新值。
2.中断描述符表寄存器IDTR
与GDTR的作用类似,IDTR寄存器用于存放中断描述符表IDT的32位线性基地址和16位表长度值,指令LIDT和SIDT分别用于加载和保存IDTR寄存器的内容。在机器刚加电或者处理复位后,基地址被默认设置为0,而长度值设置为0XFFFF。
3.局部描述符表寄存器LDTR
LDTR寄存器中用于存放局部描述符LDT的32位线性基地址、16位段限长和描述符属性值。LLDT和SLDT分别用于加载和保存LDTR寄存器的段描述符部分。 包含LDT表的段必须在GDT表中有一个段描述符项,当使用LLDT指令把含有LDT表 段的选择符加载进LDTR时,LDT段描述符的段基地址、段限长度以及描述符属性会被自动加载到LDTR中。当进行任务切换时,处理器会把新任务的段选择符合段描述符自动加载近LDTR中。在机器刚加电或者处理复位后,基地址被默认设置为0,而长度值设置为0XFFFF。
4.任务寄存器TR
TR寄存器用于存放当前任务TSS段的16位段选择符、32位基地址、16位段长度和描述符属性值。 它引用GDT表中一个TSS类型的描述符。指令LTR和STR分别用于加载和保存TR寄存器的段选择符部分。当使用LTR指令把 选择符加载近任务寄存器时,TSS描述符中的段基地址、段限长度以及描述符属性会被自动的加载到任务寄存器中。当执行任务切换时,处理器会把新任务TSS的段选择符和段描述符自动加载到TR寄存器中。
 

其中有一个寄存器叫做EIP(Instruction Pointer,指令寄存器),程序的执行就是靠EIP的不断增加来完成的(跳转的话,EIP就变成了跳转到的地址)。在Windows系统下,进程并不拥有EIP,那么只有进程,一个程序就无法运行。而拥有这些寄存器的是线程,所以说进程是静态的。一个CPU下只有一个EIP,也就是说同一时刻只能有一个线程可以运行,那么所说的多线程又是什么呢?事实上同一时刻也只有一个线程在运行,每个线程运行一段时间后,它会把它拥有的EIP等寄存器让出来,其它线程占有这些寄存器后,继续运行。 




为了实现不同的线程之间的转换,CPU要求操作系统维护一份固定格式的数据(该数据存在于内存中),这份数据叫做Task-State Segment(TSS),在这份数据结构里,维护着线程的EAX,EIP,DS(Data Segment)等寄存器的内容。 




EAX—EDX可称为数据寄存器,你除了直接访问外,还可分别对其高十六位和低十六位进行访问。它们的低十六位就是把它们前边儿的E去掉,即EAX的低十六位就是AX。而且它们的低十六位又可以分别进行八位访问,也就是说,AX还可以再进行分解,即AX还可分为AH(高八位)AL(低八位)。 

在32位程序中,32位以内的函数返回值都通过eax寄存器来传递——这是__stdcall和__ccall的调用约定形成的结果。Win32API函数(wsprintf使用__cdecl调用规则,其余所有API函数都是用__stdcall调用规则)默认是是用eax返回值。高级语言特性+编译器,通常将函数的返回值放在EAX中(单一返回值直接放EAX,如果多个返回值,则EAX中存放指针)。

  00000000   00000000   00000000   00000000
│               EAX                    │
                  │       AX           │
                  │   AH   │    AL     │

 

 

而CPU还有一个寄存器叫做Task Register(TR),该寄存器指向当前正在执行的线程的TSS。而线程切换事实上就是TR指向不同的TSS,这样CPU就会自动保存当前的EAX,EBX的信息到相应的TSS中,并将新的线程的信息加载到寄存器。


32位CPU的寄存器包括

4个数据寄存器 : 

    EAX  (Accumulator) 

    EBX  (Base Register) 

    ECX  (Count Register)  

    EDX  (Data Register)

2个变址和指针寄存器(Index Register) :

    ESI   (Source Index Register)

    EDI   (Destination Index Register)

1个指令指针寄存器 :

    EIP    (Instruction Pointer)

2个指针寄存器(Pointer Register) :

    ESP   (Stack Pointer Register) 

    EBP   (Base Pointer Register)

6个段寄存器(Segment Register) 

    CS    (Code Segment Register)

    DS    (Data Segment Register)

    SS    (Stack Segment Register)

    ES    (Extra Segment Register)

    FS    (Extra Segment Register)

    GS    (Extra Segment Register)

1个标志寄存器 :

    EFlags 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值