预备 -- NOTE

在启动时需要BIOS将内核放入内存并执行相应的初始化工作,其后将控制权转移给内核。

开始启动时,有一个特殊的硬件电路在CPU的一个引脚上产生一个RESET逻辑值,CPU在识别出RESET信号后将数据总线设为高阻抗状态,地址线强行设为1,并禁用中断。

之后就将处理器的一些寄存器设成固定的值,其中最重要的两个寄存器——CS段寄存器被置为0xf000,EIP指令指针寄存器为0x0000 fff0,因为此时CR0寄存器中的PE位还未被置位,因此处于实模式状态下,对指令的地址计算是CS*16+IP,最终得到地址值为0xf fff0。

 

在实模式下,x86所采用的寻址方式是在16位段寄存器的最右边补上一个0,之后再加上作为偏移量的通用寄存器,从而生成20位的逻辑地址,用以访问1MB存储空间内的任意一个单元。由于所使用的通用寄存器的数据位的宽度为16,所以一个段的最大容量为216=64KB。举例来说,如果段寄存器的内容为1000h,而偏移地址为F000h,那么最终生成的逻辑地址为1F000h,图解如下:

 

在保护模式下使用32位通用寄存器,因而可供寻址的物理内存多达232=4GB。并且此时处理器对段寄存器的使用方式也发生了改变,段寄存器不再被解释为段的基地址,而是将该寄存器的16个位分成3个用于不同功能的域:

段描述符表的基地址被存放在一组专用寄存器中,这些专用寄存器被称为段描述符表寄存器:

TR中包含的选择子用于从任务的描述符表中索引出一个描述符,从而在多任务系统中实现上下文切换操作,LDTR寄存器中包含的选择子则用于从局部描述符表中索引出一个描述符。另外的GDTR与IDTR寄存器包含基地址及界限域,其中界限域的数据位宽度为16,基地址域的数据位宽度为32。在进入保护模式之前,必须先初始化中断描述符表,此后在保护模式下,全局描述符表的基地址及其界限才被装入GDTR中。

寻址全局描述符时,首先根据GDTR得到全局描述符表的基地址,之后通过段寄存器中的13位段选择子(如图2-1所示)索引出其中的一个描述符。


在寻址局部描述符之前,操作系统会在全局描述符表中为某个具体应用的局部描述符表进行注册。此后若段寄存器中的TI域被置位,则通过GDTR中的基地址域及LDTR中的段选择子从全局描述符表中找到对应的描述符,该描述符包含了局部描述符的基地址,界限及访问权限等,接着根据段寄存器中的13位段选择子(如图2-1所示)在局部描述符表中索引出相应的局部描述符表项,图解如下:

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值