0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

45个寄存器、CPU核心技术大揭秘(上)

jf_78858299 来源:编程技术宇宙 作者:轩辕之风O 2023-04-03 14:35 次阅读

寄存器这个太多太复杂,不适合写故事,拖了很久,总算是写完了,这篇文章就来详细聊聊x86/x64架构CPU中那些纷繁复杂的寄存器们。

长文预警,时速较快,请系好安全带~起飞~

自1946年冯·诺伊曼领导下诞生的世界上第一台通用电子计算机ENIAC至今,计算机技术已经发展了七十多载。

从当初专用于数学计算的庞然大物,到后来大型机服务器时代,从个人微机技术蓬勃发展,到互联网浪潮席卷全球,再到移动互联网、云计算日新月异的当下,计算机变的形态各异,无处不在。

这七十多年中,出现了数不清的编程语言,通过这些编程语言,又开发了无数的应用程序。

可无论什么样的应用程序,什么样的编程语言,最终的程序逻辑都是要交付给CPU去执行实现的(当然这里有些不严谨,除了CPU,还有协处理器GPU等等)。所以了解和学习CPU的原理都是对计算机基础知识的夯实大有裨益。

在七十多年的漫长历程中,也涌现了不少架构的CPU。

  • MIPS
  • PowerPC
  • x86/x64
  • IA64
  • ARM
  • ······

这篇文章就以市场应用最为广泛的x86-x64架构为目标,通过学习了解它内部的100个寄存器功能作用,来串联阐述CPU底层工作原理

通过这篇文章,你将了解到:

  • CPU指令执行原理
  • 内存寻址技术
  • 软件调试技术原理
  • 中断与异常处理
  • 系统调用
  • CPU多任务技术

什么是寄存器?

寄存器是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果以及一些CPU运行需要的信息

x86架构CPU走的是复杂指令集(CISC) 路线,提供了丰富的指令来实现强大的功能,与此同时也提供了大量寄存器来辅助功能实现。这篇文章将覆盖下面这些寄存器:

  • 通用寄存器
  • 标志寄存器
  • 指令寄存器
  • 段寄存器
  • 控制寄存器
  • 调试寄存器
  • 描述符寄存器
  • 任务寄存器
  • MSR寄存器

通用寄存器

首当其冲的是通用寄存器,这些的寄存器是程序执行代码最最常用,也最最基础的寄存器,程序执行过程中,绝大部分时间都是在操作这些寄存器来实现指令功能。

所谓通用,即这些寄存器CPU没有特殊的用途,交给应用程序“随意”使用。注意,这个随意,我打了引号,对于有些寄存器,CPU有一些潜规则,用的时候要注意。

  • eax : 通常用来执行加法,函数调用的返回值一般也放在这里面
  • ebx : 数据存取
  • ecx : 通常用来作为计数器,比如for循环
  • edx : 读写I/O端口时,edx用来存放端口号
  • esp : 栈顶指针,指向栈的顶部
  • ebp : 栈底指针,指向栈的底部,通常用ebp+偏移量的形式来定位函数存放在栈中的局部变量
  • esi : 字符串操作时,用于存放数据源的地址
  • edi : 字符串操作时,用于存放目的地址的,和esi两个经常搭配一起使用,执行字符串的复制等操作

在x64架构中,上面的通用寄存器都扩展成为64位版本,名字也进行了升级。当然,为了兼容32位模式程序,使用上面的名字仍然是可以访问的,相当于访问64位寄存器的低32位。

rax rbx rcx rdx rsp rbp rsi rdi

除了扩展原来存在的通用寄存器,x64架构还引入了8个新的通用寄存器:

r8-r15

在原来32位时代,函数调用时,那个时候通用寄存器少,参数绝大多数时候是通过线程的栈来进行传递(当然也有使用寄存器传递的,比如著名的C++ this指针使用ecx寄存器传递,不过能用的寄存器毕竟不多)。

进入x64时代,寄存器资源富裕了,参数传递绝大多数都是用寄存器来传了。寄存器传参的好处是速度快,减少了对内存的读写次数。

当然,具体使用栈还是用寄存器传参数,这个不是编程语言决定的,而是编译器在编译生成CPU指令时决定的,如果编译器非要在x64架构CPU上使用线程栈来传参那也不是不行,这个对高级语言是无感知的。

标志寄存器

标志寄存器,里面有众多标记位,记录了CPU执行指令过程中的一系列状态,这些标志大都由CPU自动设置和修改:

  • CF 进位标志
  • PF 奇偶标志
  • ZF 零标志
  • SF 符号标志
  • OF 补码溢出标志
  • TF 跟踪标志
  • IF 中断标志 ······

图片

在x64架构下,原来的eflags寄存器升级为64位的rflags,不过其高32位并没有新增什么功能,保留为将来使用。

指令寄存器

eip : 指令寄存器可以说是CPU中最最重要的寄存器了,它指向了下一条要执行的指令所存放的地址,CPU的工作其实就是不断取出它指向的指令,然后执行这条指令,同时指令寄存器继续指向下面一条指令,如此不断重复,这就是CPU工作的基本日常。

而在漏洞攻击中,黑客想尽办法费尽心机都想要修改指令寄存器的地址,从而能够执行恶意代码。

同样的,在x64架构下,32位的eip升级为64位的rip寄存器。

段寄存器

段寄存器与CPU的内存寻址技术紧密相关。

早在16位的8086CPU时代,内存资源宝贵,CPU使用分段式内存寻址技术:

图片

16位的寄存器能寻址的范围是64KB,通过引入段的概念,将内存空间划分为不同的区域:分段,通过段基址+段内偏移段方式来寻址。

这样一来,段的基地址保存在哪里呢?8086CPU专门设置了几个段寄存器用来保存段的基地址,这就是段寄存器段的由来。

段寄存器也是16位的。

段寄存器有下面6个,前面4个是早期16位模式就引入了,到了32位时代,又新增了fs和gs两个段寄存器。

  • cs : 代码段
  • ds : 数据段
  • ss : 栈段
  • es : 扩展段
  • fs : 数据段
  • gs : 数据段

段寄存器里面存储的内容与CPU当前工作的内存寻址模式紧密相关。

当CPU处于16位实地址模式下时,段寄存器存储段的基地址,寻址时,将段寄存器内容左移4位(乘以16)得到段基地址+段内偏移得到最终的地址。

当CPU工作于保护模式下,段寄存器存储的内容不再是段基址了,此时的段寄存器中存放的是 段选择子 ,用来指示当前这个段寄存器“指向”的是哪个分段。

注意我这里的指向打了引号,段寄存器中存储的并不是内存段的直接地址,而是段选择子,它的结构如下:

图片

16个bit长度的段寄存器内容划分了三个字段:

  • PRL : 特权请求级,就是我们常说的ring0-ring3四个特权级。
  • TI : 0表示用的是全局描述符表GDT,1表示使用的是局部描述符表LDT。
  • Index : 这是一个表格中表项的索引值,这个表格叫 内存描述符表 ,它的每一个表项都描述了一个内存分段。

这里提到了两个表,全局描述符表GDT和局部描述符表LDT,关于这两个表的介绍,下面介绍描述符寄存器时再详述,这里只需要知道,这是CPU支持分段式内存管理需要的表格,放在内存中,表格中的每一项都是一个描述符,记录了一个内存分段的信息。

保护模式下的段寄存器和段描述符到最后的内存分段,通过下图的方式联系在一起:

图片

通用寄存器、段寄存器、标志寄存器、指令寄存器,这四组寄存器共同构成了一个基本的指令执行环境,一个线程的上下文也基本上就是这些寄存器,在执行线程切换的时候,就是修改它们的内容。

图片

控制寄存器

控制寄存器是CPU中一组相当重要的寄存器,我们知道eflags寄存器记录了当前运行线程的一系列关键信息。

那CPU运行过程中自身的一些关键信息保存在哪里呢?答案是控制寄存器!

图片

32位CPU总共有cr0-cr4共5个控制寄存器,64位增加了cr8。他们各自有不同的功能,但都存储了CPU工作时的重要信息:

  • cr0 : 存储了CPU控制标记和工作状态
  • cr1 : 保留未使用
  • cr2 : 页错误出现时保存导致出错的地址
  • cr3 : 存储了当前进程的虚拟地址空间的重要信息——页目录地址
  • cr4 : 也存储了CPU工作相关以及当前人任务的一些信息
  • cr8 : 64位新增扩展使用 其中,CR0尤其重要,它包含了太多重要的CPU信息。

一些重要的标记位含义如下:

PG: 是否启用内存分页

AM: 是否启用内存对齐自动检查

WP: 是否开启内存写保护,若开启,对只读页面尝试写入时将触发异常,这一机制常常被用来实现写时复制功能

PE: 是否开启保护模式

除了CR0,另一个值得关注的寄存器是CR3,它保存了当前进程所使用的虚拟地址空间的页目录地址,可以说是整个虚拟地址翻译中的顶级指挥棒,在进程空间切换的时候,CR3也将同步切换。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5037

    浏览量

    117763
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10451

    浏览量

    206580
  • X86
    X86
    +关注

    关注

    5

    文章

    285

    浏览量

    43000
  • X64
    X64
    +关注

    关注

    0

    文章

    5

    浏览量

    7788
收藏 人收藏

    评论

    相关推荐

    解析CPU中的寄存器

    8位寄存器在16位寄存器中,而16位寄存器在32位寄存器中。
    发表于 09-19 10:10 2914次阅读

    佳灵变频故障与维修核心技术

    佳灵变频故障与维修核心技术
    发表于 08-05 20:55

    蓝牙核心技术概述

    蓝牙核心技术概述(一):蓝牙概述蓝牙核心技术概述(二):蓝牙使用场景蓝牙核心技术概述(三): 蓝牙协议规范(射频、基带链路控制、链路管理)蓝牙核心技术概述(四):蓝牙协议规范(HCI、
    发表于 11-24 16:06

    嵌入式开发领域主要有哪几种核心技术

    在嵌入式开发领域,主要有三种核心技术:处理技术、 IC 技术、设计/ 验证技术处理器技术 :(
    发表于 11-08 06:43

    CPU核心技术

    CPU核心技术           核心(Die)又称为内核,是CPU最重要的组
    发表于 12-18 09:54 1254次阅读

    寄存器,寄存器是什么意思

    寄存器,寄存器是什么意思 寄存器定义  寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用
    发表于 03-08 14:26 2.1w次阅读

    寄存器组网络处理器上的寄存器分配技术

    本内容提供了多寄存器组网络处理器上的寄存器分配技术
    发表于 06-28 15:26 28次下载
    多<b class='flag-5'>寄存器</b>组网络处理器上的<b class='flag-5'>寄存器</b>分配<b class='flag-5'>技术</b>

    通过了解寄存器的功能与作用去揭秘CPU核心技术

    这篇文章就以市场应用最为广泛的x86-x64架构为目标,通过学习了解它内部的100个寄存器功能作用,来串联阐述CPU底层工作原理。
    的头像 发表于 04-27 14:32 4247次阅读
    通过了解<b class='flag-5'>寄存器</b>的功能与作用去<b class='flag-5'>揭秘</b><b class='flag-5'>CPU</b><b class='flag-5'>核心技术</b>

    如何使用ALU,RAM,寄存器打造一个CPU 1

    CPU简介 **「计算机的心脏是中央处理单元,简称“CPU”」** 。这篇文章就利用前几篇文章中提到过的ALU,RAM,寄存器组件做一个CPU
    的头像 发表于 01-30 15:56 578次阅读

    如何使用ALU,RAM,寄存器打造一个CPU 2

    CPU简介 **「计算机的心脏是中央处理单元,简称“CPU”」** 。这篇文章就利用前几篇文章中提到过的ALU,RAM,寄存器组件做一个CPU
    的头像 发表于 01-30 15:56 533次阅读
    如何使用ALU,RAM,<b class='flag-5'>寄存器</b>打造一个<b class='flag-5'>CPU</b> 2

    cpu寄存器和存储器的区别

    cpu寄存器和存储器的区别 寄存器存在于CPU中,速度很快,数目有限;存储器是内存,速度稍慢,但数量很大。寄存器的功能是存储二进制代码,是由
    发表于 03-21 15:12 954次阅读

    45寄存器CPU核心技术揭秘(下)

    寄存器这个太多太复杂,不适合写故事,拖了很久,总算是写完了,这篇文章就来详细聊聊x86/x64架构的CPU中那些纷繁复杂的寄存器们。
    的头像 发表于 04-03 14:36 1395次阅读
    <b class='flag-5'>45</b>个<b class='flag-5'>寄存器</b>、<b class='flag-5'>CPU</b><b class='flag-5'>核心技术</b>大<b class='flag-5'>揭秘</b>(下)

    怎样通过改变寄存器中的内容实现对CPU的控制呢?

    寄存器CPU中程序员可以用指令读写的部件,通过改变寄存器中的内容实现对CPU的控制。
    的头像 发表于 09-20 15:49 782次阅读
    怎样通过改变<b class='flag-5'>寄存器</b>中的内容实现对<b class='flag-5'>CPU</b>的控制呢?

    CPU的6个主要寄存器

    CPU寄存器是中央处理器内的组成部分,是有限存贮容量的高速存贮部件。寄存器CPU内部的元件,包括通用寄存器、专用
    的头像 发表于 02-03 15:15 1140次阅读

    干货满满:ARM的内核寄存器讲解

    内核寄存器与外设寄存器: 内核寄存器与外设寄存器是完全不同的概念。内核寄存器是指 CPU 内部的
    发表于 04-17 11:47 168次阅读
    干货满满:ARM的内核<b class='flag-5'>寄存器</b>讲解