Здравствуйте, Cyberax, Вы писали:
C>>>Обычный барьер не очищает L1-кэш. Он лишь форсирует его синхронизацию. O>>....которая занимает время, равное времени записи в память. То есть разрешение твоего таймера будет заведомо больше самого большого интервала, который нужно измерить, чтобы провести атаку. C>Чтение данных из DRAM — это около 300 наносекунд, или около 600 циклов на типичном CPU. Межпроцессорная синхронизация — это около 50 циклов. Более чем достаточно запаса.
Откуда такие цифры? Например, DDR3-1600 (опорная тактовая 800MHz) с таймингами 9-9-9-28 имеет 35 наносекунд (28/0.8) на самый длинный вариант чтения — закрытие одной из предыдущих открытых строк (копирование из буферной строки на SRAM в модуле DRAM в основной массив) и открытие новоуказанной (кэширование в буферную строку SRAM). Прохождение через все цепочки кэшей и контроллеров чуть-чуть добавляет, но не сильно. Тут ты преувеличил на порядок; это всё равно дохрена, но уже не 600 тактов, а только около 120.
И да, лучше говорить "тактов", это не английский.
Во времена DDR1...DDR2 обычно писали про ~200 тактов, когда процессоры уже набрали 3-4GHz тактовой, а память была медленнее (например, в знаменитой статье Дреппера про память); сейчас 100-150 тактов; прогресс за 15 лет с временем переоткрытия строки от 50-70 нс до нынешних 25-40 это грандиозный прогресс, как оказалось.
Вот если строка не открывается, а уже открыта — тогда быстрее будет (потребуется CAS latency, в приведённом примере это 9 тактов опорной частоты DRAM => 11.25 нс; реально ну 15, ну с натяжкой 20; соответственно 40-60 тактов). Но предсказать, попадёт в ту же строку или нет, не так просто — северные мосты любят перемешивать линии шины адреса в зависимости от выбранного расклада памяти. В принципе, на нынешнем железе можно предполагать, что младшие 10-15 линий адреса не подвергнутся такому перемешиванию; это сходно с размером страницы виртуальной адресации, так что надо рассчитывать и на такие времена.
Запаса получается в 3-4 раза (при переоткрытии строки), или совсем чуть-чуть при той же строке DRAM, а не 12. Общий уровень успешности принципиально не меняется, но давай не пугать нереальными цифрами...
(Это я не считал, сколько занимает синхронизация кэшей. Может, и там не так страшно.)
C>Впрочем, даже в твоём сценарии я смогу сделать измерение. Просто делаем его 20 раз для того, чтобы накопить время.