«Двуликий закон Мура», потенциально очень нехорошие вирусы, а также о выборе DRAM для высоконадёжных серверов

10 декабрь, 2014 - 13:49Андрей Зубинский

«Закон Мура» - чуть ли не священная корова индустрии. Если эта корова плохо доится, всегда можно произвести некоторые манипуляции с «молоком» и показать очередное победное соблюдение эмпирического и недоказуемого правила. Этого аспекта «закона Мура» не буду даже касаться, неинтересно. Куда интереснее заметить на аппроксимирующей «закон» прямой точку, в которой происходят какие-то качественные изменения. Любые. Не обязательно хорошие и «светлые». В инженерии вообще таких понятий не существует. Так что обойдёмся без эмоций.

Мы будем говорить об уже случившемся – о той точке на «прямой Мура», в которой уменьшение физических размеров элементов интегральной микросхемы позволило изменять поведение всей системы, где используется эта микросхема, непредусмотренным разработчиками и очень опасным способом. Если менее заумно – есть способ, позволяющий полностью разрушить процесс нормального исполнения, например, операционной системы (что означает – всего вообще), и мало что этот способ основывается на… законе Мура, так ещё и разработчики микросхем никогда ничего «специального» не делали для возможности появления этого способа, ни умышленно, ни по недосмотру. То есть, этот способ не использует никаких традиционных «вирусных» приёмов, он даже не сугубо аппаратный, он фундаментален, он существует и работает именно потому, что закон Мура…

Теперь можно и переходить к сути. «Закон Мура» обычно иллюстрируют почему-то микропроцессорами, хотя это эмпирическое правило должно «работать» для полупроводниковых интегральных микросхем вообще. И микросхем динамической памяти – в частности. И вроде как «работает» (не буду утверждать, не проверял даже, а зачем?). Увеличение ёмкости микросхем DRAM при сохранении размеров кристаллов, на которых они реализованы, означает одно – размеры ячейки памяти (которая в DRAM по сути является конденсатором) уменьшаются. Очень сильно уменьшаются. Вот микрофотография «среза» кристалла DRAM, выполненного по 22 nm технологическому процессу, на ней видны характерные «колбочки» этих самых конденсаторов (capacitors), для иллюстрации плотности «упаковки»:

«Двуликий закон Мура», потенциально очень нехорошие вирусы, а также о выборе DRAM для высоконадёжных серверов

Даже если следовать самой простой неинженерной логике, то при уменьшении габаритов каждой ячейки памяти и «изолирующих прослоек» между ними должно когда-нибудь что-нибудь, да произойти (такая логика тоже полезна). Если воспользоваться инженерной логикой, то «выплывут» всевозможные нюансы, например простые соображения – с уменьшением размера хранящего заряд элемента памяти и увеличением количества этих элементов на единицу площади кристалла одновременно и уменьшается отношение сигнал-шум, и увеличивается электромагнитная связь между соседними элементами. И, наконец, есть технологический процесс, который с уменьшением технологической нормы производства отдаляется от представлений об идеальности и вносит значительный фактор случайности (хотя бы просто потому, что становится более чувствительным к самым малым вибрациям, чистоте и прочему). То есть, при каких-то габаритах всей конструкции должен наступить момент, когда заявленные технические параметры будут действительными не «вообще», а «в очень многих, но не всех, случаях».

Не стоит считать, что разработчики DRAM об этом не догадывались. Потому что команда, исследовавшая нехорошую сторону закона Мура, сформирована из специалистов университета Carnegie Mellon и Intel, именно тех специалистов, которые занимаются низкоуровневой архитектурой микросхем DRAM. Больше того, название для всего этого было придумано ещё в дремучие времена становления индустрии, когда Intel выпустила первую коммерческую микросхему DRAM 1103 – именно тогда прозвучал термин «возмущения в работе динамической памяти» (DRAM disturbance), были созданы и технологические методы снижения этого эффекта (например, увеличение качества «изоляции» между ячейками памяти), и усовершенствованы способы тестирования кристаллов памяти. И всё было в целом хорошо, пока не…

Пока повторно не открылось, что DRAM disturbance прекрасно работает в обычных «планках» памяти, выпущенных в 2012-2013 годах, причём в исследованных 129 образцах эффект ярко проявился в 110 "планках". Очень немаленькая цифра, чтобы её не замечать.

Ну а теперь, когда известны общие черты и масштабы, можно, наконец, рассказать и о самом эффекте. Для большего драматизма приберёг.

Ячейки памяти DRAM организованы в матрицу и соединены общими полупроводниковыми шинами строк. Последовательное выполнение большого числа активаций шины строки (например, операций чтения из одной и той же ячейки памяти) вызывает «возмущения» в работе всех соседних к строке ячеек памяти – их содержимое может быть разрушено. Более детально – «дёргающаяся» с высокой частотой шина строки вызывает ускоренную утечку заряда из соседних ячеек памяти, и если процесс регенерации памяти (а он повторяется очень нечасто по временным меркам современных DRAM) не успеет восстановить заряды – всё, правильное содержимое не восстановить вообще.

Исследования реальных образцов DRAM показали, что всего 139-140 тысяч последовательных изменений состояния шины строки может превратить в «мусор» содержимое до 2 тысяч ячеек памяти, к которым вообще не было никаких обращений, они аппаратно находятся в других строках DRAM. Эффект проверено и доказано повторим (что важно, речь идёт не о какой-то лабораторной работе «с уникальными результатами»).

То есть, появилась возможность уничтожать содержимое ячеек памяти непрямым методом, не обращаясь к ним вообще. Забавно, что никаких технических ухищрений для этого не требуется, достаточно возможностей штатного контроллера памяти фактически любой платформы (в мире x86 независимо от производителя – что Intel, что AMD, всё равно) и примитивной (но требующей исполнения в защищённом режиме) ассемблерной программки:

Disturber:
    mov (X), %eax
    mov (Y), %ebx
    cflush (X)
    cflush (Y)
    mfence
jump Disturber

Первые две команды (mov) выполняют операцию чтения из памяти (адреса X и Y) в регистр и, естественно, в кэш-память. Команды cflush «вычёркивают» из кэш-памяти только что прочтённое (например, за ненадобностью, чтобы не занимать кэш-память, совершенно законная и типовая последовательность операций), mfence гарантирует освобождение кэш-памяти до выполнения первой следующей любой операции с памятью. И, наконец, всё это абсолютно законное и формально правильное выполнятся в бесконечном цикле, команда jump возвращает управление по адресу Disturber.

Эта программка, исполняемая современными процессорами, вызывает «загрузку» контроллера памяти последовательностями запросов к DRAM, которые периодически «выстреливаются» в шины физической памяти. Итог её исполнения – разрушение содержимого ячеек памяти с адресами, ничего общего с использованными в ней не имеющими (выявлено даже правило выбора «разрушительных» адресов X и Y, обусловленное особенностями работы контроллеров памяти Intel и AMD).

Для проверки модулей памяти на подверженность disturbance разработана программа с символическим названием rowhammer. Она работает под управлением ОС Linux и доступна всем желающим. Ничего сверхсложного в её использовании нет, всё детально расписано, включая и недостатки реализованного метода тестирования.

Так что есть возможность для действительно высоконадёжных серверов, например, отбирать модули памяти менее подверженные disturbance DRAM эффекту (и потенциальным атакам, к слову, раз уж есть такой способ, ещё и очень просто реализуемый, то с очень большой вероятностью его используют для чего-нибудь плохого, слишком он «аппетитный»). Конечно, это приведёт к увеличению стоимости готового сервера, но «за бесплатно» ничего не бывает.

Вот такая вторая сторона «закона Мура» получается. Радикального решения проблемы, что очевидно, нет. Производители, безусловно, будут искать способы ослабить DRAM disturbance, но это очень дорогие решения – они ведь требуют исследований и модернизаций технологических процессов.

Традиционная рубрика «польза» - в следующей записи.

Откланиваюсь.