cpu-architecture相关内容

为什么x86-64的jmpq只需要32位长度的地址?

当我使用objdump -D反汇编一个二进制文件时,jmpq的典型代码就像e9 7f fe ff ff,它是用于表示负偏移量.但是,x86-64 的地址是 64(48) 位(据我所知),那么这个 32 位地址如何7f fe ff ff 表示 64 位绝对地址的负偏移量? 另外,是否还有其他指令,如jmp 和jmpq,但有64 位地址位移?我如何在 Intel 或 AMD 的手册中找到说明(我 ..

为什么 x86_64 CPU 上的通用寄存器没有融合乘加?

在 Intel 和 AMD x86_64 处理器上,SIMD 矢量化寄存器具有特定的融合乘加功能,但通用(标量、整数)寄存器不要 - 你基本上需要相乘,然后相加(除非你能把东西放进一个lea). 这是为什么?我的意思是,它是无用的以至于不值得开销吗? 解决方案 整数乘法很常见,但不是整数乘法最常见的事情之一.但是对于浮点数,乘法和加法一直在使用,而 FMA 为大量 ALU 绑定的 F ..

平面地址空间、线性地址、基地址、有效地址计算有什么区别

所有这些东西之间有什么区别:平面地址,基址地址,线性地址,有效地址,物理地址,有效地址计算??? 解决方案 80x86 既有分段又有分页;其中虚拟地址(该软件使用)被转换为物理地址(该硬件如内存控制器)使用.完整转换: 第一个 CPU 确定有效地址/偏移量(例如,对于像“mov eax,[eax+ebx*4+99]"这样的指令,CPU计算结果"eax+ebx*4+99") 然后 ..

(Persistence) 将 Intel 非临时存储排序到同一高速缓存行

非临时存储(例如movnti),到同一线程发出的同一缓存行,是否按程序顺序到达内存? 因此,对于具有 NVRAM 的系统(例如具有英特尔 3D XPoint NVRAM 的英特尔 Cascade Lake 处理器),在发生崩溃时,缺少重新排序保证了写入的 前缀相同的缓存行占优势? 解决方案 假设非临时存储的解析内存类型是 WC(或 WC+),这就是我认为您要问的问题,答案是大多数情况 ..

为什么 X86 中没有 NAND、NOR 和 XNOR 指令?

它们是最简单的“说明"之一.您可以在计算机上执行(它们是我亲自实施的第一个) 执行 NOT(AND(x, y)) 使执行时间和依赖链长度和代码大小加倍 BMI1 引入了“andnot"这是一个有意义的添加,是一个独特的操作 - 为什么不是这个问题标题中的那些? 您通常会在“它们占用宝贵的操作码空间"这几行中阅读答案.但随后我查看了 AVX512 引入的所有 kmask 操作,顺便说一下,其中 ..

为什么在执行指针追逐时这条跳转指令如此昂贵?

我有一个执行指针追踪的程序,我正在尝试优化指针尽可能地追逐循环.我注意到 perf record 检测到函数 myFunction() 中约 20% 的执行时间用于执行跳转指令(用于在特定值后退出循环已阅读). 注意事项: 指针追踪路径可以轻松放入 L1 数据缓存 使用 __builtin_expect 来避免分支错误预测的成本没有明显效果 perf record 有以下输出: ..
发布时间:2021-09-29 19:35:13 其他开发

如何将结构显式加载到 L1d 缓存中?

我的目标是将静态结构加载到 L1D 缓存中.之后使用这些结构成员执行一些操作,并在完成操作后运行 invd 以丢弃所有修改过的缓存行.所以基本上我想使用在缓存内部创建一个安全的环境,以便在缓存内部执行操作时,数据不会泄漏到RAM中. 为此,我有一个内核模块.我在结构的成员上放置了一些固定值.然后我禁用抢占,禁用所有其他 CPU(当前 CPU 除外)的缓存,禁用中断,然后使用 __builti ..
发布时间:2021-09-29 19:34:34 其他开发

指令解码器如何区分前缀和主要操作码之间的区别?

我正在尝试围绕 x86 指令编码格式进行思考.我阅读的所有资料仍然使这个主题变得混乱.我开始有点理解它,但我无法理解的一件事是 CPU 指令解码器如何区分操作码前缀和操作码. 我知道指令的整个格式基本上取决于操作码(当然在操作码中定义了额外的位域).有时指令没有前缀,操作码是第一个字节.解码器怎么知道? 我假设指令解码器能够分辨出差异,因为操作码字节和前缀字节不会共享相同的二进制值.因 ..

为什么需要寄存器(为什么不只使用内存)?

我刚刚开始学习汇编(我曾使用过 c++ 之前). 我想知道为什么除了使用内存还需要使用寄存器,为什么不直接使用内存? 我想最明显的原因是在寄存器中进行计算比在内存中进行计算要快得多.但这是唯一的原因吗? 解决方案 因为 RAM 很慢.很慢. 寄存器位于内部 CPU,紧邻ALU,因此信号几乎可以立即传输.它们也是最快的内存类型,但它们占用大量空间,因此我们只能拥有有限数量的 ..
发布时间:2021-09-29 19:31:00 其他开发

架构和微架构

有人可以大致解释一下处理器架构与其微架构之间的区别以及它们之间的关系吗? 一个应该与其功能部分有关,但另一个我没有看到 解决方案 正式意义上的架构是公开呈现的接口,独立于时序和其他实现细节.微架构包括某些实现细节,通常高于晶体管和工艺技术.例如,ARMv7-A 是一种架构,而 ARM Cortex-A15 是实现 ARMv7-A 的微架构.完全相同的微架构的不同实现将提供周期相同的时 ..
发布时间:2021-09-04 18:31:44 其他开发

为什么使用寄存器R12时POP慢?

在最近的Intel CPU上, POP 指令通常每个周期具有2条指令的吞吐量.但是,当使用寄存器 R12 (或 RSP ,除了前缀之外,具有相同的编码)时,如果指令通过旧式解码器,则吞吐量将下降至每个周期1(如果µops来自DSB,则吞吐量保持在每个周期2个左右). 可以使用 nanoBench 复制如下: sudo ./nanoBench.sh -asm"pop R12"; 在Ha ..

CR8寄存器如何用于对x86-64 CPU中的中断进行优先级排序?

我正在阅读有关控制寄存器的英特尔文档,但仍在努力了解如何使用CR8寄存器.引用文档( 但是与接收中断以查看是否必须阻止该中断相比,CR8中的优先级值是多少? 当中断被阻止时,这意味着什么?是“延迟"到以后,还是只是被丢弃,即丢失了? 解决方案 CR8指示CPU的当前优先级.当中断待处理时,将中断向量号的位7:4与CR8进行比较.如果向量较大,则将对其进行维修,否则将其保持待处理 ..
发布时间:2021-05-16 19:18:58 其他开发

父进程在写时复制期间是否会失去写能力?

假设我们有一个特定的父进程,并在内存中存储了任意数量的数据,然后使用 fork 生成一个子进程.我知道,为了使操作系统能够在写入时执行复制,内存中包含我们正在修改的数据的特定页面将设置其只读位,并且操作系统将使用在子进程尝试时会导致的异常修改数据以将整个页面复制到内存中的另一个区域,以便子代获得其自己的副本.我不明白的是,如果内存中的特定部分被标记为只读,那么数据最初所属的父进程将无法修改数据.那 ..

"soft reset"和"soft reset"之间有什么区别?和“硬重置";在嵌入式领域?

我认为:软重置:从重置向量启动.硬重置:拉出CPU的电气水平. 解决方案 我认为这在芯片之间是非常不同的.硬复位可能被认为是设备上的复位线(引脚,球等),当沿某个方向拉动时,会将部分或全部芯片置于复位状态.软复位可能只是简单的零分支或复位向量分支,也可能是您写的寄存器或导致硬复位的寄存器中的某个位,或者接近硬复位的东西,想象一下芯片内部的一层,硬复位击中外层,软复位击中某些内层,可能不是整 ..
发布时间:2021-05-04 19:02:22 其他开发

缓存一致性-MESI协议

在采用MESI协议(具有l1和l2包含性)的高速缓存中是否可能存在其中l2可以将无效指令发送到l1中已经无效的行的情况. 解决方案 在某些情况下,L2根本不知道L1是否有线路,因为允许L1静默丢弃它. 实际上,如果包含L2,则从L1撤消未修改的线路(容量逐出)时,几乎没有任何理由浪费带宽,因为L2已经具有副本并且没有变化.因此,很可能L2中的许多行在从L1中逐出后仍会停留很长时间.当 ..
发布时间:2021-04-24 21:08:48 其他开发

为什么MIPS使用一个延迟槽而不是两个延迟槽?

在许多RISC体系结构中似乎都是这种情况.由于填充一个延迟时隙可以节省我们50%的浪费时间,为什么不给程序员一个机会使用两个时隙呢? 解决方案 在MIPS R2000上,ISA设计的经典MIPS I 1个分支延迟插槽足以隐藏分支延迟::是真的,如果我们总是可以填充延迟时隙,那么就不需要分支预测吗? Paul Clayton回答是的,在asm中填充分支延迟时隙会使分支预测无效在早期的MIPS ..
发布时间:2021-04-24 21:08:44 其他开发