操作系统:浅谈实模式,保护模式与长模式

学习了操作系统的实模式、保护模式与长模式,此文作为回顾。

x86 CPU 在第一次加电和每次 reset 后,都会自动进入实模式,要想进入保护模式,就需要程序员写代码实现从实模式切换到保护模式。

一.实模式

早期处理器8086 有 20 根地址线,可以寻址 1MB 内存。但是,它内部的寄存器16 位的,无法在程序中访问整个 1MB 内存。8086CPU将1MB存储空间分成许多逻辑段,每个段最大限长为64KB(但不一定就是64KB)。这样每个存储单元就可以用“段基地址+段内偏移地址”表示段基地址由16位段寄存器值左移4位表达,段内偏移表示相对于某个段起始位置的偏移量。这样就可以访问多达1M的内存。这就是大名鼎鼎的分段内存管理模型。

一个地址有段和偏移两部分组成,物理地址的计算公式为:
    物理地址(physicaladdress)=段值(segment) * 16 + 偏移(offset)
            其中,segment和offset都是16位的。

段寄存器是16位的,在段不重叠的情况下,最多可以将1MB的内存分成65536个段,段地址分别是0000H、0001H、0002H、0003H,……,一直到FFFFH

  在这种模式下,系统计算实际地址的时候是按照对1M求模的方式进行的,这种技术被称为wrap-around。也就是说,当程序员给出超过1M(100000H-10FFEFH)的地址时,因为逻辑上正常,系统并不认为其访问越界而产生异常,而是自动从0开始计算(有时会破坏内存)。

     实模式下的中断有硬件中断与软件中断(INT)两种,其实中断本质就是满足中断条件,转向某个地址执行,再返回原地址的下条指令的地址。中断地址也是基地址+偏移量构成的

二.保护模式

随着软件的规模不断增加,需要更高的计算量、更大的内存容量。此时CPU 的寄存器和运算单元都要扩展成 32 位的。但是实模式下CPU的处理就像脱缰的野马,CPU 对任何指令不加区分地执行,并且CPU 对访问内存的地址不加限制,保护模式由此而生。

保护模式相比于实模式,增加了一些控制寄存器和段寄存器,扩展通用寄存器的位宽,所有的通用寄存器都是 32 位的,还可以单独使用低 16 位,这个低 16 位又可以拆分成两个 8 位寄存器。

顾名思义,保护模式主要对内存起保护作用。为了实现对内存的保护,CPU 实现了特权级(权力向少数人开放?),特权级分为 4 级,R0~R3,每个特权级执行指令的数量不同,R0 可以执行所有指令,R1、R2、R3 依次递减。

在保护模式下地址的表示方式与实模式是一样的,都是:段(segment):偏移(offset),不过保护模式下,“段”的概念发生了根本性的改变。实模式下,段值还是可以看作是地址的一部分,比如段值为xxxxh表示以xxxx0h开始的一段内存。而保护模式下,虽然段值仍然由原来的cs、ds等寄存器表示,但此时它就像一个向导,导向段描述表(描述一个段的信息封装成特定格式的段描述符,放在内存中一个段描述符有 64 位 8 字节数据,里面包含了段基地址、段长度、段权限、段类型等信息。多个段描述符在内存中形成全局段描述符表)。

保护模式下的中断要权限检查,还有特权级的切换。

三.长模式

长模式相比于保护模式,增加了一些通用寄存器,并扩展通用寄存器的位宽,所有的通用寄存器都是 64 位,还可以单独使用低 32 位。32 位可以拆分成一个低 16 位寄存器,低 16 位又可以拆分成两个 8 位寄存器。

长模式依然具备保护模式绝大多数特性,如特权级和权限检查。

长模式下中断门描述符格式发生变化。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值