cpu 保存模式的内存访问向下兼容原理

 在实模式下。都知道是用段地址加上偏移地址。这里直接上保护模式。(没有考虑分页机制)

1.首先在保护模式为了兼容实模式的分段机制。也使用的分段处理。引入全局描述符表(GDT)用来登记地址,也就是不像实模式下地址可以也随便指。保护模式下要想访问哪个地址(看能否可以访问),你得先登记。因此起到了保护作用。

2.描述符表得保存在内存中,同时要有寄存器去访问,这里也就增加了个全局描述符表寄存器(GDTR),高 32 位指向描述符表的线性地址。(如果没有分页机制就是物理地址)。前 16 位表是描述符(简单讲就是描述符这地址的一些特性,占 8 字节,也就是最多 8192 个描述符, 只有2的 16 次方空间,也就是GDT最大 64kb)。


3.全局描述符表可以随便放哪,但是 cpu 开始起动还是实模式,因此 还是只能访问 1MB。在这1MB里可以随便放。同时进入保护模式时可以再改表的地方。



4.描述符是占 8 字节也就是 64 位。表示一些限制。


/内存的访问/

1.实模式与保护模式的切换开关是一个叫 CR0 的寄存器。(第一位 0 或 1)


2.在 32 位的寄存器或更高位运行在实模式下时,用前 16 位表示段地址。在这里要指出的是,在 8086 (寄存器 20 位)下的寻址是段地址*16 加偏移地址,而32 位 cpu 的寄存器都是 32 位或更高位的 cpu 中,他是当你传 16 位段地址时(后面 16 位补 0),他自动*16,也就是段地址直接是前 20 位,后面的 12 位全为 0。所以向下兼容 。

3.不管在什么模式下只要是在 32 位(更高位也是) cpu 中这些 cs ds ip 等这些原来的16 位的段寄存器(又增加了几个)不是保存段地址了,是段选择子。同时也改名了,把这些寄存器叫作段选择器。(初始化地址后同时看标志位如果运行在实模式(8086模式)下,按 32 位前 20 位表示段地址,最大内存是 2 的 20 次方,高12 位全为 0。 运行在保护模式下32 位全部派上用场)。

4.32 位处理器的真正段寄存器(这里没说 32 位的段寄存器是多少位,也就是在以前 16 位的段寄存器就是简单的用来保存段地址的寄存器,而32 位的段寄存器没那么简单具体情况我也没明白是前面的用 16 位cs ds ip 等段选择器,和后面一部分组成。


5.传到段选择器中的是段选择子(16 位)


6.真正的段地址=(描述符在表中的偏移地址(偏移地址是索引号*8)+表基地址)中表示的那个地址   ( 表的基地址在 GDTR 中取 ,再然后把真正段地址放在高速缓存器,图中第三步



7.真正的地址 = 段(基)地址+偏移地址。


8.不仅是数据。指令也是如此。


9.最后主要不同 如果向下兼容的是 20 位 那么 32 位寄存器只用的前 20 位后 12 位全 0(不一定是 0,反正没用到)同理兼容 16 位的只用到 16 位。 

分段与分页可以看: http://blog.csdn.net/rosetta/article/details/8933200

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C-haidragon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值