Sushi Roll:CPU内核研讨 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

Sushi Roll:CPU内核研讨

申博_新闻事件 申博 34次浏览 未收录 0个评论

checkm8:Bootrom史诗级漏洞,可永久越狱iPhone

9月27日,iOS研究人员@axi0mX在twitter上发布了名为checkm8的新iOS漏洞利用工具,影响大量iPhone和iPad硬件设备。根据推文内容,该漏洞利用是一个永久的bootrom漏洞利用,影响iPhone 4S(A5芯片)到iPhone X(A11芯片)的所有设备。 Bootrom Bootrom是什么呢?Bootrom是含有系统启动时的最初代码的只读内存芯片。因为bootrom代码是设备启动过程的核心部分,而且无法修改,因此如果其中存在漏洞,那么就可以利用该漏洞对设备进行劫持。 安全研究人员@axi0mX称在bootrom中发现了漏洞,而

在本文中,我们将细致引见一个新开辟的CPU内核——Sushi Roll。该内核运用多种立异手艺来丈量Intel微架构上未定义的行动。Sushi Roll丈量时发作的噪音异常小,如许就能够丈量细小的微构造事宜,比方展望实行和缓存一致性行动。经由历程创造性地运用机能计数器,我们能够准确地在一个轮回周期中绘制微架构运动。

本文将分为2部份:

1.当代英特尔微架构的诠释;

2.Sushi Roll:低噪声的设想;

在过去的一年里,我们花了相称多的时候来研讨CPU破绽,并为险些每一个CPU破绽编写了观点考证破绽。

当前许多CPU研讨都是基于编写代码片断并检察它的团体副作用(经由历程缓存计时、机能计数器等丈量)。这些团体副作用还能够包括来自其他处置惩罚器运动的噪音、来自OS使命切换历程的噪音等,你能够点此检察当代英特尔Skylake处置惩罚器的微构造。

该构造重要有3个组件:前端,它将庞杂的x86指令转换为一组微操纵。实行引擎,它实行微操纵。以及内存子体系,它确保处置惩罚器能够取得指令流和数据流。

前端

前端险些涵盖了与肯定哪些微操纵(uops)须要被分派到实行引擎以完成使命相干的一切内容。当代Intel处置惩罚器上的实行引擎并不直接实行x86指令,而是将这些指令转换为牢固大小且特定于处置惩罚器微架构的微操纵。

指令猎取和缓存

在现实实行指令之前会发作许多事变,起首,将包括指令的内存读入L1指令缓存,抱负情况下是从L2缓存中引入,以最小化耽误。不过此时,该指令依然是一个宏操纵(一个可变长度的x86指令),这是一个相称贫苦的事情。处置惩罚器依然不晓得指令有多大,因而在预解码时期,处置惩罚器将实行初始长度解码来肯定指令边境。

此时,指令大小已被肯定,能够进入指令行列了!

指令行列和宏融会

实行的指令能够异常简朴,而且能够被“融会”到一个庞杂的操纵中。这个阶段没有公然的参考文档,然则我们晓得一个异常罕见的融会是将比较指令与前提分支结合起来,如所示,就是一个罕见的指令。

cmp rax, 5
jne .offset

将其组合成具有雷同语义的单个宏操纵,这类庞杂的融会操纵如今只占用CPU管道的许多部份中的一个插槽,而从将更多的资本释放给其他操纵。

解码

指令解码是x86宏操纵转换为微操纵的处所,这些微操纵体系因uArch的差别而有很大的差别,而且许可Intel按期地转变处置惩罚器的基本原理,而不会影响与x86架构的向后兼容性。在解码器中,可变长度宏操纵被转换为牢固长度的微操纵。这类转换发作的体式格局有许多,比方指令能够直接转换为uops,这是大多数x86指令的通用途径。但是,一些指令以至处置惩罚器,能够会致使所谓的微代码被实行。

微码

运用x86中的一些指令触发微代码,微代码现实上是uops的一个小鸠合,它将在特定的前提下实行。你能够把它设想成一个C/ c++宏,在这个宏中,你能够用一行代码来扩大更多的内容。当一个操纵实行一些须要微代码的操纵时,将接见微代码ROM并将其指定的uops放入管道中。这些平常是庞杂的操纵,比方切换操纵形式、读取/写入内部CPU寄存器等,这个微码ROM还使英特尔有时机完整运用微代码补丁来转变指令行动。

微指令缓存

另有一个uop缓存,它许可先前解码的指令跳过悉数预解码和解码历程。与规范内存缓存一样,这供应了庞大的加速,并极大地削减了前端的瓶颈。

分派行列

分派行列担任保留一组须要实行的uops,然后,当实行引擎有可用的资本来实行它们时,会将这些信息供应给实行引擎。

实行引擎

实行引擎做的恰是你所希冀的,然则在这个阶段,处置惩罚器最先挪动指令来加速运转速度。

从新命名

如今就须要为某些操纵分派资本了,此时处置惩罚器中的寄存器比规范的x86寄存器多得多。这些寄存器被分派用于暂时操纵,而且平常映照到它们对应的x86寄存器。

在这个阶段,CPU能够做许多优化。它能够经由历程殽杂寄存器消弭寄存器挪动(比方两个x86寄存器“指向”雷同的内部寄存器)。它能够从管道中删除已知的调零指令(比方xor with self,或许and with zero),而且直接调零寄存器。末了,当指令胜利完成后,重命名操纵就会住手。此时,内部微架构状况将恢复为x86架构状况。当内存操纵对其他CPU可见时也是云云。

从新排序

uOP从新排序关于当代CPU机能异常重要,不依赖于当前指令的将来指令能够在守候当前指令的效果时实行。

比方:

mov rax, [rax]
add rbx, rcx

在这个简短的示例中,我们看到从rax中的地点实行64位加载并将其存储回rax。内存操纵能够异常费时,从L1缓存掷中的4个周期到非处置惩罚器内存接见的250个周期以至更多。

处置惩罚器能够完成add rbx、rcx指令不须要“守候”加载效果,而且能够在守候加载完成的同时发送add uop以供实行。

此时,处置惩罚器最先以差别于你通知它的递次实行操纵。然后处置惩罚器保留效果,并确保它们以准确的递次出如今其他内核中,因为x86是一个强递次的架构。像ARM如许的其他架构平常是弱排序的,开辟人员能够在指令流中插进去敕令,通知处置惩罚器须要完成的特定递次操纵。

比方:

Core 0实行以下操纵:

mov [shared_memory.pointer], rax ; Store the pointer in `rax` to shared memory
mov [shared_memory.owned],   0   ; Mark that we no longer own the shared memory

Core 1实行以下操纵:

.try_again:
    cmp [shared_memory.owned], 0 ; Check if someone owns this memory
    jne .try_again               ; Someone owns this memory, wait a bit longer

    mov rax, [shared_memory.pointer] ; Get the pointer
    mov rax, [rax]                   ; Read from the pointer

在x86上,这是平安的,因为一切对齐的加载和存储都是原子性的(顺序的原子性指:悉数顺序中的一切操纵,要么悉数完成,要么悉数不完成,不能够阻滞在中心某个环节。 ),而且以它们按递次出如今一切其他处置惩罚器中的体式格局提交。在ARM之类的装备上,能够在指针被写入之前将具有的值写入,从而许可core 1运用过期或无效的指针。

实行单位

实行单位担任实行盘算、装载和存储,关于一些罕见的操纵,内核具有该硬件逻辑的多个副本,这许可在零丁的数据上实行雷同的操纵。比方,能够在4个差别的实行单位上实行增添。

关于加载之类的操纵,有两个加载端口(端口2和端口3),这许可每一个周期实行两个自力的加载。

内存子体系

英特尔的内存子体系异常庞杂,但我们只议论基础知识。

缓存

缓存对当代CPU机能至关重要,RAM耽误异常高(150-250个周期),假如没有缓存,CPU基本上是不可用的。比方,假如一个2.2 GHz的当代x86处置惩罚器禁用了一切缓存,那末它每秒实行的指令将永久不会凌驾1500万条,这和1991年的英特尔80486一样慢。

关于x86,平常有3个级别的缓存:1级缓存,速度极快,但很小:4个周期的耽误。接下来是2级缓存,它更大,但依然异常小:14个周期的耽误。末了是末了一级缓存(LLC,平常是L3缓存),这是异常大的,但具有更高的耽误,平常都多于 60个周期。

L1和L2缓存存在于每一个内核中,然则L3缓存能够在多个内核之间同享。

转译后备缓冲器(TLB)

在当代cpu中,应用顺序险些从不直接与物理内存接口。而是经由历程地点转换将虚拟地点转换为物理地点。这许可一连虚拟内存地区映照到碎片物理内存,实行此转换须要4次内存接见(在64位4级分页上)。因而,CPU能够缓存近来转换的地点,进而在存储器操纵时期跳过该转换历程。

进而在存储器操纵时期跳过该转换历程。

操纵体系会经由历程无效页面invlpg指令通知CPU什么时候革新这些转译后备缓冲器,假如操纵体系在映照变动时未准确挪用内存,则能够运用过期的转换信息。

缓存行添补区

当加载处于挂起状况,且还没有出如今L1缓存中时,数据将驻留在一个缓存行添补区中。缓存行添补区位于L2缓存和L1缓存之间。当内存接见错过L1缓存时,分派一个行缓存行添补区条目,一旦加载完成,就将LFB复制到L1缓存中,并删除LFB条目。

存储缓冲区

存储缓冲区相似于行缓存行添补区,在守候资本可用以完成存储时,数据将被放入存储缓冲区。纵然内存子体系的一切其他方面现在都很忙,或许存储还没有准备好退出,最多也能够有56个存储(在Skylake上)列队。

NIST发布零信任架构草案

零信任(Zero Trust)是一组不断发展的网络安全术语,它将网络防御的边界缩小到单个或更小的资源组。零信任架构(Zero Trust Architecture,ZTA)战略是指并不根据物理或网络位置对系统授予完全可信的权限。对数据资源的访问权限只有当资源需要的时候才授予,在连接建立之前会进行认证。零信任架构是对企业级网络发展趋势的回应,企业级网络开始包含远程用户和位于企业网络边界的基于云的资产。零信任架构关注于保护资源、而非网络分段,因为网络位置不再被视为资源安全态势的主要组成

别的,接见内存的加载将查询存储缓冲区,从而能够绕过缓存。假如读取发作在近来存储的位置,则能够直接从存储缓冲区添补读取,这称为存储转发。

加载缓冲区

与存储缓冲区相似,加载缓冲区用于挂起的加载uops。它位于实行单位和L1缓存之间,这能够在Skylake上包容多达72个条目。

Sushi Roll

Sushi Roll最初是为我的矢量化模仿事情而设想的。这是一个异常新鲜的架构。起首,时钟速度约为1.3 GHz,因而仅这一点就比“规范”x86处置惩罚器慢2-3倍。而且,它用于从新排序和指令解码的CPU资本更少。在运转单线程应用顺序时,与“规范”的3 GHz当代英特尔CPU比拟,All-in-all CPU的速度要慢10倍摆布。也没有L3缓存,所以内存接见能够会变得越发耗时。

除了这些简朴的机能题目以外,另有更庞杂的题目。因为Knights Landing被设想为每一个内核4个线程(4路超线程),以减缓一些有限的指令解码和缓存的机能丧失。这许可线程“壅塞”内存接见,而其他具有挂起盘算的线程运用实行单位。这类4路超线程与64核处置惩罚器相结合,能够发作256个硬件线程。

在这些线程之间迁徙历程和资本能够会异常慢,比方:假如一切256个线程都经由历程实行原子增量(lock inc指令)来举行雷同的内存,那末每一个零丁的增量将消费凌驾10000个周期!这充足让Xeon Phi处置惩罚器上的一个内核实行64万次单精度浮点运算,这会形成一些严峻的缓存题目。

明显,我们能够经由历程削减同享内存接见的频次来减缓这些题目,但或许我们能够开辟一个从根本上不许可这类行动的内核。

Sushi Roll的设想初志

Sushi Roll从一最先就就被设想成一个基于大批并行音讯通报的内核,Sushi Roll最明显的特点是不许可运用可变同享内存(内核IPC机制的一个小破例)。这意味着假如你想要与其他处置惩罚器同享信息,你必需经由历程IPC通报该信息。荣幸的是,同享不可变内存是许可的。

这类设想还意味着永久不须要运用lock,以至运用lock前缀的原子级lock也不须要持有lock。一个特定的内核将具有一个硬件资本,而不是运用lock。比方,core #0能够具有网卡,或许网卡上的特定行列。你将向core #0发送一条音讯,指导你想要发送一个数据包,而不是经由历程猎取lock来要求对NIC的独有接见。一切这些数据包的处置惩罚都是由发送方完成的,因而数据已以一种能够直接放入NIC环缓冲区的体式格局花样化了。这使得硬件资本的一切者只是一个中介,从而削减了对该资本的耽误。

虽然这使得内核的内部越发庞杂,然则开辟人员看到的编程模子依然是规范的send()/recv()模子。经由历程强迫通报音讯,能够确保为这个内核编写的一切软件都能够在多台装备之间举行扩大而无需修正。在一台盘算机上有一种疾速、低耽误的IPC机制,它利用了一些同享内存的功用(经由历程将物理内存的一切权转移给接收方)。假如音讯的目的位于收集上的另一台盘算机上,则音讯将以能够经由历程收集发送的体式格局举行序列化。这类庞杂性对开辟人员来说是隐蔽的,开辟人员能够制造一个顺序,无需任何分外的事情就能够扩大。

没有中缀、没有定时器、没有软件线程、没有历程

Sushi Roll没有中缀,没有定时器,没有软件线程,也没有历程。这些平常是传统操纵体系所须要的,以便为多个历程和用户供应用户体验。

经由历程删除一切这些外部事宜,CPU的丈量行动更具肯定性。比拟其他东西Sushi Roll在这方面走得更远,因为没有内核同享内存,并致使不测的缓存消灭或一致性通讯,它进一步降低了CPU噪音。

软重启

软重启是从电脑的操纵体系经由历程准确指令来重启的,与Linux上的kexec相似,Sushi Roll的内核老是支撑软重启。这许可用新内核替代旧内核,以至是双毛病/破坏的内)。这个历程约莫须要200-300ms,因为要起首撤除旧内核,经由历程PXE下载新内核,并运转新内核。这使得在没有历程的情况下具有如许一个特地的内核是可行的,因为我只需变动内核的代码并在一秒内启动新的内核。疾速原型设想关于疾速开辟至关重要,假如没有此功用,此内核将没法运用。

Sushi Roll终究成为CPU内省的圆满内核,这是迄今为止具有最低噪音的内核。

机能计数器

在议论怎样取得逐周期的微架构数据之前,我们必需相识一下Intel cpu上可用的机能监控功用。

Sushi Roll:CPU内核研讨

Intel cpu有一个机能监控子体系,重要依赖于一组特定于模子的寄存器(MSRS)。能够设置这些MSRS来跟踪特定的架构事宜,平常是经由历程盘算它们来完成的。这些计数器的正式名称是“机能监控计数器”,平常简称为“机能计数器”或pmc。

这些pmc因微构造而异,不过Intel已许诺在多个微架构之间供应一小部份计数器,这些被称为架构机能计数器。在撰写本文时,架构机能监控有4个版本,而最新版本供应了大批对通用优化有效的通用信息。但是,关于特定的微架构,跟踪机能事宜的能够性险些是无穷的。

要运用Intel上的机能计数器,须要实行几个步骤。起首,你必需找到要监控的机能事宜。

比方,以下有一小部份特定于Skylake的机能事宜:

英特尔机能计数器重要依赖于两组MSRS,机能事宜挑选MSRS,个中运用上表中的umask和事宜编号对差别的事宜举行编程。而且机能计数器MSRS自身也能够保留计数。

机能事宜挑选MSRS (IA32_PERFEVTSELx)从地点0x186最先,逾越一个一连的MSRS地区。这些事宜挑选MSRS的规划因微架构的差别而略有差别。可用计数器的数目因CPU而异,经由历程读取CPUID.0AH:EAX[15:8]来动态搜检。机能计数器MSRS (IA32_PMCx)从地点0xc1最先,也逾越一个一连的MSRS地区。计数器支撑特定于微架构的位,能够在CPUID.0AH:EAX[23:16]中找到。读取和写入这些MSRs分别是经由历程rdMSR和wrMSR指令完成的。

平常,当代英特尔处置惩罚器支撑4个PMC,因而将具有4个事宜挑选MSRS (0x186、0x187、0x188和0x189)和4个计数器MSRS (0xc1、0xc2、0xc3和0xc4)。大多数处置惩罚器都有48位的机能计数器。所以动态检测此信息异常重要!

以下是针对PMC版本3的IA32_PERFEVTSELx  MSR:

在特定的微架构表中找到要跟踪的准确事宜,运用准确的事宜编号和umask在IA32_PERFEVTSELx寄存器中对其举行编程,依据要跟踪的代码范例设置USR或OS位,并设置E位以启用它!如许在每次事宜发作时,响应的IA32_PMCx计数器都邑递增!

浏览PMC的速度更快

能够运用rdpmc指令,而不是实行rdmsr指令来读取IA32_PMCx值,假如ecx[31]被设置为1,这条指令就会支撑“疾速读取形式”。

机能计数器的第2个版本

在机能计数器的第二个版本中,Intel增添了许多新特征。

Intel增添了一些不可编程的牢固机能计数器(IA32_FIXED_CTR0到IA32_FIXED_CTR2,从地点0x309最先)。这些由地点0x38d处的IA32_FIXED_CTR_CTRL设置。与一般的pmc差别,这些不能被编程来盘算任何事宜。相反,这些控件只许可挑选它们所增添的CPU环级别以及它们是不是在溢出时触发中缀。

然后经由历程以下体式格局启用和禁用它们:

机能计数器的第二个版本还增添了3个新的MSRs,许可对机能计数器举行“批量治理”。英特尔没有搜检状况并零丁启用/禁用每一个机能计数器,而是增添了3个全局掌握MSRS。这些是IA32_PERF_GLOBAL_CTRL(地点0x38f),它许可批量启用和禁用机能计数器。IA32_PERF_GLOBAL_STATUS(地点0x38e),它许可搜检一个rdmsr中一切机能计数器的溢出状况,别的是IA32_PERF_GLOBAL_OVF_CTRL(地点0x390),它许可在一个wrmsr中重置一切机能计数器的溢出状况。因为rdmsr和wrmsr是序列化指令,因而这些指令能够异常耗时,所以削减它们的数目异常重要!

全局掌握(许可经由历程一个MSR屏障单个计数器):

Sushi Roll:CPU内核研讨

状况(跟踪种种计数器的溢出,运用全局前提变动跟踪器):

Sushi Roll:CPU内核研讨

状况掌握(在IA32_PERF_GLOBAL_STATUS中,将1写入这些位中任何一名,将消灭对应的位):

Sushi Roll:CPU内核研讨

末了,Intel向现有的IA32_DEBUGCTL MSR (地点0x1d9)增添了2位,这些设想是为了在发作溢出前提时削减中缀自身的丈量。

机能计数器的第3个版本

该版本异常简朴,Intel将ANY位增添到IA32_PERFEVTSELx和IA32_FIXED_CTR_CTRL中,以便跟踪物理内核上的任何线程上的机能事宜。别的,机能计数器从牢固数目的2个计数器增添到可变数目的计数器。这致使更多位被增添到全局状况,溢出和溢出掌握MSRs,以掌握响应的计数器。

Sushi Roll:CPU内核研讨

机能计数器的第4个版本

此版本中,Intel重命名了一些MSRS,比方IA32_PERF_GLOBAL_OVF_CTRL改成IA32_PERF_GLOBAL_STATUS_RESET。别的,Intel还增添了一个新的MSR IA32_PERF_GLOBAL_STATUS_SET (地点0x391),它不消灭IA32_PERF_GLOBAL_STATUS中的位,而是许可设置位。

末了,该版本中还被增添了一种机制,许可多个用户同享机能计数器。

终究要完成的目的

我们为本身设定了一个相称高的目的,愿望有效地将两个机能计数器连接起来。在本例中,我们愿望对感兴趣的事宜运用恣意的机能计数器,并愿望将其链接到跟踪经由的轮回数的机能计数器。但是,好像没有一种直接的方法来实行这类链接。

然则我们能够运用IA32_DEBUGCTL.Freeze_PerfMon_On_PMI功用同时住手多个机能计数器。当计数器溢出时,会发作中缀。当发作这类溢出时,IA32_PERF_GLOBAL_STATUS中的相干位会致使一切机能计数器住手运转。这意味着,假如我们能够在每一个轮回边境上形成溢出,就能够同时捕捉时候和我们感兴趣的事宜。

本文翻译自:https://gamozolabs.github.io/metrology/2019/08/19/sushi_roll.html


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明Sushi Roll:CPU内核研讨
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址