精华内容
下载资源
问答
  • 寄存器命名
    2021-06-16 16:51:47

    x86 / x86_64架构CPU寄存器名称以及含义

    在学习CSAPP过程中对寄存器的命名方式比较感兴趣,因此在这里总结一下。

    下表代表不同寄存器在不同访存方式下的不同名称,以及他们的名称以及作用

    64-bit quad word32-bit double word16-bit word8-bit bytenamefunction
    %rax%eax%ax%alregister a extendedReturn value
    %rbx%ebx%bx%blregister b extendedCallee saved
    %rcx%ecx%cx%clregister e extended4th argument
    %rdx%edx%dx%dlregister d extended3rd argument
    %rsi%esi%si%silregister source index2nd argument
    %rdi%edi%di%dilregister distination index1st argument
    %rbp%ebp%bp%bplregister base pointerCallee saved
    %rsp%esp%sp%splregister stack pointerStack pointer
    %r8%r8d%r8w%r8bregister 85th argument
    %r9%r9d%r9w%r9bregister 96th argument
    %r10%r10d%r10w%r10bregister 10Caller saved
    %r11%r11d%r11w%r11bregister 11Caller saved
    %r12%r12d%r12w%r12bregister 12Callee saved
    %r13%r13d%r13w%r13bregister 13Callee saved
    %r14%r14d%r14w%r14bregister 14Callee saved
    %r15%r15d%r15w%r15bregister 15Callee saved

    注:

    • Callee: 被调用者
    • Callee-save: 被调用者必须保证这些寄存器的值在调用前后相同

    命名规则:

    • 64-bit: 以r开头
    • 32-bit: 以e开头或以d结尾
    • 16-bit: 无前缀或以w结尾
    • 8-bit:以l为后缀或以b结尾
    更多相关内容
  • 今日在暴啃芯片手册!...今日突然发现一些寄存器缩写命名规律,前来记录并与大家分享! 1. 最常见的缩写方式 如下表: 英文 ( 缩写 ) 描述 read/ write( rw ) 软件能读写此位 read-only ( r

    今日在暴啃芯片手册!其中最令人头疼的就是成百上千的寄存器英文缩写

    在实际学习过程中会发现,很多寄存器会加上三个四个甚至更多的英文缩写字母作为后缀,而其很多时候百度并不一定能查询到全拼!这使得我们在学习过程中对于寄存器的“真名”不得而知,也就一定程度上阻碍了对于寄存器真正用途的理解

    今日突然发现一些寄存器缩写命名规律,前来记录并与大家分享!





    1. 最常见的缩写方式

    如下表:

    英文 ( 缩写 )描述
    read/ write( rw )软件能读写此位
    read-only ( r )软件只能读此位
    write-only ( w )软件只能写此位,读将返回复位值
    read/clear ( rc_w1 )软件可以读此位,也可以通过写’1’清除此位,写’0’对此位无影响
    read / clear ( rc_w0 )软件可以读此位,也可以通过写’0’清除此位,写’1’对此位无影响
    read / clear by read ( rc_r )软件可以读此位;读此位将自动地清除它为’0’,写’0’对此位无影响
    read / set ( rs )软件可以读也可以设置此位,写’0’对此位无影响
    read-only write trigger ( rt_w )软件可以读此位;写’0’或’1’触发一个事件但对此位数值没有影响
    toggle ( t )软件只能通过写’1’来翻转此位,写’0’对此位无影响
    Reserved ( Res. )保留位,必须保持默认值不变

    以上内容可在STM32数据手册内查到




    2. 首字母直接缩写

    这种缩写方式适用于寄存器作用名称有多个单词描述的情况,例如:

    英文缩写描述
    MMS主模式选择 (Master Mode Selection)
    CCDS捕获/比较的DMA选择 (Capture/Compare DMA Selection)
    CCUS捕获/比较控制更新选择 (Capture/Compare Control Update Selection)
    CCPCCCPC:捕获/比较预装载控制位 (Capture/Compare Preloaded Control)



    联想到芯片手册产自国外,原版多是利用英语编写,而英语这样一种拼音文字,歪果仁对音律颇为敏感,因此我产生了一探究竟的想法,有以下发现:


    3. 辅音缩写方式

    我的音标可以说是从小学过整整三遍。。。一年级、三年级、初一,在此为大家拓展一些音标的基础知识:

    音标

    其中辅音又可分为:

    • 爆破音:[p],[b],[t],[d],[k],[g]

    • 摩擦音:[f],[s],[ʃ] ,[θ] ,[h],[v],[z],[ʒ],[ð],[r]

    • 破擦音:[tʃ],[tr],[ts],[dʒ],[dr],[dz]

    • 鼻音: [m],[n],[ŋ]

    • 舌侧音:[l]

    • 半元音:[w],[j]

    在寄存器的后缀缩写中常常出现提取英文单词辅音字母作为缩写的情况!!!

    分为以下三类:

    A. 辅音字母正好有三个

    例1: source - SRC

    source音标 [sɔːrs]

    摩擦音 [s] 和 [r]

    对应字母S和RC

    正好三个字母,直接提出缩写为SRC

    例2: config register - CFGR

    config音标 [kənˈfɪg]

    爆破音 [k],[g]

    摩擦音 [f]

    对应字母CFG

    正好三个字母,直接提出缩写为CFG

    加上寄存器Register的首字母,为CFGR


    例3: Packet count - PKTCNT

    packet音标 [ˈpækɪt]

    爆破音 [p],[k],[t]

    正好三个字母,直接提出为PKT

    count音标 [kaʊnt]

    爆破音 [k],[t]

    鼻音 [n]

    对应字母CNT,直接提出

    最终合成缩写PKTCNT




    B. 辅音字母小于三个

    这种情况下,一般会拖拽一个跟辅音字母紧邻的、共同影响音节的元音字母上来,凑成三个字母的缩写

    例1: ready - RDY

    ready音标 [ˈredi]

    辅音 [r],[d],取RD,不足三个字母

    dy构成第二个音节,取Y过来

    RDY构成三个字母的缩写


    例2: wide bus mode enable - WIDBUS

    wide音标 [waɪd]

    辅音[w],[d]

    取与辅音相邻的元音字母 i 构成三个音节WID

    构成缩写WIDBUS




    C. 辅音字母大于三个

    这种情况下通常会直接选单词的前三个字母来作为缩写

    例1: command argument - CMDARG

    argument 辅音较多,选取前三个字母ARG


    例2: multiplication - MUL

    multiplication 音标 [ˌmʌltɪplɪˈkeɪʃn]

    选取前三个字母MUL




    补充:英文缩写的一种特殊习惯-X

    例如TX和RX的X是什么意思?答案就是没有意思!

    It’s doesn’t stand for anything.


    The X is used to pad out acronyms to make them more acceptable.Los Angeles International Airport uses the code LAXIn theatre, anything lighting related gets called LX (e.g. PVC electrical tape gets called LX tape).Ethernet at Gigabit speeds, using single mode fibre uses the 1000Base-LX standard (the “L” stands for Long Reach)


    For some reason humans don’t seem to like single letter acronyms, so we pad them out to two letters.


    There are some X acronyms, where the X does mean something: FX (special eFeCTs), MX (Mailbox Exchange), RX (RallyCross), etc




    读一方著作,品一语文化,芯片手册亦不例外。

    未能大面积筛选示例,仅取个别分析,但相信一定存在这方面的原因在里面,如有异议或者意见,请及时与我交流!

    展开全文
  • 寄存器名称的演变

    2022-02-11 16:56:03
    新增的寄存器命名规则详见(https://wiki.cdot.senecacollege.ca/wiki/X86_64_Register_and_Instruction_Quick_Start),R15如下图,图片来源(EAX x86 Register: Meaning and History): 其中D、W、B分别代表...

    1972年,Intel推出8008芯片,在此之前Intel还主要是一个生产内存条的厂商。8008本来是为Computer Terminal Corporation (CTC)研发的,但是研发延期了而且也没达到CTC的性能要求,后来Intel和CTC达成协议,8008稍作修改加了几个通用指令投入了市场。8008是一款8位CPU并有14位(16K)地址的访存能力,只能通过寄存器间接寻址来访问内存。8008有七个实体8-bit寄存器ABCDEHL和一个伪寄存器M(M代表内存),指令中有三位用来表示寄存器,从000(A)一直到111(M)。其中A是累加器(accumulator),BCDE四个寄存器功能一致,HL两个寄存器除了像其它寄存器存储数据外还有寄存器寻址的功能,H存放高六位(high-order)的内存地址L存放低八位(high-order)的内存地址,两个寄存器合并起来作伪寄存器M。

    1979年,英特尔已经成为了一家芯片公司,由于旗舰处理器iAPX 432的推迟,权宜之下他们推出了另一款产品iAPX 86,即8086。8086是在8080的基础上改进开发的,而8080又是8008的改进款。为了照顾老用户,8086利用一款简单的汇编翻译软件可以向后兼容8008的软件(source-code compatibility)。为了保证良好的兼容性,8086指令集必须很好的对应8008指令集,因此也继承了很多8008的设计,比如说8-bit寄存器。8086是一款16位CPU,有8个16-bit寄存器寄存器,分别是四个主寄存器AX BX CX DX(其中这四个寄存器每个都可划分为两个8位寄存器,如AX分为AH和AL,这里的X是未知数占位符),四个指针(Pointer)或索引(Index)寄存器SP BP SI DI。详见下面右图,左图是8080的寄存器,图中深色部分表示8080和8086的差异(图片来自Intel Microprocessors: 8008 to 8086:Originally published in IEEE Computer, Vol 13, No. 10, pages 42-60, October 1980 Reprinted in Computer Structures, pages 615-646, Siewiorek/Bell/Newell, 1982)。8086指令中有一位用来标记另外三位寄存器码是访问8-bit寄存器还是16-bit寄存器。

    在8008中BCDE寄存器除了名字不同之外没有功能上的差别,在8086中四个主寄存器被赋予了特殊的功能(字母含义见上图),分别有对应的独属指令操作。8086还引入了段寄存器,内容有点多这里不展开讲。

    1985年,Intel推出了80386处理器,后来被命名为i386(前一代为80286,又称iAPX 286)。这是x86系列的第一款32位处理器,不过由于一些电路问题,这款处理器只能用于16位编程(16 BIT S/W ONLY)。i386中引入了许多新的特性,并且可以向后二进制兼容8086(binary-code compatibility)。主寄存器被扩展到了32-bit,如下图EAX为例,图片来源(EAX x86 Register: Meaning and History)。

    E即Extended。

    故事还没完。x86-64概念在1999年被AMD提出,并于2000年制订和发表了AMD64的细则,在2003年推出了第一款x86-64架构的64位处理器——Opteron,成功逆袭。在x86-64的开发上,Intel “被迫”采用AMD的ISA设计——这套设计原本就是对Intel x86的扩展,并于2004年推出第一款实现Intel64(当时叫EM64T,Extended Memory 64 Technology,Intel64是后来改的名称)的处理器Xeon。AMD64和Intel64指令集在进行系统编程时有细微的差别。还回到AMD64,该处理器在传统模式下,向后兼容8086。在AMD64中,八个主寄存器被扩展到64-bit,如下图RAX为例,图片来源(EAX x86 Register: Meaning and History):

    R即Register,AMD在寄存器的命名上没有继续往后使用字母顺序,而是想简化命名,AMD他们引入了八个新的寄存器,称为R8到R15。AMD原本想将现有八个寄存器的扩展称为R0到R7,但是8086体系的寄存器助记符A、B之类的使用太广泛了,就放弃了这个想法,保留了原有名称,用R代替了E。这也至少与新的R8-R15保持了一定的一致性。新增的寄存器命名规则详见(https://wiki.cdot.senecacollege.ca/wiki/X86_64_Register_and_Instruction_Quick_Start),R15如下图,图片来源(EAX x86 Register: Meaning and History):

    其中D、W、B分别代表double-word, word和byte。

    本文主要参考了http://keleshev.com的博文EAX x86 Register——Meaning and History,在此表示感谢。

    展开全文
  • 寄存器重命名】

    2022-03-26 17:10:05
    1. 寄存器重命名的方式 1. 使用ROB进行寄存器重命名 ROB作为物理寄存器。逻辑寄存器ARF存储所有正确的结果。当一条指令被写到ROB中一个表项的同时,这个表项在ROB中的编号也就成为了这条指令目的寄存器对应的物理...

    1. 寄存器重命名的方式

    1. 使用ROB进行寄存器重命名

    ROB作为物理寄存器。逻辑寄存器ARF存储所有正确的结果。当一条指令被写到ROB中一个表项的同时,这个表项在ROB中的编号也就成为了这条指令目的寄存器对应的物理寄存器。

    需要用重命名映射表mapping table指示每个逻辑寄存器的值是位于ROB还是ARF中。在这里插入图片描述
    一个寄存器在他的生命周期中会有两个存放位置,这对指令操作数读取产生负面影响。实际处理器中,会配合数据捕捉(data-capture)的发射方式,并采用payload RAM存储需要的操作数。

    缺点:

    • ARF和ROB需要较多读端口。
    • 没有目的寄存器的指令也需要ROB表项,浪费物理寄存器(表项中留出空间储存指令结果,大约有1/4不需要物理寄存器)。

    2. ARF扩展进行寄存器重命名

    使用独立存储,存储流水线中指令的结果。

    这个存储称为PRF(physical register file),本质上可以用FIFO实现。仍然需要mapping table。
    在这里插入图片描述

    3. 使用统一的PRF进行寄存器重命名

    将上一种方法的ARF和PRF进行合并,合并后统称为PRF(Physical register file)。在PRF中,没有和指令产生映射关系的寄存器都处于空闲状态,使用空闲列表记录PRF中哪些寄存器处于空闲态。

    当一条指令被寄存器重命名,并且它存在目的寄存器的时候,它就会占据PRF当中的一个寄存器,这个寄存器就处于被占用的状态,处于这个状态的寄存器会经历值没有被计算出来值被计算出来但是没有退休(retire)退休这三个过程,在此过程中,并不需要将寄存器的内容进行搬移,这样便于后续的指令读取操作数。这种寄存器重命名的方法也需要一个重命名映射表,用来存储每个逻辑寄存器和物理寄存器的对应关系。
    在这里插入图片描述
    上图中,Free list用FIFO实现。对于一个4-way的超标量处理器来说,每周期free list最多读、写四个值。这种多端口的FIFO用交叠(interleaving)技术实现。

    一条指令在寄存器重命名的时候,需要对源寄存器和目的寄存器都进行处理,对于源寄存器来说,它会去查找重命名的映射表(mapping table,Intel将其称为RAT),找出它对应的物理寄存器的编号。同时,如果这条指令存在目的寄存器的话,需要为这个目的寄存器指定一个空闲状态的物理寄存器,这需要从空闲列表(Free List)中进行读取。如果此时空闲列表已经空了,那么就表明此时的物理寄存器已经全部被占用,则流水线的重命名阶段及其之前的流水线就要被暂停,直到有指令退休(retire)而释放掉物理寄存器为止(后面会介绍一个物理寄存器何时会变为空闲状态)。指令的目的寄存器会被重命名为空闲列表所提供的物理寄存器,同时这个新的对应关系会更新到RAT当中。

    因为处于推测状态的RAT不能被看到,需要另外一个RAT储存所有retire的指令和物理寄存器的关系。每当指令退休时,它的映射关系会被写到这个RAT中。基于统一PRF进行寄存器重命名的方法,在处理器中需要使用两个RAT配合工作。

    一个物理寄存器被占用之后,何时可以再次变为空闲状态呢?很显然,当一个物理寄存器不再被它后面的指令使用时,这个物理寄存器就可以变为空闲状态了,从理论上来讲,只要最后一条使用这个物理寄存器的指令由于退休而顺利地离开了流水线,这个物理寄存器就可以变为空闲状态。但是,对于一个物理寄存器来说,要识别出最后一次使用它的指令,并不是一件很直接的事情,虽然编译器可以很容易地获得这个信息,但是当今所有的指令集中,都没有地方能够装载这个信息来通知处理器的硬件,所以处理器可以采用一种很简单也很保守的方法,如下图所示。
    在这里插入图片描述
    当一条指令和后面的某条指令都写到同一个目的寄存器时,则后面指令退休时,前面指令对应的物理寄存器就没有用处了。如果一条指令使用了指令a的目的寄存器p1作为源寄存器,那么这条指令位于a和b间,当b退休,以后再也没有指令使用物理寄存器p1作为源寄存器,所以物理寄存器p1变为空闲状态。b后面的指令用逻辑寄存器r1作为源寄存器时,就使用物理寄存器p6。为实现这种功能,在ROB中,除了记录逻辑寄存器当前对应的物理寄存器之外,还需要存储它之前对应的物理寄存器,以便于当指令退休时,将它对应的旧映射关系释放。

    这种方式虽然设计复杂,但有两个优势:

    • 寄存器的值只需要写入一次,不需要再进行移动,前两种方式,寄存器的值第一次写到ROB或PRF中,第二次写到ARF中。
    • 前两种方式寄存器的值移动时,需要将信息通知给流水线中所有将这个寄存器作为操作数的指令。

    2. 重命名映射表

    RAT是一个表格,使用逻辑寄存器作为地址来寻址,对于指令的源寄存器来说,可以从这个表格得到对应的物理寄存器编号。对应指令的目的寄存器来说,会将物理寄存器的编号写到这个表格中。

    这个表格在物理实现层面上,有两种方式,一是基于SRAM(SRAM-Based RAT, sRAT),二是基于CAM(CAM-Based RAT, cRAT)。
    在这里插入图片描述
    逻辑寄存器有32个,使用5位表示,物理寄存器有64个,使用6位表示。sRAT使用SRAM(或者寄存器)作为表格的载体,考虑到每条指令的多个源寄存器和目的寄存器都可以在一周期内寻址它,因此需要使用多端口的SRAM(或寄存器)。表格中,entry的个数等于逻辑寄存器的个数,即32个,每个表项中存放着对应的物理寄存器的编号,sRAT占据的存储空间为32×6bits。

    cRAT也使用逻辑寄存器的编号进行寻址,但是表格载体使用了内容寻址的存储器(CAM),其大小等于物理寄存器的个数,每个表项都存放了逻辑寄存器的编号。在对这个表格寻址时,将逻辑寄存器编号与每个表项中逻辑寄存器编号比较,如果一个entry中存在有效的映射,并且比较结果也相等,则这个表项在cRAT中的地址就是对应的物理寄存器的编号,cRAT占用的存储空间位64×5bits。

    sRAT的访问速度快于cRAT,并且存储空间更小、更节省功耗。但cRAT进行Checkpoint只需保存状态位,不需要将整个cRAT进行保存,减少了Checkpoint电路的面积。

    1. sRAT

    在这里插入图片描述
    对于4-way的超标量处理器来说,每周期最多需要对四条指令进行寄存器重命名。sRAT需要支持8个读端口和4个写端口。为指示哪些物理寄存器时空闲状态的,还需要一个表格(free list)来记录对应关系,因为:

    • 指令退休时,会将它之前对应的物理寄存器变为空闲状态,需要将被覆盖的信息保存起来。
    • 当一条指令存在异常或者分支预测失败的指令时,这条指令对RAT的修改需要恢复过来,旧映射关系可以协助完成RAT修复。

    基于sRAT的寄存器重命名方法中不能使用太多的Checkpoint.

    2. 基于CAM的重命名映射表

    寻址方式和全相联结构的cache一致。
    在这里插入图片描述
    如图,共有四个checkpoint,用来对有效位V进行保存。对于写cRAT来说,并不需要使用CAM的方式进行寻址,直接使用物理寄存器的编号作为地址。cRAT本质上是由CAM+SRAM组成。SRAM部分用来存储每个物理寄存器对应的逻辑寄存器的编号,而CAM部分用来进行内容的比较,每个表项的比较结果都会送到一个encoder中,编码器会结合V,将匹配到的物理寄存器编号输出。

    在这里插入图片描述
    cRAT仍需要使用空闲列表记录哪些物理寄存器是空闲的。需要等到后面写入到同一个逻辑寄存器的指令退休时,才可以将这个逻辑寄存器之前对应的物理寄存器变为空闲状态。正因为如此,cRAT中,并不是物理寄存器对应的有效位是0,就表示这个物理寄存器是空闲状态,有可能是这个映射关系刚刚被覆盖。但是当一个物理寄存器变为空闲状态,V肯定是零。对物理寄存器的空闲状态管理需要使用ROB和空闲列表配合实现。

    每当对cRAT进行checkpoint的时候,(分支指令重命名之前)保存V,分支预测失败时,将这条分支指令对应的checkpoint写回到cRAT的有效位。同时,空闲列表也需要状态恢复,被占用的物理寄存器都将重新变为空闲的状态(通过恢复free list读指针)。

    对cRAT进行状态恢复,就是还原出逻辑寄存器真正对应的物理寄存器。

    3. 超标量处理器的重命名

    以Dest = Src1 op Src2 指令为例:

    1. 找到两个源寄存器对应的物理寄存器:从RAT中找到Src1和Src2对应的物理寄存器Psrc1和Psrc2在这里插入图片描述

    2. 为指令的目的寄存器指定一个物理寄存器:从free list中找到一个空闲的物理寄存器Pdest,将其作为指令的目的寄存器Dest对应的物理寄存器。在这里插入图片描述

    3. 将新的映射关系写道RAT中:将逻辑寄存器Dest和物理寄存器Pdest的映射关系写道RAT中,这样在之后使用Dest作为源寄存器的指令就可以查找到这个映射关系了。在这里插入图片描述
      由上述过程知道,对一条指令进行寄存器重命名时,RAT需要支持两个读端口和一个写端口,同时,为能够将一个物理寄存器释放为空闲状态,还需要将每条指令之前对应的映射关系也保存到ROB中,因此RAT还需要一个额外的读端口,使用指令的目的寄存器作为地址。总的来说,RAT需要三个读端口(src1, src2, dest 作为地址)和一个写端口(dest 作为地址,将空闲列表送出的值作为数据)
      在这里插入图片描述
      需要在超标量处理器的寄存器命名过程中考虑先写后读RAW和先写后写WAW这两种相关性。

    超标量处理器中,重命名阶段的延迟主要来自于多端口SRAM本身的延迟,另一个就是RAW和WAW相关性检查和处理电路引起的延迟。

    1. 解决RAW相关性


    需要对一个周期内进行重命名的所有指令进行RAW相关性的检查,称为组内相关性检查。在寄存器重命名阶段,指令之间还保持着程序中指定的顺序,只需将每条指令的源寄存器编号和它前面所有指令的目的寄存器编号进行比较编号进行比较,如果存在一个相等的项,那么这个源寄存器对应的物理寄存器就不是来自于RAT的输出,而是来自于当前周期从free list输出的对应值。如果存在多个相等的项,那么就使用最新的那条指令所对应的物理寄存器。
    在这里插入图片描述
    在组内相关性检查电路中,需要将每条指令的源寄存器和它之前的所有指令的目的寄存器进行比较,根据比较的结果来控制这个源寄存器的来源。
    请添加图片描述

    2. 解决WAW相关性

    WAW影响着对RAT和ROB的写入过程。

    1. 对写RAT进行检查。
      WAW检查对于每条指令来说,都要将它的目的寄存器和后面所有指令的目的寄存器进行比较,如果发现存在相等的情况,则说明本条指令不应该更新RAT.
      在这里插入图片描述
    2. 对写ROB进行检查
      上面提到为释放掉那些不使用的物理寄存器,同时又可以对处理器的状态进行恢复,每条指令需要从RAT中读出它以前对应的物理寄存器,并写到ROB中,如果一个周期内多条指令存在WAW,那么这条比较新的指令对应的旧物理寄存器就来源于比较旧的指令,而不是来自于RAT.在这里插入图片描述
      RAT本质上是多端口SRAM或多端口寄存器堆,当多端口SRAM的读地址和写地址一样时,要选择读优先模式(Read first mode),使RAT能够读出旧对应关系。

    这也是为什么要需要RAW相关性检查和处理电路的原因,因为是read first而不是write first。

    对于不需要目的寄存器的指令,在解码后加以标记。这些指令不会读取、写入RAT。

    4. 寄存器重命名过程的恢复

    从分支预测失败或者异常中恢复RAT.

    1. 使用Checkpoint (简称为GC, Global Checkpoint )

    GC有两种工作方式:RAGC和SAGC.
    在这里插入图片描述
    SAGC中只有一个GC与主存储部件相连,但造成过长的状态恢复时间。对RAGC,每个GC都和主存储部件相连,但主存储部件负载过大,需要很多缓冲才能保证主存储部件的驱动能力。为快速对处理器中某些部件进行保存和恢复,RAGC是更合适的实现方式。

    对于RAT来说,当不考虑对它实现Checkpoint功能时,它本质上就是一个多端口的SRAM(或多端口的寄存器堆),但是对于一个实现了Checkpoint功能的RAT来说,在SRAM的每个最小的存储单元(Main Bit Cell, MBC)周围都加入同样的存储单元(Checkpoint Bit Cell, CBC),这些存储单元就实现了Checkpoint功能。当需要对RAT进行状态保存时,将MBC的内容复制到指定的CBC中(这个过程也称为Allocation);当对RAT进行状态恢复时,将对应CBC中的内容复制到MBC中(这个过程称为Restore)。这样就可以快速地完成对RAT的状态保存和恢复,这种带有Checkpoint功能的MBC如下图所示。请添加图片描述
    MBC支持多个读写端口。CBC有一个读写端口,它和MBC通过传输门直接相连,同时需要两个控制信号Allocation和Restore,用来控制数据从MBC转移到CBC.

    2. 使用WALK

    checkpoint电路会增加硬件开销。可以用更廉价的方法进行RAT状态的保存和恢复,即使用ROB。ROB存储了每条指令之前对应的物理寄存器,可以将RAT的状态逐步地倒回去,使处在错误路径上的指令对RAT的修改都进行恢复。

    举例来说,当发现一条分支指令预测失败时,使用这条分支指令的编号,将流水线中所有相关的指令都抹掉,同时将流水线暂停,从ROB的底端开始(ROB的最底端对应着最新被放人ROB的指令),逐条地将每条指令之前对应的映射关系写到RAT中,这个过程被形象地称为WALK。通过这种方式,可以把所有更改RAT的指令按照相反的顺序,将RAT进行恢复。由于需要将之前的物理寄存器写回到RAT中,在一个4-way的超标量处理器中,考虑到RAT支持四个写端口,所以采用每周期从ROB中WALK四条指令的方法,可以最大限度地利用这四个写端口,这样经过一段时间之后(具体的时间根据需要恢复的指令个数来决定),RAT就可以恢复到需要的状态,此时就可以继续从正确的地址开始取指令了。很显然,使用WALK的方法对RAT进行恢复是比较慢的,它首先需要对流水线中的指令有选择地进行抹掉,同时还需要逐个指令地进行恢复,需要消耗很多的时间。对于分支指令来说,这会增大分支预测失败时的惩罚(penalty),但是对于异常(exception)发生时处理器的状态恢复,则不需要对流水线有选择地进行抹掉这个过程,因为在超标量处理器中,异常的处理需要等到这条指令变为流水线中最旧的指令时才进行,此时流水线中全部的指令都需要被抹掉了。

    总体来看,虽然这种WALK的方法在速度上会慢一些,但是它的优点是消耗的硬件资源比较少,因此在一些处理器中使用这种方法来对异常发生时的处理器进行状态恢复,因为异常发生的频率相对于分支预测失败(mis-prediction)是比较低的,因此使用这种相对比较慢的方法也是可以接受的,而用比较快的Checkpoint方法对分支预测失败时的处理器进行状态恢复。

    3. 使用Architecture State

    当需要从处理器外部访问一个逻辑寄存器时,直接使用重命名阶段的RAT很难做到,因为它处在speculative状态,因此一般在流水线的commit阶段也使用一个RAT,正确离开流水线的指令会更新这个RAT(称为 aRAT,architecture RAT)。如果直接查找寄存器重命名阶段的RAT,得到的只是处于speculative状态的物理寄存器。在这里插入图片描述
    利用aRAT也可以对寄存器重命名阶段使用的RAT进行恢复。

    举例来说,当在流水线的执行阶段发现分支指令预测失败(mis-prediction)时,并不马上进行RAT状态的恢复,而是让处理器继续执行,当这条分支预测失败的分支指令变成流水线中最旧的指令时,此时的aRAT即表示了分支指令所对应的正确状态的RAT。因为此时,在分支指令之前进人到流水线中的所有指令都已经顺利地离开了流水线,并且更新了处理器的状态,而该分支指令后面所有的指令都没有在aRAT中留下痕迹,此时,可以将aRAT的内容复制到重命名阶段的RAT中,这样就完成了分支预测失败时对RAT的恢复。因为重命名阶段使用的RAT和aRAT的结构是一模一样的,那么这样的复制工作是相对简单的,只需要在物理层面上将两个RAT的位单元(Bit cell)之间架起一个直连的通道,通过相应的信号进行控制,就可以将aRAT的内容在一个周期之内复制到重命名阶段的RAT当中,这和前文中讲述的Checkpoint的方法是一样的。其实,这种方法对其他两种寄存器重命名的方式也是适用的,等到分支指令退休(retire)的时候,此时的ARF就处在正确的状态,可以将RAT中所有的逻辑寄存器都指向ARF,就完成了对RAT的状态恢复。

    但是,当在流水线的执行阶段发现了分支预测失败时,可能在流水线中还存在很多指令先于这条分支指令进人流水线,如果这些指令中存在D-Cache缺失的load指令,那么这条分支指令可能需要等待一段时间才可以等到这些指令全部顺利地离开流水线,这会导致分支预测失败时的惩罚(penalty)变大,一定程度上影响了处理器执行的效率。

    在超标量处理器的流水线中,那些先于分支指令进人到流水线的指令中,如果有指令发生了异常(exception),例如TLB缺失、Page Fault等,那么处理器需要对这些异常进行处理,此时需要等到这条发生异常的指令变为流水线中最旧的指令时,将流水线中全部的指令进行抹掉,并跳转到对应的异常处理程序中,这样,那条预测失败的分支指令并不会被处理,因为它从流水线中被抹掉了,不可能退休(retire)。这也是等到分支指令变为流水线中最旧的指令的时候,才对RAT进行状态恢复的一个好处,如果在一条分支指令之前存在异常或者另一个分支预测失败,那么即使这条分支指令发生了分支预测失败,它也不会被处理,而是会从流水线中被抹掉,这样就避免了做无用功,在一定程度上可以节约处理器的功耗。

    5. 分发

    经过寄存器重命名后,进入流水线分发阶段。分发(Dispatch)阶段是顺序执行和乱序执行的分界点。分发阶段经过寄存器重命名之后的指令会被写到流水线的很多缓存中。具体可分为三大类的缓存:

    1. 发射队列(Issue Queue )(out-of-order ),大部分的功能单元(FU)都可以按照乱序的方式来执行指令,指令在送到FU中被执行之前,先被放到一个缓存中,这个缓存是发射队列,每个FU都对应着一个发射队列(先假设如此),当指令被放到这个缓存中的时候,它的操作数可能还没有完全准备好,那么它就在这个缓存中等待,只要一条指令的所有源操作数都准备好了,就可以将其送到FU中执行,而不用理会这条指令在程序中原始的顺序。超标量处理器正是依靠这种方式来获得比较高的性能,这需要发射队列可以支持这种乱序发射指令的特性。不仅如此,在一个4-way的超标量处理器中,每周期最多可以有四条指令被写到这个缓存中,这需要从其中找出四个空闲的表项(entry ),由于乱序执行的特性,缓存中空闲表项的分布是没有规律的,从其中找出四个空闲的表项并不是一件容易的事情,需要在设计中进行权衡,这部分内容将在后文介绍。

    2. 发射队列(( IssueQueue )(in-order ),即使在乱序执行的超标量处理器中,仍旧有部分指令是按照程序中指定的顺序来执行的,例如分支指令和store 指令,这些指令如果按照乱序的方式执行,会带来不菲的硬件消耗,而且在性能上也不会带来本质的提高,因此对这些指令一般采取顺序的方式来执行,容纳这些指令的发射队列本质上就是FIFO,通过调整写指针就可以从中找到空闲的空间,将重命名之后的指令放到其中,因此完全可以用之前讲过的交叠(interleaving )方式来实现这种FFO。

    3. 重排序缓存(ROB),这个部件可以将乱序执行的指令拉回程序中指定的原始顺序,指令经过寄存器重命名之后,按照程序中指定的顺序写到重排序缓存中,同时在重排序缓存中还会记录下指令在执行过程中的一些状态,例如是否产生异常等信息,即使有些指令很早就计算完成了,但是它必须等到重排序缓存中在它前面(也就是比它更旧)的所有指令都离开了(也就是退休),才会允许这条指令改变处理器的状态(这称为Architecture State )。重排序缓存本质上也是FIFO,通过调整写指针就可以找到空闲的空间,将指令写到其中。

    总结来说,流水线的分发(Dispatch )阶段就是将寄存器重命名之后的指令写到发射队列(( IssueQueue )和重排序缓存(ROB)的过程,指令到达发射队列之后,就可以按照乱序的方式执行了,通过重排序缓存将这些指令再变回到程序中指定的顺序。分发阶段可以和寄存器重命名阶段放在一个周期内完成,但是当发射队列和重排序缓存的容量比较大时,向它们当中写入东西会变得很慢,这样会严重影响处理器的周期时间,因此很多处理器都会为分发阶段单独使用一个流水段,从功能上来看,分发阶段可以称得上是超标量处理器的流水线中最轻松的一级了。

    展开全文
  • 给IDA中的寄存器变量命名的技巧

    千次阅读 2016-08-30 23:10:30
    前言release版中, 尽最大可能使用寄存器变量. 如果一个寄存器变量在一段程序中, 在前10行是一个含义, 在后10行是另外一个含义, 看起来很头痛. 今天看了IDA中改名的UI上有参数可以指定改名的地址范围, 正好解决了这...
  • 对于嵌入式开发者来说,了解汇编语言和内核寄存器是对内核深入理解的基础,本文对 ARM内核寄存器 和 基本汇编语言进行了简单的介绍
  • 汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符代替机器指令的操作码,用地址符号或标号...计算机寄存器分类简介:32位C...
  • 51教程(5)-定时器及其寄存器介绍

    千次阅读 2021-07-05 22:06:25
    } Name可自定义,但是新手建议使用中断名进行命名,防止记混中断号造成编写错误,中断号分别为:INT0-0 T0-1 INT1-2 T1-3,using n 是指定工作寄存器区域用的,省略及默认分配,新手可省略。 05 定时器相关寄存器的...
  • tinyriscv这个SoC工程的内核cpu部分,采用经典的三级流水线结构进行设计,即大家所...如下图,绿色的方块是通用寄存器reg,从位置上可以看出,通用寄存器在功能上,主要承担译码和执行部分的临时数据存储: 2.R...
  • 1. _DR —————数据寄存器(Data Register) 2. _IDR —————独立数据寄存器(Independent Data Register) 3. _CR —————控制寄存器(Control Register) 4. _SR —————状态寄存器(Status ...
  • ARM64/32寄存器说明

    2021-05-21 18:48:21
    x9~x15:临时寄存器,也叫可变寄存器,子程序使用时不需要保存。 x16~x17:子程序内部调用寄存器(IPx),使用时不需要保存,尽量不要使用。 x18:平台寄存器,它的使用与平台相关,尽量不要使用。 x19~x28:临时...
  • 寄存器命名 APCS 对我们通常称为 R0 到 R14 的寄存器起了不同的名字。使用汇编器预处理器的功能,你可以定义 R0 等名字,但在你修改其他人写的代码的时候,最好还是学习使用 APCS 名字。 ...
  • 64位寄存器与汇编

    千次阅读 2018-05-05 10:22:44
    e开头的寄存器命名依然可以直接运用于相应寄存器的低32位。而剩下的寄存器名则是从r8 - r15,其低位分别用d,w,b指定长度。32位使用栈帧来作为传递的参数的保存位置,而64位使用寄存器,分别用rdi,rsi,rdx,rcx,r8,r....
  • IA32寄存器简介

    2012-09-04 21:27:22
    intel IA32寄存器简介 IA32 作为 80x86 系列中的一员,必须保证向后兼容,也就是说,既要支持 16 位的处 理器,也要支持 32 位的处理器。 在 8086 中,所有的寄存器都是 16 位的,下面我们来看一 下 IA32 中寄存器有...
  • 单片机的程序编制主要是操作寄存器,而STM32功能更多,对应的寄存器也多,为了更好的管理和使用好寄存器,需要将这些寄存器进行管理和分配。以GPIOA为例;因为 GPIO 都是挂在 APB2 总线之上,所以它的基地址是由 APB...
  • x86寄存器说明

    2018-04-06 13:59:15
    ebp和esp是32位的SP,BP esp是堆栈指针 ebp是基址指针 ESP与SP的关系就象AX与AL,AH的关系.32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX) 2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP...
  • 寄存器UART

    千次阅读 2013-09-20 15:15:49
    寄存器有11X3个(3个UART)之多,我们选最简单的方法来进行本实验,用到的寄存器也有8个。不过初始化就用去了5个寄存器,剩下的3个用于接收、发送数据。如此一来,操作UART倒也不复杂。本板使用UART0: 1)  ...
  • 单片机芯片命名规则

    2011-10-08 21:27:30
    很详细的单片机芯片命名规则,包括了芯片公司·芯片温度范围·芯片封装形式·芯片重要技术参数等
  • 寄存器电路

    2021-07-28 06:44:41
    在数字电路系统工作过程中,把正在处理的二进制数据或代码暂时存储起来的操作叫做寄存,寄存器电路就是实现寄存功能的电路,是数字逻辑电路的基础模块。[1]中文名寄存器电路外文名register circuit拼音jì cún qì ...
  • 初始STM32-寄存器编程

    2021-01-06 08:17:13
    学习方法和路径2.STM32命名方法3.STM32F10xx系统框图4.STM32的寄存器编程5.STM32的寄存器映射6.STM32 GPIO的配置7.实践:使用寄存器点亮LED灯后记 什么是STM32 STM32,可以说是51单片机的学习旅途的下一个升级版,从...
  • 2. X64架构的寄存器结构 2.1 通用目的寄存器 2.2浮点数寄存器 2.3指令指针寄存器 2.4段寄存器 2.5标识寄存器 2.6控制寄存器 2.6.1控制寄存器CR0 2.6.2控制寄存器CR2 2.6.3控制寄存器CR3 2.6.4控制寄存器CR...
  • 深入了解CPU结构——寄存器

    千次阅读 2013-02-27 16:51:02
    1.什么是寄存器    所谓寄存器(register),它是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。其实寄存器就是一种常用的时序逻辑电路,但这种时序逻辑电路只包含存储电路。...
  • 文章目录一、通用寄存器(GPR)二、EFLAGS寄存器(标志寄存器)三、指令指针寄存器(EIP)四、段寄存器(Segment Register) 通用寄存器(General Purpose Registers,32位,8个) 段寄存器(Segment Registers,16...
  • 通用寄存器

    2021-07-28 06:43:31
    通用寄存器可用于传送和暂存数据,也可参与算术逻辑运算,并保存运算结果。除此之外,它们还各自具有一些特殊功能。汇编语言程序员必须熟悉每个寄存器的一般用途和特殊用途,只有这样,才能在程序中做到正确、合理地...
  • 上一部分我们学习了简单的组合电路,这一部分介绍时序电路,与组合电路相比多了时序和状态,但也相比来说也并不是很难的东西。...因此,我们必须深刻理解时序,这一篇文章我们就从最基本的寄存器开始。
  • 注意 RA0~RA5 这些口 RA端口的方向控制寄存器:TRISA(三态,tristate) TRISA 寄存器占用一个字节(8位),每位代表一个引脚的方向:0表示输出模式(Out),1表示输入模式(In) U-0 U-0 R/W-1/1 R/W-1/1 R-1/1 R-1/...
  • 什么是通用寄存器

    千次阅读 2021-12-24 16:57:02
    通用寄存器:这类寄存器在处理器中数量较多、使用频度较高,具有多种用途。...8086 处理器的 8 个 16 位通用寄存器,分别被命名为:AX、BX、CX、DX、SI、DI、BP和SP。其中前4个通用寄存器AX、BX、CX和DX还可以进一
  • 寄存器

    2021-04-22 11:47:59
    首先介绍我们会经常看到的一些寄存器: ...这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。 4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH
  • Linux详解寄存器

    千次阅读 2022-04-19 22:03:39
    8个寄存器分别被命名为 AH、BH、CH、DH 和 AL、 BL、CL、DL。对8位或16位寄存器的操作只影响相应的寄存器。 段寄存器 8086中有4个16 位的段寄存器。 CS 代码段寄存器 DS 数据段寄存器 SS 堆栈段寄存器 ES、FS 及 GS...
  • Vim中的寄存器

    2022-03-01 22:41:33
    VIM的寄存器 Vim操作的是寄存器而不是系统剪贴来存储缓存。 普通模式下,从某个特定的寄存器中读取文本的通用语法是"x,其中x是寄存器的标志。 默认使用修改c或d删除或y复制的内容都放到了"匿名寄存器"。比如用x...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 50,928
精华内容 20,371
关键字:

寄存器命名