Meltdown Attack(1) - Seed Lab

最近在了解Meltdown攻击,在网上发现了Syracuse University的Wenliang Du教授写的关于这方面的实验教程。感觉很受益,粗略地翻译了一部分,自己跟着做了实验,记录于此。
感兴趣的可以去原网址查看,讲义和代码都可以找到:https://seedsecuritylabs.org/Labs_16.04/System/Meltdown_Attack/

Task 1 :读Cache Vs. 读Memory

CPU cache的功能是降低CPU从内存读写数据的损失。从CPU cache来读写数据要比去从内存读写快得多。当数据从内存中取出时,通常会被缓存到CPU中,当相同的数据再次被使用时,就会降低取数据的时间,增加效率。因此,当CPU需要读写数据,先去看一下cache中有没有数据,如果有,就从cache拿数据。反之,再去比较远的内存去拿数据。去内存拿数据的时间要远远高于去cache拿数据的时间。大部分的现代CPU都有CPU caches。

在这里插入图片描述

图片来源于实验教程的讲义

在下面的代码中,我们有个数组大小为10 * 4096。我们首先访问其中的两个元素,array[3 * 4096]和array[7 * 4096]。因此,包含这两个元素的页就会被缓存。然后,我们读取array[0 * 4096] 到 array[9* 4096 ],然后测量从内存读取这些元素的时间。

#include <emmintrin.h>
#include <x86intrin.h>
uint8_t array[10*4096];
int main(int argc, const char **argv) {
    int junk=0;
    register uint64_t time1, time2;
    volatile uint8_t *addr;
    int i;
    // Initialize the array
    for(i=0; i<10; i++) array[i*4096]=1;
    // FLUSH the array from the CPU cache
    for(i=0; i<10; i++) _mm_clflush(&array[i*4096]);
    // Access some of the array items
    array[3*4096] = 100;
    array[7*4096] = 200;
    for(i=0; i<10; i++) {
        addr = &array[i*4096];
        time1 = __rdtscp(&junk); À
        junk = *addr;
        time2 = __rdtscp(&junk) - time1; Á
        printf("Access time for array[%d*4096]: %d CPU cycles\n",i, (int)time2);
    }
    return 0;
}

实验记录

array12345678910Average
array[0*4096]1041361321461068413411412098117.4
array[1*4096]174182222304184184188182218206204.4
array[2*4096]172184208180188184188182212190188.8
array[3*4096]52486242302842481824658
array[4*4096]274166204184188182798166202188255.2
array[5*4096]164184204958178266188184204182271.2
array[6*4096]166186760172184184188184224186243.4
array[7*4096]2844845024284630704645
array[8*4096]178184844184168182184184234188253
array[9*4096]186184246186184182186186216166192.2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

破落之实

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值