Tech

实模式和保护模式

如今很多CPU的设计模型都起源于x86系列,在早期Intel8086芯片有20位的地址总线,所以最大可以访问 2^20=1MB 的内存空间。由于8086处理器的寄存器只有16位,所以采用段基址*16 + 段内偏移值的方式访问1M字节的物理地址空间。

如下图可见,从Intel80826开始,处理器以两种不同的方式执行地址转换,这两种方式分别为实模式保护模式

实模式

实模式存在的主要原因是要维持处理器与早期模型兼容,它的特性是1MB的内存物理空间可被寻址,没有硬件支持的分页机制和实时多任务概念。在80286及以后的x86系列兼容处理器仍然是开机启动时工作在实模式下。物理地址计算方法如下图所示:

保护模式

保护模式下段寄存器中不再存放段基址, 而是存放索引内存中描述符表的选择符。分段单元执行以下操作:

  • 检查段选择符的TI字段,以决定段描述符保存在哪一个描述符表中(GDT or LDT)。
  • 通过选择符的index字段计算段描述符的地址,index字段的值乘以8(一个段描述符的大小为8字节),将这个结果与gdtr或者ldtr寄存器中的内容相加。
  • 把逻辑地址的偏移量与段描述符Base字段的值相加得到了线性地址又称虚拟地址。


分页单元:

分段对内存区域的映射是按照程序为单位,为了使程序局部性原理得到充分的利用,人们想到了更小粒度的内存分割和映射方法,大大提高了内存的使用率,这种方法就是分页。通过 MMU(Memory management unit)把虚拟地址转换为物理地址。通常两级页表对32位的系统来说已经足够用了,但64位系统需要更多数量的分页级别。具体操作如下:

  • 通过虚拟地址找到页表中对应的条目,检查有效位,是否需要触发页错误。
  • 根据第一层的页目录中的条目指向其他的目录,直到找到最后页表中的物理页号(PPN)所对应的内存中的地址。
  • 最后把虚拟页偏移量(VPO)和前面的实际地址拼起来,就是最终的物理地址了。

使用虚拟内存主要是基于下面三个考虑:

  • 可以更有效率的使用内存:使用 DRAM 当做部分的虚拟地址空间的缓存。
  • 简化内存管理:每个进程都有统一的线性地址空间。
  • 隔离地址控件:进程之间不会相互影响;用户程序不能访问内核信息和代码。

计算机启动过程

了解了以上知识后,就能明白计算机启动的原理和过程了。在按下主机电源后,第一个运行的程序是BIOS(Base Input & Output System),即基本输入输出系统,主要功能是检测和初始化硬件的。在开机的一瞬间,内存中什么程序都没有,那么BIOS程序是如何自启动的?被加载到哪里?

既然不能通过软件加载,那么只能依靠硬件了。BIOS代码工作是不会变的,它被写到了ROM中,被映射在低端1MB内存的顶部。80x86系列的CPU硬件都设计为加电即进入16位实模式状态运行,并且强行将代码段寄存器(CS)的值设置为0xF000、指令指针寄存器(IP)的值设置为0xFFF0。在实模式下段基址要乘以16,再加上偏移值。这样BIOS程序的入口地址便是0xFFFF0,改程序的第一条指令就存在这个位置。启动过程如下:

  1. 启动BIOS(全称:Base Input & Output System),准备实模式下的中断向量表和中断服务程序
  2. 从启动盘加载操作系统到内存(利用中断)
  3. 为main函数做过渡准备工作

总结

下图含括了实模式和保护模式的地址计算方式:

comments powered by Disqus