[windows内核]段寄存器

什么是段寄存器?
其实我们平常在OD调试中就可以看到,但是不会在意的,这里显示其实是段寄存器的一部分,称为段选择子,下面我们具体会讲。
在这里插入图片描述
还有就是我们平时在调试中经常会看到的汇编代码
在这里插入图片描述
这里其实我们真正写入的地址是ds.base+0x12345678

除了在od中显示的6个段寄存器以外其实还有2个,通常情况下,我们认为有8个段寄存器,他们分别是

ES CS SS DS FS GS LDTR TR

其中,后四个寄存器没有处理器定义,是由操作系统运行它们来赋予目的的。
段寄存器一共有96位,可见部分只有16位,也就是我们在od看到的段选择子,还有80位是不可见的
段寄存器具有以下结构
在这里插入图片描述
结构体表示

struct SegMent
{
	WORD Selector;		// 段选择子 16位 可见
	WORD Attributes;	// 段属性  16位 不可见 只有少数几个属性位是有效的
	DWORD Base			// 段起始地址 32位 不可见  仅对于FS和GS有效
	DWORD Limit			// 段大小 32位 不可见   仅对于FS和GS有效
}

在对段寄存器进行读写时,通常我们采用以下格式
读:

MOV AX,ES

写:

MOV DS,AX

这里要注意一点的是,段寄存器有96位,而AX寄存器只有16位,那在读的时候我们可以正常的取低16位(Selector)读入AX,而在写时,就不太一样了,仍然会将96位数据写入Dst,那剩下的80位数据从何而来?
还有就是我们只能看见段寄存器16位,怎么证明段寄存器有96位?

如果要解释上面的这两个问题就要引入一个GDT的概念
GDT(Global Descriptor Table 全局描述符表)

在设计程序时,我们认为段寄存器为16-bit(虽然每个段寄存器事实上有一个64-bit长的不可见部分,但对于程序员来说,段寄存器就是16-bit),但是为了描述一个段,还需要【Base Address, Limit, Attr】三方面因素,它们加在一起被放在一个64-bit长的数据结构中,被称为段描述符(上面所说的缺少了80位数据,但是这里只存储64位数据是因为80位中只有部分位是有效的)。也就是说,本应该需要64-bit的段寄存器来存储段描述符,但Inter为了向下兼容而规定段寄存器为16-bit,这就需要程序在运行时能通过这16bit数据来找到64bit的段描述符。

怎么解决呢? 解决方法就是将这个64-bit的段描述符放入一个数组中,而将段寄存器中的值作为下标索引来间接引用(事实上,是将段寄存器中的高13 -bit的内容作为索引)。这个全局的数组就是GDT。 但是,GDT这个数组中,存放的不仅仅是段描述符,还有其他的一些64-bit长的描述符。

GDT是Protected Mode所必须的数据结构,也是唯一的。且正如它的名字(GGDTlobal Descriptor Table)所示,它是全局可见的,对任何一个任务而言都是这样。

具体的下篇再详细讲述。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值