文章目录

  • CPU运行模式
    • 模式转换示意
  • 系统上电时的模式切换
    • 从实模式切换到保护模式
      • A20功能
        • 开启A20功能
      • 系统数据准备
      • 模式切换流程
    • 从保护模式切换到长模式
      • 系统数据准备
      • 模式切换流程
  • 相关参考

CPU运行模式

IA-32处理器有三种基本的操作模式:实地址模式、保护模式和系统管理模式。另外一种模式称为虚拟8086模式,是保护模式的一个特例:

  • 实地址模式:早期Intel 8086处理器的运行模式,只支持16位,通过使用段+偏移地址的寻址方式,最大可寻址1M的内存。实地址模式下,允许程序不加限制地访问内存空间的任意位置,因此是极不安全的;
  • 保护模式:保护模式是处理器的基本模式,在保护模式下,所有指令和特性都是可用的,程序被赋予了独立的内存区域(段),处理器阻止程序访问已分配段之外的其它内存;
  • 系统管理模式:系统管理模式为操作系统提供了用以实现电源管理和系统安全等功能的机制;
  • 虚拟8086模式:在保护模式下,处理器可以在安全的多任务环境中执行实地址模式的软件;

Intel 64位处理器架构下新增了一种新的操作模式,称作IA-32e模式,是64位处理器的主要运行模式。IA-32e模式下,处理器支持两种子模式:Compatibility模式和64位模式:

  • Compatibility模式下支持运行大部分传统的保护模式应用;
  • 64位模式下支持64位长的线性地址空间。

模式转换示意

Intel处理器各个运行模式间切换过程示意如下:

系统上电时的模式切换

由于历史原因,Intel处理器的开发和演进一直在保持着向后兼容,即使当下我们已经在使用x86_64的架构,但在PC开机上电时,处理器仍然需要先运行在16位的实地址模式下,然后切换到32位保护模式,最后才能切换到64位模式(IA-32e模式,也称作长模式)下运行。

从实模式切换到保护模式

Intel处理器的保护模式提供了诸多新机制,包括全新的分段机制、分页机制以及保护机制等,这些机制涉及到一些关键的系统数据结构,如GDT、IDT、TSS以及页表等,因此,处理器在切换到保护模式前,系统编程人员必须准备好相关的数据结构,然后按照Intel官方手册规定的步骤进行操作。

A20功能

早期8086处理器只有20根地址线,因此只能寻址1MB以内的地址空间。随着处理器寻址能力的不断增强,处理器开始逐步支持32位以至64位寻址。为了保证硬件平台的向后兼容性,硬件设计人员利用了当时8042键盘控制器上一个空闲的端口引脚,来控制开启或禁止1MB以上地址空间,即A20地址线功能。当A20地址线引脚位低电平时,那么只有低20位地址有效,其它位均为0。

开启A20功能

在计算机上电时,A20地址线默认是被禁用的,为了切换到32位寻址,必须要先开启A20地址线。开启A20地址线的方法有多种,最常见的是通过操作IO端口92h来控制开启A20地址线。汇编代码如下:

in al, 0x92
or al, 2
out 0x92, al

系统数据准备

为了进入保护模式,必须在模式切换前,准备好必要的系统数据结构,包括全局描述符表GDT、中断描述符表IDT、任务状态段TSS结构以及初始页表结构。

  • 全局描述符表GDT:系统进入保护模式前,必须准备至少一个代码段描述符和数据段描述符,其中GDT的第一项描述符必须为空;
  • 中断描述符表IDT
  • 任务状态段TSS
  • 分页机制:如果希望开启分页机制,则必须准备至少一个页目录项和页表项。

模式切换流程

Intel官方手册描述了从实地址模式切换到保护模式的操作步骤,如下:

  1. 执行CLI指令禁止可屏蔽硬件中断;
  2. 执行LGDT指令将GDT的基地址和长度加载到GDTR;
  3. 执行MOV CR0指令设置CR0控制寄存器的PE标志位,开启保护模式;如果开启分页机制,同时置位PG标志位;
  4. 执行远跳转或远调用指令,切换到保护模式的代码段执行;
  5. 执行LTR指令加载TSS段描述符段选择子;
  6. 重新加载数据段寄存器。对于不使用的数据段寄存器,可以将GDT的第一个空描述符选择子加载到其中;
  7. 执行LIDT指令加载IDT的基地址和长度;
  8. 执行STI指令使能可屏蔽硬件中断

从保护模式切换到长模式

在进入长模式前,处理器依然要提前准备必要的系统数据结构以及配置相关控制寄存器,并且Intel手册要求必须要从保护模式切换到长模式。

系统数据准备

模式切换流程

IA-32e模式的标准初始化步骤如下:

  1. 在保护模式下,执行MOV CR0指令复位CR0寄存器的PG标志位,关闭分页机制;
  2. 置位CR4寄存器的PAE标志位,开启物理地址扩展功能;
  3. 加载页目录的物理基地址到CR3寄存器中;
  4. 置位IA32_EFER寄存器的LME标志位,开启IA-32e模式;
  5. 置位CR0控制寄存器的PG标志位开启分页机制,此时处理器会自动置位IA32_ERER寄存器的LMA标志位。

相关参考

  • 《Intel处理器手册》
  • 《一个64位操作系统的设计与实现》
  • 《x86_64体系结构探索与编程》

浅析Intel处理器体系结构:CPU运行模式相关推荐

  1. linux cpu运行模式,Linux上的32位,64位CPU操作模式

    lscpu告诉您您的架构是i686(Intel 32位CPU),并且您的CPU支持32位和64位操作模式.您将无法安装x64构建的应用程序,因为它们是专门为x64体系结构构建的. 您的特定CPU可以处 ...

  2. centos7查看当前cpu运行模式_杂集:centos7中设置服务开机自启的两种方法,欢迎补充...

    前言: 在日常使用linux系统过程中,安装服务后系统不会自动启动服务的.就算手动启动了服务,只是当前生效,一旦服务器重启后,系统不会自动启动这些服务.如果每次重启服务器都要自己手动启动这些服务,一台 ...

  3. ubuntu 调整cpu运行模式至高性能

    ubuntu下cpu默认运行在节能模式下,会比较慢,通过如下方式进行调整 1.安装cpufrequtils:     sudo apt-get install cpufrequtils 2.查看当前c ...

  4. arm中SP,LR,PC寄存器以及其它所有寄存器以及处理器运行模式介绍

    ARM中所有寄存器都是32位的.这里以cortex-a7内核的MX6ULL处理器为例,按照功能可以分为两类:运行需要寄存器(程序正常运行所需要的,比如变量暂存,pc制作等,总共43个),系统管理控制寄 ...

  5. Cortex-A7 MPCore 架构详细介绍(九种运行模式、内核寄存器组R0~R15,有特定的名字和功能)

    目录 0.ARM架构的历史简介 1.Cortex-A7 MPCore(即多核) 简介 2.Cortex-A 处理器九种运行模式 3.Cortex-A 寄存器组(内核寄存器) 3.1通用寄存器 3.1. ...

  6. ubuntu 查看cpu运行频率_Ubuntu下调整CPU运行频率并对其进行监视

    3.调整cpu频率 代码: sudo cpufreq-selector -f 你所需要的频率 或者 代码: sudo cpufreq-set -f 你所需要的频率 注意,此处的频率必须是以KHz为单位 ...

  7. Intel处理器Family、Model、Stepping等的学习

    本文主要介绍在Linux系统中查看本机CPU信息方法,接着针对intel的x86处理器标识进行概括性描述,包括CPU ID.vendor.Family.Model.Stepping等.这些信息主要来自 ...

  8. 处理器体系结构(了解CPU的基本运行原理)——《深入理解计算机系统》

    处理器体系结构 ISA 一个处理器支持的指令和指令的字节级编码称为它的指令集体系结构ISA. 虽然每个厂商制造的处理器性能和复杂性不断提高,但是不同型号在ISA级别上都保持着兼容.因此,ISA在编译器 ...

  9. Intel 64/x86_64/x86/IA-32处理器操作模式/运行模式

    Processor Operation Mode IA-32架构支持3种操作模式,和一种类操作模式(quasi-operating mode): 实地址模式/实模式(real-address mode ...

最新文章

  1. dump分析工具_iOS逆向分析和注入微信防撤回
  2. iPad2泄密 责任只在“内鬼”吗?
  3. python给多个子图加总标题
  4. 数字图像处理实验四图像频域增强
  5. 微型计算机最怕的是什么,为什么以前学生上“微机课”都要穿鞋套?老师:怕电脑中病毒...
  6. vue部分样式无法修改
  7. 在淘宝买水果短斤缺两是不是成了潜规则?
  8. 各位数字之和——一个神奇的结论
  9. 雷军自述:我十年的程序员生涯
  10. Python之print语句
  11. chrome 开启HEVC硬件解码
  12. FastStone Capture(FSCapture) 注册码
  13. 最新系统分析师考试大纲
  14. Python 九九乘法表打印
  15. 2014新生暑假个人排位赛06 -444. 爱好和平 (数组模拟邻接表+dfs)
  16. 虚拟机IP地址和主机名称配置
  17. 公有云、私有云与混合云到底有什么区别?
  18. c语言判断一个数独是否合法,判断数独是否合法
  19. 计算机辅助英语词汇教学,计算机与网络辅助大学英语词汇教学
  20. MySQL数据库 -- 库和表的操作

热门文章

  1. C/C++学习——函数的定义
  2. 伪类before和after区别
  3. (转)“Word上次启动时失败,以安全模式启动Word....”解决办法
  4. Html的单、双标记标签,编写规范及常用属性标签和网页的常见的状态码
  5. VMware装centos7开机黑屏死机问题
  6. 长期坚持生酮饮食减肥法,增加心脏病风险
  7. 【JS30-Wes Bos】钢琴琴键 01
  8. 网络助手的NABCD分析
  9. 证券交易的量化接口的用途?
  10. 投诉方:Incopro Limited,知识产权名:Arduino