SlideShare une entreprise Scribd logo
1  sur  52
Click to edit Master title style
Об удивительных
приключениях
регистров SSE и
поиске одного
бага
Лев Казаркин
Лаборатория Касперского
Группа шифрования данных
Click to edit Master title style
Стр. 2
Full Disk Encryption от Касперского
Сокращенно: FDE
Похоже на: TrueCrypt, Bitlocker, только лучше ;)
Шифруем мы весь диск целиком, а не только отдельные тома.
Предоставляем предзагрузочную аутентификацию – по
логину/паролю (а сейчас еще и по смарт-картам).
Компьютер нельзя загрузить (с системного диска) в обход этого
агента, да и смысла нет – все же зашифровано.
Решение централизованно управляется с единого сервера
(Kaspersky Security Center).
Шифруем безопасно, быстро, недорого, без SMS... ;)
Click to edit Master title style
Стр. 3
Исторический экскурс
• Основано на реальных событиях.
• Время действия: Ноябрь 2013.
• Второй релиз технологии в продукте Kaspersky Endpoint Security (KES 10).
• Стадия высокой готовности к релизу - идет внутреннее развертывание
продукта (IRO).
• Internal Rollout или dogfooding (как говорят в Microsoft) – "ешь еду своей
собаки".
Click to edit Master title style
Стр. 4
Дальше по плану
1. Матчасть - как устроено FDE от Касперского.
2. Завязка истории. Затем, ее пошаговое развитие. Интерактив!
3. Разоблачение.
Не забываем, что у нас детектив, проявляем активность
Click to edit Master title style
Стр. 5
Архитектура FDE v.1 (endpoint)
Click to edit Master title style
Стр. 6
Агент предзагрузочной аутентификации выглядел так
Click to edit Master title style
Стр. 7
Метаданные
Click to edit Master title style
Стр. 8
Завязка
2013/11/1 от саппорта приходит внутренний баг с IRO.
Пользователь из далекой Великобритании пришел утром на работу и
обнаружил, что его рабочий комп превратился в кирпич.
FDE радостно мигает текстовым курсором на черном экране и сообщает, что
кто-то испортил метаданные FDE.
Click to edit Master title style
Стр. 9
Завязка
2013/11/1 от саппорта приходит внутренний баг с IRO.
Пользователь из далекой Великобритании пришел утром на работу и
обнаружил, что его рабочий комп превратился в кирпич.
FDE радостно мигает текстовым курсором на черном экране и сообщает, что
кто-то испортил метаданные FDE.
Click to edit Master title style
Стр. 10
"Развал" метаданных
Метаданные здорового человека:
Поврежденная копия:
Click to edit Master title style
Стр. 11
Первое впечатление
•Н у да, у нас есть какой-то неприятный баг. Может быть, в пребуте.
• Не страшно. Подумаешь, баг у одного пользователя!
• В целом качество продукта не вызывает сомнения.
• Продукт же прошел отдел тестирования, преодолел нагрузочное
тестиорование на стендах, да и баг проявился только у одного пользователя.
• Багу был назначен невысокий, обычный приоритет.
НО!
Не понятно как его воспроизводить. Что является триггером?
Ни на виртуалках, ни на реальном железе не воспроизводится.
Как исправлять то, что не воспроизводится?
Click to edit Master title style
Стр. 12
Гипотеза 1
Включаем воображение!
Что может вызвать порчу данных?
•Аппаратный сбой – не интересно.
•Конфликт клиентов при одновременном доступе! Вот это уже что-то.
Click to edit Master title style
Стр. 13
Гипотеза 1
Включаем воображение!
Что может вызвать порчу данных?
•Аппаратный сбой – не интересно.
•Конфликт клиентов при одновременном доступе! Вот это уже что-то.
Click to edit Master title style
Стр. 14
Проверка
• Организовали тестирование.
• Два клиента в одном Продукте.
• Запуск двух экзампляров Продукта одновременно.
• ...
Click to edit Master title style
Стр. 15
Проверка
• Организовали тестирование.
• Два клиента в одном Продукте.
• Запуск двух экзампляров Продукта одновременно.
• ...
Синхронизация в user mode стойко вынесла все нападки.
Конфликта 2х продуктовых клиентов быть не может!
Click to edit Master title style
Стр. 16
Гипотеза 2. Конфликт Продукта с гибернацией?
Click to edit Master title style
Стр. 17
Гипотеза 2. Конфликт Продукта с гибернацией?
Теоретическая возможность этого обсуждалась уже давно.
Но вероятность этих событий в реальной жизни казалась (и была) очень
малой.
Правильное решение было дорогим.
Воспроизвели с первого раза.
Ага, кажется, это то, что нужно.
Фикс получился очень сложный. Пришлось разработать новый механизм
синхронизации доступа к метаданным.
Изменить архитектуру, и это во время релиза :)
Синхронизация была сделана на основе драйвера
Пока шел доступ, гибернация в системе была заблокирована.
Click to edit Master title style
Стр. 18
2013/11/14, вечер.
• Исправления были закоммичены после тщательной проверки и ревью.
• Проблема исправлена.
• Команда торжествовала.
• Конфликт проверяли ручным тестом на разных машинах.
• Процесс 1: модифицирует метаданные в цикле.
• Процесс 2: вызывает гибернацию, циклически.
Click to edit Master title style
Стр. 19
2013/11/14, вечер.
Был оставлен на ночь Процесс 1, на всякий случай.
Click to edit Master title style
Стр. 20
2013/11/15, 11 часов дня. Пятница.
Что увидели разработчики?
Click to edit Master title style
Стр. 21
2013/11/15, 11 часов дня. Пятница.
ASSERTION FAILED
Метаданные изменены после или во время записи на диск.
Насчитанная контрольная сумма не совпадает с записанной.
Click to edit Master title style
Стр. 22
2013/11/15, 11 часов дня. Пятница.
ASSERTION FAILED
Метаданные изменены после или во время записи на диск.
Насчитанная контрольная сумма не совпадает с записанной.
Та-да-да-даам.
• Один клиент
• Никакой гибернации
• Машина надежная (виртуальная)
Click to edit Master title style
Стр. 23
Пожар
• Замечательно исправили проблему, но не ту!
• Проблема никуда не делась!
• У нас есть воспроизведение!
• Совершенно не понятно что происходит.
Click to edit Master title style
Стр. 24
Пожар и сверхурочные
Команда мобилизована на воспроизведение.
• Проблема вопроизводится, воспроизвести сумели почти все, особенно дело
хорошо шло на Windows XP.
• Есть условия, сильно улучшающие воспроизведение. Например, если диск
активно шифруется, оно ускоряется в разы.
• Еще быстрее воспроизведение наступает, если создать сильную нагрузку на
диск.
• Чемпионом стала однопроцессорная виртуалка с XP. Воспроизведение
через минуту!
Да, в те годы мы еще поддерживали XP ;)
Click to edit Master title style
Стр. 25
Пожар и сверхурочные
Команда мобилизована на воспроизведение.
• Проблема вопроизводится, воспроизвести сумели почти все, особенно дело
хорошо шло на Windows XP.
• Есть условия, сильно улучшающие воспроизведение. Например, если диск
активно шифруется, оно ускоряется в разы.
• Еще быстрее воспроизведение наступает, если создать сильную нагрузку на
диск.
• Чемпионом стала однопроцессорная виртуалка с XP. Воспроизведение
через минуту!
Да, в те годы мы еще поддерживали XP ;)
Что происходит? Как это возможно?
Click to edit Master title style
Стр. 26
На самом деле
• Для воспроизведения проблемы модифицировать метаданные не нужно
вовсе.
• Достаточно их просто читать.
• Чтение метаданных у нас идет через драйвер, через особый IOCTL.
Почему?
• Т.к. весь диск зашифрован, и все что читает/пишет Windows, шифруется...
• Да-да, даже PAGEFILE, HIBERFIL, и даже "синие дампы" - вообще все.
• …Доступ к метаданным должен идти другим, нелегальным каналом. То
есть, через драйвер.
Click to edit Master title style
Стр. 27
Тест на чтение метаданных через драйвер
Был сделан максимально простой тест.
Тест читал с диска через драйвер (тем самым волшебным IOCTL-ом).
Ничего лишнего - выделяем память, и читаем в нее с известного места на
диске известные данные и сравниваем с образцом.
На волшебной виртуалке с XP – воспроизводилось хорошо. У других
разработчиков показания разнятся.
• Буфер на стеке – нет проблемы.
• Холодный буфер через VirtualAlloc() – как из пушки.
Click to edit Master title style
Стр. 28
Тест на чтение метаданных через драйвер
Был сделан максимально простой тест.
Тест читал с диска через драйвер (тем самым волшебным IOCTL-ом).
Ничего лишнего - выделяем память, и читаем в нее с известного места на
диске известные данные и сравниваем с образцом.
На волшебной виртуалке с XP – воспроизводилось хорошо. У других
разработчиков показания разнятся.
• Буфер на стеке – нет проблемы.
• Холодный буфер через VirtualAlloc() – как из пушки.
Варианты:
• виноват драйвер, который как-то странно работает с памятью буфера, тут
как-то замешан PAGING,
• кто-то стреляет по памяти, внутри процесса, ну или из драйвера как вариант.
Click to edit Master title style
Стр. 29
Стресс-тест на драйвер с агрессивным пейджингом
• Система была еле жива под
тяжестью теста.
• Но жива.
• Для чистоты эксперимента
взяты свежие виртуалки, с
современными OS.
• Windows 7 64,
• Windows 8 64,
• новейшая Windows 8.1 64,
• разные конфигурации,
контроллеры диска...
Click to edit Master title style
Стр. 30
Стресс-тест на драйвер
• Система была еле жива под
тяжестью теста.
• Но жива.
• Для чистоты эксперимента
взяты свежие виртуалки, с
современными OS...
НИЧЕГО
Click to edit Master title style
Стр. 31
Тем временем другие разработчики...
Проверялись самые безумные теории.
Проверку читаемого с диска буфера довели до полной паранойи.
Click to edit Master title style
Стр. 32
What?
• Внезапно.
• Все происходит в юзер моде, без участия драйвера.
• Мы просто копируем данные в памяти.
В псевдокоде
copy(A, B);
ASSERT(B == ETALON);
ASSERT(A == ETALON); // <--- FAIL!
Click to edit Master title style
Стр. 33
What?
• Внезапно.
• Все происходит в юзер моде, без участия драйвера.
• Мы просто копируем данные в памяти.
В псевдокоде
copy(A, B);
ASSERT(B == ETALON);
ASSERT(A == ETALON); // <--- FAIL!
Click to edit Master title style
Стр. 34
Подозрительно! VEC_memcpy
10221720 movdqa xmm0,xmmword ptr [esi]
10221724 movdqa xmm1,xmmword ptr [esi+10h]
10221729 movdqa xmm2,xmmword ptr [esi+20h]
1022172E movdqa xmm3,xmmword ptr [esi+30h]
10221733 movdqa xmmword ptr [edi],xmm0
10221737 movdqa xmmword ptr [edi+10h],xmm1
1022173C movdqa xmmword ptr [edi+20h],xmm2
10221741 movdqa xmmword ptr [edi+30h],xmm3
10221746 movdqa xmm4,xmmword ptr [esi+40h]
1022174B movdqa xmm5,xmmword ptr [esi+50h]
10221750 movdqa xmm6,xmmword ptr [esi+60h]
10221755 movdqa xmm7,xmmword ptr [esi+70h]
1022175A movdqa xmmword ptr [edi+40h],xmm4
1022175F movdqa xmmword ptr [edi+50h],xmm5
10221764 movdqa xmmword ptr [edi+60h],xmm6
10221769 movdqa xmmword ptr [edi+70h],xmm7
1022176E lea esi,[esi+80h]
10221774 lea edi,[edi+80h]
...
Click to edit Master title style
Стр. 35
На самом деле, ч.2
Единственной архитектурой, на которой воспроизводилась проблема, на
самом деле была Intel IA32 (x86).
Все усилия поиска проблемы со стороны драйвериста были направлены на
эту архитектуру AMD64 (тем более что IA32 уже занимаются другие люди ;))
Между архитектурами IA32 и AMD64 есть существенная разница в том, как
они работают с плавающей точкой и регистрами SSE.
Windows реализует ленивое сохранение контекста FPU (SSE).
Экономия 
Click to edit Master title style
Стр. 36
Ленивое сохранение FP контекста
Click to edit Master title style
Стр. 37
Ленивое сохранение FP контекста
Click to edit Master title style
Стр. 38
Ленивое сохранение FP контекста
Click to edit Master title style
Стр. 39
На самом деле, ч.2
Между архитектурами IA32 и AMD64 есть существенная разница в том, как
они работают с плавающей точкой и регистрами SSE.
Windows реализует ленивое сохранение контекста FPU (SSE).
Экономия 
Так вот...
• В ядре ОС на IA32 всякое сохранение контекста FPU/SSE должен явно
делать программист.
• На AMD64 FPU/SSE входит в стандартный набор регистров,
сохраняемый в KTRAP_FRAME, то есть, при любом переключении
потоков, прерывании и т.д.
Click to edit Master title style
Стр. 40
Догадка, которая напрашивалась, была чудовищна
- Лев, похоже криптомодуль ядра портит конекст SSE.
- Угу, но ты представляешь, что это значит? Это значит, что проблеме подвержены все потоки в
системе. ВСЕ.
Действительно, разве может система еще шевелиться, как ни в чем ни бывало? Это же ходячий
труп.
- ВСЕЕЕ. Да, это совершенно невероятно. Поэтому я не думаю, что моя гипотеза верна.
Click to edit Master title style
Стр. 41
2013/11/17, вечер.
• Деваться некуда.
• Но как конкретно драйвер портит регистры в чужих процессах?
• Почему усиление дисковой активности усиливает эффект.
• И при чем тут PAGING, почему проблема воспроизводится только при
обращении к холодной памяти?
• Все входы и выходы в ядерный криптомодуль перекрыты.
• Вход в криптопримитив - сохранение (KeSaveFloatingPointState()).
• Выход из криптопримитива - восстановление (KeRestoreFloatingPointState()).
• Все это завернуто в такой плюсовый автоматический scoped guard, мышь не
проползет.
• Однако, факты говорили другое.
Click to edit Master title style
Стр. 42
2013/11/17, вечер.
Было сделано 2 вещи:
• был собран криптомодуль без инструкций SSE/AES NI,
• и в драйвер-фильтр, перед каждым обращением к крипте, была добавлена
собственная пара сохранение - восстановление контекста.
Оба подхода показали, что проблема уходит. Действительно уходит.
Печальный тимлид настраивал поставку криптомодуля без SSE/AES NI
оптимизации.
Это был наш план Б.
А без SSE2 и AES NI шифрование работает в 4-5 раз медленнее.
Click to edit Master title style
Стр. 43
IDA Pro
Метод скрупулезного и тщательного вглядывания в ядерный криптомодуль
принес нам это:
Click to edit Master title style
Стр. 44
IDA Pro
Это тело функции SymmetricContext::OSSL_Transform(), той самой, которая
выполняет симметричное шифрование/расшифровывание блочным
шифром.
Click to edit Master title style
Стр. 45
SymmetricContext::OSSL_Transform()
Вот так она выглядит в коде
Click to edit Master title style
Стр. 46
SymmetricContext::OSSL_Transform()
А ExecutionContext это структурка, которая как раз в среде ядра призвана
сохранять FPU context.
Click to edit Master title style
Стр. 47
IDA Pro
Итак
Что это? SSE инструкции в коде конструктора?
Зачем и откуда они там?
Click to edit Master title style
Стр. 48
Разоблачение
• Спасибо всем, кто помогал команде FDE найти баг ;)
• Кто-то за 2 месяца до этого включил SSE2 оптимизацию для всего проекта
cm_km.sys, ядерного криптомодуля.
• Оптимизация благоприятно сказалась на скорости работы крипты :)
• Хотя алгоритмы блочного шифрования на SSE2 и AES-NI написаны на
асме, и в оптимизации такого рода не нуждались.
• Оказался соптимизирован весь код, даже тот, который находится снаружи
оберток KeSaveFloatingPointState()/KeRestoreFloatingPointState().
• Хотя его вроде бы и нет. Или есть?
• Зануление полей объекта в одном конструкторе, через memset(),
заиспользовало только один раз регистр xmm0.
• И все 
Click to edit Master title style
Стр. 49
Схема происшествия
Click to edit Master title style
Стр. 50
Happy end
Решение было простым - код крипты вынесли из драйвера в отдельную
статическую библиотеку, и наступило щастье.
2013/11/19. Наш исправленный оптимизированный криптомодуль заработал.
2013/11/22. После тщательнейшей проверки, мы сделали поставку и
отчитались об исправлении бага.
Разработчики получили большие премии за сверхурочную работу.
А радости менеджмента не было конца.
Вывод?
Click to edit Master title style
Стр. 51
Вывод, наша версия
Единственное, что
вас спасет - это
способность вашей
команды быстро
реагировать, когда
это случится.
Click to edit Master title style
Стр. 52
Конец
Спасибо за внимание!
lev.kazarkin@kaspersky.com
lev.kazarkin@gmail.com

Contenu connexe

Tendances

презентация костина сравнение 8.1 7
презентация костина сравнение 8.1 7презентация костина сравнение 8.1 7
презентация костина сравнение 8.1 7sasha4334556
 
книга
книгакнига
книгаyuli2828
 
Игорь Павлов и Глеб Головин
Игорь Павлов и Глеб ГоловинИгорь Павлов и Глеб Головин
Игорь Павлов и Глеб ГоловинCodeFest
 
софткей Diskeeper
софткей Diskeeperсофткей Diskeeper
софткей DiskeeperLiudmila Li
 
Intel desktop processors
Intel desktop processorsIntel desktop processors
Intel desktop processorsKlun
 
Практический опыт применения виртуализации для web-систем
Практический опыт применения виртуализации для web-системПрактический опыт применения виртуализации для web-систем
Практический опыт применения виртуализации для web-системAlex Chistyakov
 
Быстрое начало работы с VTune. Обзор новинок DSP.Super-Resolution для ToF-камер
Быстрое начало работы с VTune. Обзор новинок DSP.Super-Resolution для ToF-камерБыстрое начало работы с VTune. Обзор новинок DSP.Super-Resolution для ToF-камер
Быстрое начало работы с VTune. Обзор новинок DSP.Super-Resolution для ToF-камерMSU GML VideoGroup
 
presentation_r00t_conf
presentation_r00t_confpresentation_r00t_conf
presentation_r00t_confMax Glekov
 
project "Komputer for the gamer"
project "Komputer for the gamer"project "Komputer for the gamer"
project "Komputer for the gamer"artemchik
 
Преимущества облачных сервисов DEPO Cloud на базе новой 22-нанометровой микро...
Преимущества облачных сервисов DEPO Cloud на базе новой 22-нанометровой микро...Преимущества облачных сервисов DEPO Cloud на базе новой 22-нанометровой микро...
Преимущества облачных сервисов DEPO Cloud на базе новой 22-нанометровой микро...DEPO Computers
 
73
7373
73JIuc
 
лекция 17
лекция 17лекция 17
лекция 17JIuc
 
Презентация проекта "Виртуальное частное облако инструмент снижения TCO"
Презентация проекта "Виртуальное частное облако инструмент снижения TCO"Презентация проекта "Виртуальное частное облако инструмент снижения TCO"
Презентация проекта "Виртуальное частное облако инструмент снижения TCO"Радик Кутлов
 
08 сервисное по, средства контроля и диагностики, архиваторы, обслуживание ди...
08 сервисное по, средства контроля и диагностики, архиваторы, обслуживание ди...08 сервисное по, средства контроля и диагностики, архиваторы, обслуживание ди...
08 сервисное по, средства контроля и диагностики, архиваторы, обслуживание ди...Sergey Lomakin
 
33
3333
33JIuc
 
(Не) преждевременная оптимизация проекта на Unreal Engine 4 / Владимир Алямки...
(Не) преждевременная оптимизация проекта на Unreal Engine 4 / Владимир Алямки...(Не) преждевременная оптимизация проекта на Unreal Engine 4 / Владимир Алямки...
(Не) преждевременная оптимизация проекта на Unreal Engine 4 / Владимир Алямки...DevGAMM Conference
 

Tendances (20)

презентация костина сравнение 8.1 7
презентация костина сравнение 8.1 7презентация костина сравнение 8.1 7
презентация костина сравнение 8.1 7
 
книга
книгакнига
книга
 
Игорь Павлов и Глеб Головин
Игорь Павлов и Глеб ГоловинИгорь Павлов и Глеб Головин
Игорь Павлов и Глеб Головин
 
10200
1020010200
10200
 
софткей Diskeeper
софткей Diskeeperсофткей Diskeeper
софткей Diskeeper
 
Intel desktop processors
Intel desktop processorsIntel desktop processors
Intel desktop processors
 
Практический опыт применения виртуализации для web-систем
Практический опыт применения виртуализации для web-системПрактический опыт применения виртуализации для web-систем
Практический опыт применения виртуализации для web-систем
 
os
osos
os
 
Быстрое начало работы с VTune. Обзор новинок DSP.Super-Resolution для ToF-камер
Быстрое начало работы с VTune. Обзор новинок DSP.Super-Resolution для ToF-камерБыстрое начало работы с VTune. Обзор новинок DSP.Super-Resolution для ToF-камер
Быстрое начало работы с VTune. Обзор новинок DSP.Super-Resolution для ToF-камер
 
presentation_r00t_conf
presentation_r00t_confpresentation_r00t_conf
presentation_r00t_conf
 
project "Komputer for the gamer"
project "Komputer for the gamer"project "Komputer for the gamer"
project "Komputer for the gamer"
 
Преимущества облачных сервисов DEPO Cloud на базе новой 22-нанометровой микро...
Преимущества облачных сервисов DEPO Cloud на базе новой 22-нанометровой микро...Преимущества облачных сервисов DEPO Cloud на базе новой 22-нанометровой микро...
Преимущества облачных сервисов DEPO Cloud на базе новой 22-нанометровой микро...
 
73
7373
73
 
лекция 17
лекция 17лекция 17
лекция 17
 
Vba32 rescue user guide
Vba32 rescue user guideVba32 rescue user guide
Vba32 rescue user guide
 
Презентация проекта "Виртуальное частное облако инструмент снижения TCO"
Презентация проекта "Виртуальное частное облако инструмент снижения TCO"Презентация проекта "Виртуальное частное облако инструмент снижения TCO"
Презентация проекта "Виртуальное частное облако инструмент снижения TCO"
 
08 сервисное по, средства контроля и диагностики, архиваторы, обслуживание ди...
08 сервисное по, средства контроля и диагностики, архиваторы, обслуживание ди...08 сервисное по, средства контроля и диагностики, архиваторы, обслуживание ди...
08 сервисное по, средства контроля и диагностики, архиваторы, обслуживание ди...
 
Windows3.1
Windows3.1Windows3.1
Windows3.1
 
33
3333
33
 
(Не) преждевременная оптимизация проекта на Unreal Engine 4 / Владимир Алямки...
(Не) преждевременная оптимизация проекта на Unreal Engine 4 / Владимир Алямки...(Не) преждевременная оптимизация проекта на Unreal Engine 4 / Владимир Алямки...
(Не) преждевременная оптимизация проекта на Unreal Engine 4 / Владимир Алямки...
 

En vedette

Антон Бикинеев, Reflection in C++Next
Антон Бикинеев,  Reflection in C++NextАнтон Бикинеев,  Reflection in C++Next
Антон Бикинеев, Reflection in C++NextSergey Platonov
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерSergey Platonov
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptSergey Platonov
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловSergey Platonov
 
Алексей Кутумов, C++ без исключений, часть 3
Алексей Кутумов,  C++ без исключений, часть 3Алексей Кутумов,  C++ без исключений, часть 3
Алексей Кутумов, C++ без исключений, часть 3Platonov Sergey
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castRoman Orlov
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Yauheni Akhotnikau
 
Фитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в формеФитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в формеIlia Shishkov
 
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
Evgeniy Muralev, Mark Vince, Working with the compiler, not against itEvgeniy Muralev, Mark Vince, Working with the compiler, not against it
Evgeniy Muralev, Mark Vince, Working with the compiler, not against itSergey Platonov
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines Sergey Zubkov
 
Quality assurance of large c++ projects
Quality assurance of large c++ projectsQuality assurance of large c++ projects
Quality assurance of large c++ projectscorehard_by
 
Fuzzing: The New Unit Testing
Fuzzing: The New Unit TestingFuzzing: The New Unit Testing
Fuzzing: The New Unit TestingDmitry Vyukov
 
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Mikhail Matrosov
 
Василий Сорокин, Простой REST сервер на Qt с рефлексией
Василий Сорокин, Простой REST сервер на Qt с рефлексиейВасилий Сорокин, Простой REST сервер на Qt с рефлексией
Василий Сорокин, Простой REST сервер на Qt с рефлексиейSergey Platonov
 

En vedette (18)

Антон Бикинеев, Reflection in C++Next
Антон Бикинеев,  Reflection in C++NextАнтон Бикинеев,  Reflection in C++Next
Антон Бикинеев, Reflection in C++Next
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптер
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
 
Clang tidy
Clang tidyClang tidy
Clang tidy
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
Parallel STL
Parallel STLParallel STL
Parallel STL
 
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионаловПолухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
 
Алексей Кутумов, C++ без исключений, часть 3
Алексей Кутумов,  C++ без исключений, часть 3Алексей Кутумов,  C++ без исключений, часть 3
Алексей Кутумов, C++ без исключений, часть 3
 
Догнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_castДогнать и перегнать boost::lexical_cast
Догнать и перегнать boost::lexical_cast
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
 
Фитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в формеФитнес для вашего кода: как держать его в форме
Фитнес для вашего кода: как держать его в форме
 
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
Evgeniy Muralev, Mark Vince, Working with the compiler, not against itEvgeniy Muralev, Mark Vince, Working with the compiler, not against it
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines
 
Quality assurance of large c++ projects
Quality assurance of large c++ projectsQuality assurance of large c++ projects
Quality assurance of large c++ projects
 
Fuzzing: The New Unit Testing
Fuzzing: The New Unit TestingFuzzing: The New Unit Testing
Fuzzing: The New Unit Testing
 
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
 
Василий Сорокин, Простой REST сервер на Qt с рефлексией
Василий Сорокин, Простой REST сервер на Qt с рефлексиейВасилий Сорокин, Простой REST сервер на Qt с рефлексией
Василий Сорокин, Простой REST сервер на Qt с рефлексией
 

Similaire à Лев Казаркин, Удивительные приключения регистров SSE или в поисках одного бага

Опыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игрыОпыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игрыYuri Zhloba
 
Юрий Жлоба - Опыт использования Erlang в разработке многопользовательской игры.
Юрий Жлоба -  Опыт использования Erlang в разработке многопользовательской игры.Юрий Жлоба -  Опыт использования Erlang в разработке многопользовательской игры.
Юрий Жлоба - Опыт использования Erlang в разработке многопользовательской игры.IT Share
 
How to cook a blockchain and not get burned
How to cook a blockchain and not get burned How to cook a blockchain and not get burned
How to cook a blockchain and not get burned Alexander Syrotenko
 
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проектаКолёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проектаITCrowd Almaty
 
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав БахмутовПлюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав БахмутовYandex
 
Приключения проекта от компьютера разработчика до серьезных нагрузок/ The pro...
Приключения проекта от компьютера разработчика до серьезных нагрузок/ The pro...Приключения проекта от компьютера разработчика до серьезных нагрузок/ The pro...
Приключения проекта от компьютера разработчика до серьезных нагрузок/ The pro...Mad Devs
 
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...Ontico
 
Как перезапустить проблемное приложение и одновременно отладить его
Как перезапустить проблемное приложение и одновременно отладить егоКак перезапустить проблемное приложение и одновременно отладить его
Как перезапустить проблемное приложение и одновременно отладить егоOlga Rusakova
 
Продуктивность и производительность в новых скриптовых языках / Антон Юдинцев...
Продуктивность и производительность в новых скриптовых языках / Антон Юдинцев...Продуктивность и производительность в новых скриптовых языках / Антон Юдинцев...
Продуктивность и производительность в новых скриптовых языках / Антон Юдинцев...DevGAMM Conference
 
Основы информационной безопасности (Владимир Кузьмин)
Основы информационной безопасности (Владимир Кузьмин)Основы информационной безопасности (Владимир Кузьмин)
Основы информационной безопасности (Владимир Кузьмин)CivilLeadersRu
 
Тестируем производительность распределённых систем, Александр Киров (Parallels)
Тестируем производительность распределённых систем, Александр Киров (Parallels)Тестируем производительность распределённых систем, Александр Киров (Parallels)
Тестируем производительность распределённых систем, Александр Киров (Parallels)Ontico
 
Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019
Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019
Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019corehard_by
 
Сергей Житинский, Александр Чистяков (Git in Sky)
Сергей Житинский, Александр Чистяков (Git in Sky)Сергей Житинский, Александр Чистяков (Git in Sky)
Сергей Житинский, Александр Чистяков (Git in Sky)Ontico
 
SWD Page Recorder: Записывает PageObject'ы со скоростью ниндзя SeleniumCamp 2014
SWD Page Recorder: Записывает PageObject'ы со скоростью ниндзя SeleniumCamp 2014SWD Page Recorder: Записывает PageObject'ы со скоростью ниндзя SeleniumCamp 2014
SWD Page Recorder: Записывает PageObject'ы со скоростью ниндзя SeleniumCamp 2014Dmytro Zharii
 
Попасть в мишень
Попасть в мишеньПопасть в мишень
Попасть в мишеньAnton Ignatov
 
Информационная Безопасность. Современные угрозы и области компетенций
Информационная Безопасность. Современные угрозы и области компетенцийИнформационная Безопасность. Современные угрозы и области компетенций
Информационная Безопасность. Современные угрозы и области компетенцийSerghei Epifantsew
 
Как мы собираем проекты в выделенном окружении в Windows Docker
Как мы собираем проекты в выделенном окружении в Windows DockerКак мы собираем проекты в выделенном окружении в Windows Docker
Как мы собираем проекты в выделенном окружении в Windows DockerPositive Hack Days
 
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)Ontico
 

Similaire à Лев Казаркин, Удивительные приключения регистров SSE или в поисках одного бага (20)

Опыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игрыОпыт использования Erlang в разработке многопользовательской игры
Опыт использования Erlang в разработке многопользовательской игры
 
Юрий Жлоба - Опыт использования Erlang в разработке многопользовательской игры.
Юрий Жлоба -  Опыт использования Erlang в разработке многопользовательской игры.Юрий Жлоба -  Опыт использования Erlang в разработке многопользовательской игры.
Юрий Жлоба - Опыт использования Erlang в разработке многопользовательской игры.
 
Windw
WindwWindw
Windw
 
How to cook a blockchain and not get burned
How to cook a blockchain and not get burned How to cook a blockchain and not get burned
How to cook a blockchain and not get burned
 
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проектаКолёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
 
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав БахмутовПлюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
Плюсы и минусы Go для разработчиков на C++, Вячеслав Бахмутов
 
Приключения проекта от компьютера разработчика до серьезных нагрузок/ The pro...
Приключения проекта от компьютера разработчика до серьезных нагрузок/ The pro...Приключения проекта от компьютера разработчика до серьезных нагрузок/ The pro...
Приключения проекта от компьютера разработчика до серьезных нагрузок/ The pro...
 
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
 
Как перезапустить проблемное приложение и одновременно отладить его
Как перезапустить проблемное приложение и одновременно отладить егоКак перезапустить проблемное приложение и одновременно отладить его
Как перезапустить проблемное приложение и одновременно отладить его
 
Продуктивность и производительность в новых скриптовых языках / Антон Юдинцев...
Продуктивность и производительность в новых скриптовых языках / Антон Юдинцев...Продуктивность и производительность в новых скриптовых языках / Антон Юдинцев...
Продуктивность и производительность в новых скриптовых языках / Антон Юдинцев...
 
Основы информационной безопасности (Владимир Кузьмин)
Основы информационной безопасности (Владимир Кузьмин)Основы информационной безопасности (Владимир Кузьмин)
Основы информационной безопасности (Владимир Кузьмин)
 
Тестируем производительность распределённых систем, Александр Киров (Parallels)
Тестируем производительность распределённых систем, Александр Киров (Parallels)Тестируем производительность распределённых систем, Александр Киров (Parallels)
Тестируем производительность распределённых систем, Александр Киров (Parallels)
 
Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019
Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019
Многопоточность в играх. Игорь Лобанчиков. CoreHard Spring 2019
 
HP 3PAR StoreServ 7200
HP 3PAR StoreServ 7200HP 3PAR StoreServ 7200
HP 3PAR StoreServ 7200
 
Сергей Житинский, Александр Чистяков (Git in Sky)
Сергей Житинский, Александр Чистяков (Git in Sky)Сергей Житинский, Александр Чистяков (Git in Sky)
Сергей Житинский, Александр Чистяков (Git in Sky)
 
SWD Page Recorder: Записывает PageObject'ы со скоростью ниндзя SeleniumCamp 2014
SWD Page Recorder: Записывает PageObject'ы со скоростью ниндзя SeleniumCamp 2014SWD Page Recorder: Записывает PageObject'ы со скоростью ниндзя SeleniumCamp 2014
SWD Page Recorder: Записывает PageObject'ы со скоростью ниндзя SeleniumCamp 2014
 
Попасть в мишень
Попасть в мишеньПопасть в мишень
Попасть в мишень
 
Информационная Безопасность. Современные угрозы и области компетенций
Информационная Безопасность. Современные угрозы и области компетенцийИнформационная Безопасность. Современные угрозы и области компетенций
Информационная Безопасность. Современные угрозы и области компетенций
 
Как мы собираем проекты в выделенном окружении в Windows Docker
Как мы собираем проекты в выделенном окружении в Windows DockerКак мы собираем проекты в выделенном окружении в Windows Docker
Как мы собираем проекты в выделенном окружении в Windows Docker
 
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
 

Plus de Sergey Platonov

Антон Бикинеев, Writing good std::future&lt; C++ >
Антон Бикинеев, Writing good std::future&lt; C++ >Антон Бикинеев, Writing good std::future&lt; C++ >
Антон Бикинеев, Writing good std::future&lt; C++ >Sergey Platonov
 
Павел Филонов, Разделяй и управляй вместе с Conan.io
Павел Филонов, Разделяй и управляй вместе с Conan.ioПавел Филонов, Разделяй и управляй вместе с Conan.io
Павел Филонов, Разделяй и управляй вместе с Conan.ioSergey Platonov
 
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияSergey Platonov
 
Антон Полухин. C++17
Антон Полухин. C++17Антон Полухин. C++17
Антон Полухин. C++17Sergey Platonov
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Sergey Platonov
 
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на QtДенис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на QtSergey Platonov
 
Алексей Кутумов, Coroutines everywhere
Алексей Кутумов, Coroutines everywhereАлексей Кутумов, Coroutines everywhere
Алексей Кутумов, Coroutines everywhereSergey Platonov
 
Дмитрий Нестерук, Паттерны проектирования в XXI веке
Дмитрий Нестерук, Паттерны проектирования в XXI векеДмитрий Нестерук, Паттерны проектирования в XXI веке
Дмитрий Нестерук, Паттерны проектирования в XXI векеSergey Platonov
 
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Sergey Platonov
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаSergey Platonov
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковSergey Platonov
 
Dori Exterman, Considerations for choosing the parallel computing strategy th...
Dori Exterman, Considerations for choosing the parallel computing strategy th...Dori Exterman, Considerations for choosing the parallel computing strategy th...
Dori Exterman, Considerations for choosing the parallel computing strategy th...Sergey Platonov
 
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...Sergey Platonov
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Sergey Platonov
 
Антон Нонко, Классические строки в C++
Антон Нонко, Классические строки в C++Антон Нонко, Классические строки в C++
Антон Нонко, Классические строки в C++Sergey Platonov
 
Михаил Матросов, Повседневный С++: boost и STL
Михаил Матросов, Повседневный С++: boost и STLМихаил Матросов, Повседневный С++: boost и STL
Михаил Матросов, Повседневный С++: boost и STLSergey Platonov
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Sergey Platonov
 
Алексей Кутумов, Вектор с нуля
Алексей Кутумов, Вектор с нуляАлексей Кутумов, Вектор с нуля
Алексей Кутумов, Вектор с нуляSergey Platonov
 
Kirk Shoop, Reactive programming in C++
Kirk Shoop, Reactive programming in C++Kirk Shoop, Reactive programming in C++
Kirk Shoop, Reactive programming in C++Sergey Platonov
 
Дмитрий Демчук. Кроссплатформенный краш-репорт
Дмитрий Демчук. Кроссплатформенный краш-репортДмитрий Демчук. Кроссплатформенный краш-репорт
Дмитрий Демчук. Кроссплатформенный краш-репортSergey Platonov
 

Plus de Sergey Platonov (20)

Антон Бикинеев, Writing good std::future&lt; C++ >
Антон Бикинеев, Writing good std::future&lt; C++ >Антон Бикинеев, Writing good std::future&lt; C++ >
Антон Бикинеев, Writing good std::future&lt; C++ >
 
Павел Филонов, Разделяй и управляй вместе с Conan.io
Павел Филонов, Разделяй и управляй вместе с Conan.ioПавел Филонов, Разделяй и управляй вместе с Conan.io
Павел Филонов, Разделяй и управляй вместе с Conan.io
 
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизацияГригорий Демченко, Асинхронность и неблокирующая синхронизация
Григорий Демченко, Асинхронность и неблокирующая синхронизация
 
Антон Полухин. C++17
Антон Полухин. C++17Антон Полухин. C++17
Антон Полухин. C++17
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++
 
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на QtДенис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
 
Алексей Кутумов, Coroutines everywhere
Алексей Кутумов, Coroutines everywhereАлексей Кутумов, Coroutines everywhere
Алексей Кутумов, Coroutines everywhere
 
Дмитрий Нестерук, Паттерны проектирования в XXI веке
Дмитрий Нестерук, Паттерны проектирования в XXI векеДмитрий Нестерук, Паттерны проектирования в XXI веке
Дмитрий Нестерук, Паттерны проектирования в XXI веке
 
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
Александр Тарасенко, Использование python для автоматизации отладки С/C++ код...
 
Павел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладкаПавел Довгалюк, Обратная отладка
Павел Довгалюк, Обратная отладка
 
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворковНикита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
 
Dori Exterman, Considerations for choosing the parallel computing strategy th...
Dori Exterman, Considerations for choosing the parallel computing strategy th...Dori Exterman, Considerations for choosing the parallel computing strategy th...
Dori Exterman, Considerations for choosing the parallel computing strategy th...
 
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...
 
Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++Александр Фокин, Рефлексия в C++
Александр Фокин, Рефлексия в C++
 
Антон Нонко, Классические строки в C++
Антон Нонко, Классические строки в C++Антон Нонко, Классические строки в C++
Антон Нонко, Классические строки в C++
 
Михаил Матросов, Повседневный С++: boost и STL
Михаил Матросов, Повседневный С++: boost и STLМихаил Матросов, Повседневный С++: boost и STL
Михаил Матросов, Повседневный С++: boost и STL
 
Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++Борис Сазонов, RAII потоки и CancellationToken в C++
Борис Сазонов, RAII потоки и CancellationToken в C++
 
Алексей Кутумов, Вектор с нуля
Алексей Кутумов, Вектор с нуляАлексей Кутумов, Вектор с нуля
Алексей Кутумов, Вектор с нуля
 
Kirk Shoop, Reactive programming in C++
Kirk Shoop, Reactive programming in C++Kirk Shoop, Reactive programming in C++
Kirk Shoop, Reactive programming in C++
 
Дмитрий Демчук. Кроссплатформенный краш-репорт
Дмитрий Демчук. Кроссплатформенный краш-репортДмитрий Демчук. Кроссплатформенный краш-репорт
Дмитрий Демчук. Кроссплатформенный краш-репорт
 

Лев Казаркин, Удивительные приключения регистров SSE или в поисках одного бага

  • 1. Click to edit Master title style Об удивительных приключениях регистров SSE и поиске одного бага Лев Казаркин Лаборатория Касперского Группа шифрования данных
  • 2. Click to edit Master title style Стр. 2 Full Disk Encryption от Касперского Сокращенно: FDE Похоже на: TrueCrypt, Bitlocker, только лучше ;) Шифруем мы весь диск целиком, а не только отдельные тома. Предоставляем предзагрузочную аутентификацию – по логину/паролю (а сейчас еще и по смарт-картам). Компьютер нельзя загрузить (с системного диска) в обход этого агента, да и смысла нет – все же зашифровано. Решение централизованно управляется с единого сервера (Kaspersky Security Center). Шифруем безопасно, быстро, недорого, без SMS... ;)
  • 3. Click to edit Master title style Стр. 3 Исторический экскурс • Основано на реальных событиях. • Время действия: Ноябрь 2013. • Второй релиз технологии в продукте Kaspersky Endpoint Security (KES 10). • Стадия высокой готовности к релизу - идет внутреннее развертывание продукта (IRO). • Internal Rollout или dogfooding (как говорят в Microsoft) – "ешь еду своей собаки".
  • 4. Click to edit Master title style Стр. 4 Дальше по плану 1. Матчасть - как устроено FDE от Касперского. 2. Завязка истории. Затем, ее пошаговое развитие. Интерактив! 3. Разоблачение. Не забываем, что у нас детектив, проявляем активность
  • 5. Click to edit Master title style Стр. 5 Архитектура FDE v.1 (endpoint)
  • 6. Click to edit Master title style Стр. 6 Агент предзагрузочной аутентификации выглядел так
  • 7. Click to edit Master title style Стр. 7 Метаданные
  • 8. Click to edit Master title style Стр. 8 Завязка 2013/11/1 от саппорта приходит внутренний баг с IRO. Пользователь из далекой Великобритании пришел утром на работу и обнаружил, что его рабочий комп превратился в кирпич. FDE радостно мигает текстовым курсором на черном экране и сообщает, что кто-то испортил метаданные FDE.
  • 9. Click to edit Master title style Стр. 9 Завязка 2013/11/1 от саппорта приходит внутренний баг с IRO. Пользователь из далекой Великобритании пришел утром на работу и обнаружил, что его рабочий комп превратился в кирпич. FDE радостно мигает текстовым курсором на черном экране и сообщает, что кто-то испортил метаданные FDE.
  • 10. Click to edit Master title style Стр. 10 "Развал" метаданных Метаданные здорового человека: Поврежденная копия:
  • 11. Click to edit Master title style Стр. 11 Первое впечатление •Н у да, у нас есть какой-то неприятный баг. Может быть, в пребуте. • Не страшно. Подумаешь, баг у одного пользователя! • В целом качество продукта не вызывает сомнения. • Продукт же прошел отдел тестирования, преодолел нагрузочное тестиорование на стендах, да и баг проявился только у одного пользователя. • Багу был назначен невысокий, обычный приоритет. НО! Не понятно как его воспроизводить. Что является триггером? Ни на виртуалках, ни на реальном железе не воспроизводится. Как исправлять то, что не воспроизводится?
  • 12. Click to edit Master title style Стр. 12 Гипотеза 1 Включаем воображение! Что может вызвать порчу данных? •Аппаратный сбой – не интересно. •Конфликт клиентов при одновременном доступе! Вот это уже что-то.
  • 13. Click to edit Master title style Стр. 13 Гипотеза 1 Включаем воображение! Что может вызвать порчу данных? •Аппаратный сбой – не интересно. •Конфликт клиентов при одновременном доступе! Вот это уже что-то.
  • 14. Click to edit Master title style Стр. 14 Проверка • Организовали тестирование. • Два клиента в одном Продукте. • Запуск двух экзампляров Продукта одновременно. • ...
  • 15. Click to edit Master title style Стр. 15 Проверка • Организовали тестирование. • Два клиента в одном Продукте. • Запуск двух экзампляров Продукта одновременно. • ... Синхронизация в user mode стойко вынесла все нападки. Конфликта 2х продуктовых клиентов быть не может!
  • 16. Click to edit Master title style Стр. 16 Гипотеза 2. Конфликт Продукта с гибернацией?
  • 17. Click to edit Master title style Стр. 17 Гипотеза 2. Конфликт Продукта с гибернацией? Теоретическая возможность этого обсуждалась уже давно. Но вероятность этих событий в реальной жизни казалась (и была) очень малой. Правильное решение было дорогим. Воспроизвели с первого раза. Ага, кажется, это то, что нужно. Фикс получился очень сложный. Пришлось разработать новый механизм синхронизации доступа к метаданным. Изменить архитектуру, и это во время релиза :) Синхронизация была сделана на основе драйвера Пока шел доступ, гибернация в системе была заблокирована.
  • 18. Click to edit Master title style Стр. 18 2013/11/14, вечер. • Исправления были закоммичены после тщательной проверки и ревью. • Проблема исправлена. • Команда торжествовала. • Конфликт проверяли ручным тестом на разных машинах. • Процесс 1: модифицирует метаданные в цикле. • Процесс 2: вызывает гибернацию, циклически.
  • 19. Click to edit Master title style Стр. 19 2013/11/14, вечер. Был оставлен на ночь Процесс 1, на всякий случай.
  • 20. Click to edit Master title style Стр. 20 2013/11/15, 11 часов дня. Пятница. Что увидели разработчики?
  • 21. Click to edit Master title style Стр. 21 2013/11/15, 11 часов дня. Пятница. ASSERTION FAILED Метаданные изменены после или во время записи на диск. Насчитанная контрольная сумма не совпадает с записанной.
  • 22. Click to edit Master title style Стр. 22 2013/11/15, 11 часов дня. Пятница. ASSERTION FAILED Метаданные изменены после или во время записи на диск. Насчитанная контрольная сумма не совпадает с записанной. Та-да-да-даам. • Один клиент • Никакой гибернации • Машина надежная (виртуальная)
  • 23. Click to edit Master title style Стр. 23 Пожар • Замечательно исправили проблему, но не ту! • Проблема никуда не делась! • У нас есть воспроизведение! • Совершенно не понятно что происходит.
  • 24. Click to edit Master title style Стр. 24 Пожар и сверхурочные Команда мобилизована на воспроизведение. • Проблема вопроизводится, воспроизвести сумели почти все, особенно дело хорошо шло на Windows XP. • Есть условия, сильно улучшающие воспроизведение. Например, если диск активно шифруется, оно ускоряется в разы. • Еще быстрее воспроизведение наступает, если создать сильную нагрузку на диск. • Чемпионом стала однопроцессорная виртуалка с XP. Воспроизведение через минуту! Да, в те годы мы еще поддерживали XP ;)
  • 25. Click to edit Master title style Стр. 25 Пожар и сверхурочные Команда мобилизована на воспроизведение. • Проблема вопроизводится, воспроизвести сумели почти все, особенно дело хорошо шло на Windows XP. • Есть условия, сильно улучшающие воспроизведение. Например, если диск активно шифруется, оно ускоряется в разы. • Еще быстрее воспроизведение наступает, если создать сильную нагрузку на диск. • Чемпионом стала однопроцессорная виртуалка с XP. Воспроизведение через минуту! Да, в те годы мы еще поддерживали XP ;) Что происходит? Как это возможно?
  • 26. Click to edit Master title style Стр. 26 На самом деле • Для воспроизведения проблемы модифицировать метаданные не нужно вовсе. • Достаточно их просто читать. • Чтение метаданных у нас идет через драйвер, через особый IOCTL. Почему? • Т.к. весь диск зашифрован, и все что читает/пишет Windows, шифруется... • Да-да, даже PAGEFILE, HIBERFIL, и даже "синие дампы" - вообще все. • …Доступ к метаданным должен идти другим, нелегальным каналом. То есть, через драйвер.
  • 27. Click to edit Master title style Стр. 27 Тест на чтение метаданных через драйвер Был сделан максимально простой тест. Тест читал с диска через драйвер (тем самым волшебным IOCTL-ом). Ничего лишнего - выделяем память, и читаем в нее с известного места на диске известные данные и сравниваем с образцом. На волшебной виртуалке с XP – воспроизводилось хорошо. У других разработчиков показания разнятся. • Буфер на стеке – нет проблемы. • Холодный буфер через VirtualAlloc() – как из пушки.
  • 28. Click to edit Master title style Стр. 28 Тест на чтение метаданных через драйвер Был сделан максимально простой тест. Тест читал с диска через драйвер (тем самым волшебным IOCTL-ом). Ничего лишнего - выделяем память, и читаем в нее с известного места на диске известные данные и сравниваем с образцом. На волшебной виртуалке с XP – воспроизводилось хорошо. У других разработчиков показания разнятся. • Буфер на стеке – нет проблемы. • Холодный буфер через VirtualAlloc() – как из пушки. Варианты: • виноват драйвер, который как-то странно работает с памятью буфера, тут как-то замешан PAGING, • кто-то стреляет по памяти, внутри процесса, ну или из драйвера как вариант.
  • 29. Click to edit Master title style Стр. 29 Стресс-тест на драйвер с агрессивным пейджингом • Система была еле жива под тяжестью теста. • Но жива. • Для чистоты эксперимента взяты свежие виртуалки, с современными OS. • Windows 7 64, • Windows 8 64, • новейшая Windows 8.1 64, • разные конфигурации, контроллеры диска...
  • 30. Click to edit Master title style Стр. 30 Стресс-тест на драйвер • Система была еле жива под тяжестью теста. • Но жива. • Для чистоты эксперимента взяты свежие виртуалки, с современными OS... НИЧЕГО
  • 31. Click to edit Master title style Стр. 31 Тем временем другие разработчики... Проверялись самые безумные теории. Проверку читаемого с диска буфера довели до полной паранойи.
  • 32. Click to edit Master title style Стр. 32 What? • Внезапно. • Все происходит в юзер моде, без участия драйвера. • Мы просто копируем данные в памяти. В псевдокоде copy(A, B); ASSERT(B == ETALON); ASSERT(A == ETALON); // <--- FAIL!
  • 33. Click to edit Master title style Стр. 33 What? • Внезапно. • Все происходит в юзер моде, без участия драйвера. • Мы просто копируем данные в памяти. В псевдокоде copy(A, B); ASSERT(B == ETALON); ASSERT(A == ETALON); // <--- FAIL!
  • 34. Click to edit Master title style Стр. 34 Подозрительно! VEC_memcpy 10221720 movdqa xmm0,xmmword ptr [esi] 10221724 movdqa xmm1,xmmword ptr [esi+10h] 10221729 movdqa xmm2,xmmword ptr [esi+20h] 1022172E movdqa xmm3,xmmword ptr [esi+30h] 10221733 movdqa xmmword ptr [edi],xmm0 10221737 movdqa xmmword ptr [edi+10h],xmm1 1022173C movdqa xmmword ptr [edi+20h],xmm2 10221741 movdqa xmmword ptr [edi+30h],xmm3 10221746 movdqa xmm4,xmmword ptr [esi+40h] 1022174B movdqa xmm5,xmmword ptr [esi+50h] 10221750 movdqa xmm6,xmmword ptr [esi+60h] 10221755 movdqa xmm7,xmmword ptr [esi+70h] 1022175A movdqa xmmword ptr [edi+40h],xmm4 1022175F movdqa xmmword ptr [edi+50h],xmm5 10221764 movdqa xmmword ptr [edi+60h],xmm6 10221769 movdqa xmmword ptr [edi+70h],xmm7 1022176E lea esi,[esi+80h] 10221774 lea edi,[edi+80h] ...
  • 35. Click to edit Master title style Стр. 35 На самом деле, ч.2 Единственной архитектурой, на которой воспроизводилась проблема, на самом деле была Intel IA32 (x86). Все усилия поиска проблемы со стороны драйвериста были направлены на эту архитектуру AMD64 (тем более что IA32 уже занимаются другие люди ;)) Между архитектурами IA32 и AMD64 есть существенная разница в том, как они работают с плавающей точкой и регистрами SSE. Windows реализует ленивое сохранение контекста FPU (SSE). Экономия 
  • 36. Click to edit Master title style Стр. 36 Ленивое сохранение FP контекста
  • 37. Click to edit Master title style Стр. 37 Ленивое сохранение FP контекста
  • 38. Click to edit Master title style Стр. 38 Ленивое сохранение FP контекста
  • 39. Click to edit Master title style Стр. 39 На самом деле, ч.2 Между архитектурами IA32 и AMD64 есть существенная разница в том, как они работают с плавающей точкой и регистрами SSE. Windows реализует ленивое сохранение контекста FPU (SSE). Экономия  Так вот... • В ядре ОС на IA32 всякое сохранение контекста FPU/SSE должен явно делать программист. • На AMD64 FPU/SSE входит в стандартный набор регистров, сохраняемый в KTRAP_FRAME, то есть, при любом переключении потоков, прерывании и т.д.
  • 40. Click to edit Master title style Стр. 40 Догадка, которая напрашивалась, была чудовищна - Лев, похоже криптомодуль ядра портит конекст SSE. - Угу, но ты представляешь, что это значит? Это значит, что проблеме подвержены все потоки в системе. ВСЕ. Действительно, разве может система еще шевелиться, как ни в чем ни бывало? Это же ходячий труп. - ВСЕЕЕ. Да, это совершенно невероятно. Поэтому я не думаю, что моя гипотеза верна.
  • 41. Click to edit Master title style Стр. 41 2013/11/17, вечер. • Деваться некуда. • Но как конкретно драйвер портит регистры в чужих процессах? • Почему усиление дисковой активности усиливает эффект. • И при чем тут PAGING, почему проблема воспроизводится только при обращении к холодной памяти? • Все входы и выходы в ядерный криптомодуль перекрыты. • Вход в криптопримитив - сохранение (KeSaveFloatingPointState()). • Выход из криптопримитива - восстановление (KeRestoreFloatingPointState()). • Все это завернуто в такой плюсовый автоматический scoped guard, мышь не проползет. • Однако, факты говорили другое.
  • 42. Click to edit Master title style Стр. 42 2013/11/17, вечер. Было сделано 2 вещи: • был собран криптомодуль без инструкций SSE/AES NI, • и в драйвер-фильтр, перед каждым обращением к крипте, была добавлена собственная пара сохранение - восстановление контекста. Оба подхода показали, что проблема уходит. Действительно уходит. Печальный тимлид настраивал поставку криптомодуля без SSE/AES NI оптимизации. Это был наш план Б. А без SSE2 и AES NI шифрование работает в 4-5 раз медленнее.
  • 43. Click to edit Master title style Стр. 43 IDA Pro Метод скрупулезного и тщательного вглядывания в ядерный криптомодуль принес нам это:
  • 44. Click to edit Master title style Стр. 44 IDA Pro Это тело функции SymmetricContext::OSSL_Transform(), той самой, которая выполняет симметричное шифрование/расшифровывание блочным шифром.
  • 45. Click to edit Master title style Стр. 45 SymmetricContext::OSSL_Transform() Вот так она выглядит в коде
  • 46. Click to edit Master title style Стр. 46 SymmetricContext::OSSL_Transform() А ExecutionContext это структурка, которая как раз в среде ядра призвана сохранять FPU context.
  • 47. Click to edit Master title style Стр. 47 IDA Pro Итак Что это? SSE инструкции в коде конструктора? Зачем и откуда они там?
  • 48. Click to edit Master title style Стр. 48 Разоблачение • Спасибо всем, кто помогал команде FDE найти баг ;) • Кто-то за 2 месяца до этого включил SSE2 оптимизацию для всего проекта cm_km.sys, ядерного криптомодуля. • Оптимизация благоприятно сказалась на скорости работы крипты :) • Хотя алгоритмы блочного шифрования на SSE2 и AES-NI написаны на асме, и в оптимизации такого рода не нуждались. • Оказался соптимизирован весь код, даже тот, который находится снаружи оберток KeSaveFloatingPointState()/KeRestoreFloatingPointState(). • Хотя его вроде бы и нет. Или есть? • Зануление полей объекта в одном конструкторе, через memset(), заиспользовало только один раз регистр xmm0. • И все 
  • 49. Click to edit Master title style Стр. 49 Схема происшествия
  • 50. Click to edit Master title style Стр. 50 Happy end Решение было простым - код крипты вынесли из драйвера в отдельную статическую библиотеку, и наступило щастье. 2013/11/19. Наш исправленный оптимизированный криптомодуль заработал. 2013/11/22. После тщательнейшей проверки, мы сделали поставку и отчитались об исправлении бага. Разработчики получили большие премии за сверхурочную работу. А радости менеджмента не было конца. Вывод?
  • 51. Click to edit Master title style Стр. 51 Вывод, наша версия Единственное, что вас спасет - это способность вашей команды быстро реагировать, когда это случится.
  • 52. Click to edit Master title style Стр. 52 Конец Спасибо за внимание! lev.kazarkin@kaspersky.com lev.kazarkin@gmail.com

Notes de l'éditeur

  1. Здравствуйте, друзья! Если вы подумали, что это портрет Евгения Касперского, то и продолжайте так думать ;) Я Лев Казаркин. Работаю в Лаборатории Касперского. И сегодня я расскажу вам историю из жизни команды полнодискового шифрования.
  2. Вы знаете, сейчас стало модно все шифровать. И вот, мы в Лаборатории Касперского тоже шифруем. Наверное, многие слышали о таких технологиях, как TrueCrypt, Bitlocker? Вот, мы создали и продвигаем похожую технологию, правда шифруем мы весь диск целиком, а не только отдельные тома. По-английски Full Disk Encryption. Правильное сокращение - FDE (Эф-Ди-И). Но за 5 с лишним лет мы так привыкли говорить Эф-Дэ-Е, что нас уже не переделать. Поэтому, когда я буду говорить "Эф-Дэ-Е", прошу отнестись с пониманием :) И да, шифруем мы безопасно, быстро, недорого, без SMS... ;)
  3. История, о которой вы сегодня услышите, произошла на самом деле, около 3х лет назад. Но участники тех собыий помнят все, как будто это случилось вчера. Настолько сильны были пережитые эмоции. В те дни готовился второй релиз нашей технологии в составе продукта Kaspersky Endpoint Security. Это такой комбайн по информационной безопасности для корпоративного применения. В нем много всего, начиная от знаменитого антивируса, защиты от сетевых атак, и вот, FDE. И вот, дело зашло так далеко, что шло внутреннее развертывание продукта (IRO). У нас, как и у многих, принята практика, обозначаемая метафорой "сам ешь еду своей собаки". То есть, мы испытываем наши изделия сначала на себе, и только потом уже мучаем наших клиентов. К сожалению, время не позволяет рассказать все смачные подробности. В истории, которая держала команду из 6 разработчиков в напряжении, а руководство в панике порядка 2х недель, более 40 эпизодов. Я постарался выбрать самое интересное, что укладывается в ограниченное время нашей встречи. Я должен заранее извиниться перед теми слушателями, кто пришел послушать историю об идеоматическом C++, в котором наш герой при помощи лямбда-выражений, корутин и шаблонной магии отматывает "столько веревки, чтобы выстрелить себе в ногу". Сегодняшняя история из мира системного программирования. Наш герой тоже стреляет, но не из ружъя, а из пушки. И не в ногу, а в голову. И не в себя, а в соседа. Но и в себя тоже попадает. Так что скорее, наоборот, я покажу как с легкостью плывут и рушатся все прекрасные воздушные замки идиом программирования, с одного неосторожного движения. Если вам все еще интересно, оставайтесь с нами. Будет весело.
  4. Я не просто рассказываю историю. У нас здесь детектив. Это предполагает активную вовлеченность в процесс зрителей. То есть, вас. Я построил свой рассказ так: 0. Самопрезентация. Ее вы уже прослушали, спасибо ;) 1. Матчасть. Кратко введу вас в основы матчасти - как устроено FDE от Касперского. 2. Завязка истории. Затем, ее пошаговое развитие. Интерактив. Заинтригую вас и дам некоторую отправную точку для начала рассуждений. Помните, это детектив, и наша конечная цель - вычислить убийцу. Когда (если) ваш поток идей будет иссякать, я буду делать следующий шаг в рассказывании истории, показывая еще несколько слайдов. В принципе, вы можете поднимать руку и высказывать свою теорию в любой момент на этой фазе. 3. Ну и наконец, полное разоблачение. Независимо от того, насколько точно вами будет угадан источник проблемы, я раскрываю карты. Поехали!
  5. FDE: агент прездагрузочной аутентификации (пребут), драйвер шифрования диска, криптомодуль, фасад (или юзер-модный движок FDE).
  6. А еще у диска есть метаданные. Вот так в упрощенном виде можно их представить.
  7. 2013/11/1 от саппорта приходит внутренний баг с IRO. Пользователь из далекой Великобритании пришел утром на работу и обнаружил, что его рабочий комп превратился в кирпич. FDE радостно мигает текстовым курсором на черном экране и сообщает, что кто-то испортил метаданные FDE.
  8. Испортил так, что верить им нельзя и надо звать какого-то системного администратора. Видимо, обычно администратор приходит и молча все поправляет ;).
  9. Это был развал метаданных. Вот вам для сравнения – метаданные здорового человека. И поврежденная копия. В принципе, все то же самое, только вот с хедером ему как-то не повезло  Вы же помните, что наше решение надежно и безопасно. Так вот, метаданные хранятся на диске в 3х независимых копиях. Практика показала это решение весьма эффективным, дающим колоссальную живучесть FDE от Касперского даже в случае попыток переразбить диск, при появлении бэд-блоков и так далее. И все 3 экземпляра были испорчены совершенно одинаковым образом. Начало заголовка (1ый сектор экземпляра метаданных) было испорчено. Контрольная сумма соответствовала содержимому метаданных с целым заголовком. То есть, кто-то или что-то испортило данные либо на диске, либо в процессе записи после того как был насчитан хэш.
  10. Пришлось крепко взяться за репку и включить воображение. После тщательного всматривания в код, работающий с метаданными, тот, который обеспечивает ввод-вывод с диска, возникла единственная логичная гипотеза. Нам казалось, единственное, что могло с какой-то вероятностью привести к подобной проблеме (кроме аппаратного сбоя) - это конфликт 2х одновременных клиентов, пытающихся обратиться к метаданным. Например, так (рис 1).
  11. Пришлось крепко взяться за репку и включить воображение. После тщательного всматривания в код, работающий с метаданными, тот, который обеспечивает ввод-вывод с диска, возникла единственная логичная гипотеза. Нам казалось, единственное, что могло с какой-то вероятностью привести к подобной проблеме (кроме аппаратного сбоя) - это конфликт 2х одновременных клиентов, пытающихся обратиться к метаданным. Например, так.
  12. Синхронизация в юзер моде оказалась достаточно крепкой и с честью выдержала все эти нападки. Мне кажется, коллеги, здесь самое время начать строить догадки. Если у кото-то есть мысли, я прошу высказываться.
  13. Второй, более сложный вариант конфликта 2х клиентов, который мы рассматривали, это конфликт с гибернацией. Что происходит на этом страшном черно-белом слайде? Это может произойти, например, тогда, когда Продукт идет в фасад FDE, чтобы порулить политикой. Открывает метаданные, что-то делает. В это время машина уходит в гибернацию (или в гибридный сон), вместе с Продуктом. Потом, при пробуждении, стартует пребутовый агент аутентификации. Видит незакрытую транзакцию на метаданных, очень удивляется, откатывает ее и как ни в чем не бывало, загружает систему. И тут Продукт просыпается. Ах да, на чем я остановился! Ага, все, теперь коммит! И поверх уже измененного метафайла накатывается коммит старого варианта данных. На диске фарш, машина после следующей перезагрузки - кирпич.
  14. Оценили коварство сценария? Теоретическая возможность этого обсуждалась уже давно. Но вероятность этих событий в реальной жизни казалась столь малой, а правильное решение - таким дорогим, что закрытие этой дыры всегда откладывалось. Воспроизвели с первого раза. Ага, кажется, это то, что нужно. Фикс получился очень сложный. Пришлось разработать новый механизм синхронизации доступа к метаданным. Изменить архитектуру, и это во время релиза :) Синхронизация была сделана на основе драйвера, который давал доступ к метаданным диска только одному клиенту. В том числе и самому себе, он давал доступ на общих основаниях. И это важно, пока шел доступ, гибернация в системе была заблокирована.
  15. 2013/11/14, вечер. Исправления были закоммичены после тщательной проверки и ревью. Проблема была исправлена. Команда торжествовала. Чтобы убедиться, что новый сложный механизм работает надежно, был слеплен грязный и быстрый ручной тест. Который включал 2 процесса 1 в бесконечном цикле долбит метаданные - сначала открывает, затем что-то меняет, ну и делает коммит. И так далее. 2ой в бесконечном цикле кладет систему в гибернацию. Потом небольшой таймаут, и снова. Это потестировали руками на виртуалках и физических машинах. Как вы понимаете, чтобы пробуждать машину из гибернации, нужен человек. А значит, гонять такой тест в автоматическом режиме было затруднительно.
  16. На ночь мы поставили только 1ый процесс без 2го на виртуалке и физической машине. Примерно с таким кодом. На всякий случай. Чтобы быть еще больше уверенными, что у нас все хорошо. И, довольные собой, разошлись по домам.
  17. 2013/11/15, 11 часов дня. Пятница. Отдохнувшие после вчерашнего кошмара разработчики вышли на работу. Каково же было их удивление, когда они между делом поинтересовались, как там наш тест. Подойдя к машине, они увидели...
  18. 2013/11/15, 11 часов дня. Пятница. Отдохнувшие после вчерашнего кошмара разработчики вышли на работу. Каково же было их удивление, когда они между делом поинтересовались, как там наш тест. Подойдя к машине, они увидели... А вот и нет. Они увидели, что сработал ASSERT. Тест работал в отладочной конфигурации. Он проехал порядка 8 часов и остановился. И вот, в одной из операций коммита в метаданные, после сотен тысяч итераций, контрольная сумма на метаданные, насчитанная после коммита не сошлась с той, что записана на диск. Да, да, в дебажном коде делалась, и делается по сей день эта параноидальная проверка.
  19. Та-да-да-даам. Никакой гибернации. Никакого конфликта при доступе, один клиент. Произошло то, чего никто не ожидал. Был подключен отладчик, и мы увидели картину порчи заголовка метаданных. Первые 16 байт затерты нулями. Все как у пользователя из далекой Британии.
  20. Стало понятно, что мы замечательно исправили проблему, но не ту. Стало понятно, что проблема никуда не делась. Но! У нас появилось живое воспроизведение! И было совершенно непонятно что происходит. Об всем этом было немедленно доложено руководству. И с этого момента началась паника и пожар. Паника и пожар, как вы понимаете, с той минуты не прекращались вплоть до самого хэпи энда. Ну а нам с вами до этого хэппи-энда еще очень далеко.
  21. Все, кого было возможно мобилизовать, были мобилизоаны на работу в выходные. Был организован непрекращающийся мозговой штурм. Все, и стар и млад, пытались воспроизводить. На разных конфигурациях аппаратуры, с разной версией OS, на разных стадиях шифрования диска. Довольно скоро стали появляться факты: Проблема вопроизводится, воспроизвести сумели почти все, особенно дело хорошо шло на Windows XP. Есть условия, сильно улучшающие воспроизведение. Например, если диск активно шифруется, оно ускоряется в разы. Еще быстрее воспроизведение наступает, если создать сильную нагрузку на диск. Но чемпионом стала однопроцессорная виртуалка с XP. Воспроизведение там (под нагрузкой) наступало через минуту. Да, в те годы мы еще поддерживали XP ;) Команда была в шоке. Что происходит? Как это возможно? Строили мы строили, и наконец построили (C). Мы же тестировали - успокаивали мы свою совесть :) Мы же все сделали - автоматический запуск юнит-тестов на конвейере, и нагрузочные тесты были. И тестлаб провел все тесты по тестпланам. Были задействованы опытные тестировщики. Еще больше удивлялось руководство направления FDE. И уже совсем сильно недоумевало руководство Продукта.
  22. Команда была в шоке. Что происходит? Как это возможно? Строили мы строили, и наконец построили (C). Мы же тестировали - успокаивали мы свою совесть :) Мы же все сделали - автоматический запуск юнит-тестов на конвейере, и нагрузочные тесты были. И тестлаб провел все тесты по тестпланам. Были задействованы опытные тестировщики. Еще больше удивлялось руководство направления FDE. И уже совсем сильно недоумевало руководство Продукта.
  23. На другой день стало понятно, что для воспроизведения проблемы модифицировать метаданные не нужно вовсе. Достаточно их просто читать. Много, под хорошей нагрузкой на диск. Чтение метаданных у нас идет через драйвер, через особый IOCTL. Почему? Да потому, что при обычном обращении к диску, напрмер, через файловый API, данные подвергаются шифрованию. Вы же помните, мы - полнодисковое шифрование. Все, что пишет или читает Windows, мы шифруем (расшифровываем). Включая PAGEFILE, файл гибернации и даже "синие дампы" - вообще все. А метаданные не подлежат шифрованию, по очевидным причинам. Так что если надо поработать с ними, надо провезти данные как-то нелегально.
  24. Был сделан максимально простой тест. Тест читал с диска через драйвер (тем самым волшебным IOCTL-ом). Ничего лишнего - выделяем память, и читаем в нее с известного места на диске известные данные и сравниваем с образцом. На той самой волшебной виртуалке с XP новый тест также воспроизводил проблему на ура. И вот тут сюрпризы продолжились. Оказывается, если выделить небольшой буфер на стеке, и читать в него, проблема перестает воспроизводиться. А вот если каждый раз вызывать VirtualAlloc(), и читать в холодную память, то как из пушки. Первые 16 байт - нули. Никому ничего не напоминает? У кого есть идеи, что тут происходит? Правильно, любой опытный разработчик скажет вам, что тут 2 варианта: * виноват драйвер, который как-то странно работает с памятью буфера, тут как-то замешан PAGING, к бабке не ходи, * кто-то стреляет по памяти, внутри процесса, ну или из драйвера как вариант. Драйвер FDE - довольно сложная штука. В нем теоретически много чего может быть, разные проблемы. Некоторые проблемы приходилось вылавливать несколько дней, такие как гонка между запросами на ввод-вывод. Могла быть и гонка с memory manager-ом при пейджинге страниц. Короче, нужен был стресс-тест на ввод-вывод через драйвер в холодную память.
  25. Правильно, любой опытный разработчик скажет вам, что тут 2 варианта: * виноват драйвер, который как-то странно работает с памятью буфера, тут как-то замешан PAGING, к бабке не ходи, * кто-то стреляет по памяти, внутри процесса, ну или из драйвера как вариант. Драйвер FDE - довольно сложная штука. В нем теоретически много чего может быть, разные проблемы. Некоторые проблемы приходилось вылавливать несколько дней, такие как гонка между запросами на ввод-вывод. Могла быть и гонка с memory manager-ом при пейджинге страниц. Короче, нужен был стресс-тест на ввод-вывод через драйвер в холодную память.
  26. Внимательное изучение кода драйвера, написание жесточайших стресс тестов, специально сталкивающих пейджинг и чтение в ту же память через драйвер, никак не помогло. Под этими тестами система кряхела, ползла, замирала, дергалась. Система была еле жива. Ее кобасило, но она не умирала, и не обнаруживала проблемы коррапта данных. Были взяты специально другие, свежие виртуалки, для чистоты эксперимента, так сказать. С современными актуальными операционными системами. Кто его знает, может быть с виртуалкой, дававшей самое стабильное воспроизведение, что-то не чисто? Проблема настолько мутная, что факты требовали проверки и перепроверки. Баг не хотел проявляться. Упорно, несмотря на то, что я тестировал на множестве конфигураций: на Windows 7 64, на Windows 8 64, на новейшей Windows 8.1 64, с разным числом процессоров, количеством памяти, разным типом дискового контроллера.
  27. Результат? Ничего. Не воспроизводится. Вообще.
  28. Параллельно другие разработчики продолжали изучать то, что давало какие-то результаты. Проверялись самые безумные теории. Проверку читаемого с диска буфера довели до полной паранойи. Буфер читался с диска, затем копировался в другой буфер, и потом оба сравнивались между собой и с эталоном. Примерно вот так. Никто уже не мог толком объяснить зачем и почему мы проверяем то, что казалось бы, проверено и очевидно. Команда, понимая, что мы провалились в бочку со сметаной, что называется, "взбивала сметану в масло".
  29. И вот, один из таких тестов выявил вещь, которая просто взорвала мозг. При некоторых копированиях прочитанных данных в другой буфер, а все происходит в юзер моде, без участия драйвера. Так вот, в начале одной из страниц возникали те же 16 байтов нулей. Все, что было задействовано в промежутке от хорошего буфера - к плохому, это только функция memcpy(). Еще раз, медленно, в псевдокоде copy(A, B); ASSERT(B == ETALON); ASSERT(A == ETALON); // <--- FAIL! Это воспроизвелось сначала один раз, потом другой. Разработчики отказывались верить глазам своим.
  30. Вот такой была моя реакция.
  31. Слишком уж волшебной была эта виртуалка, до подозрительного подозрительная. Но мы были просто обязаны найти объяснение - это же происходило с нашим кодом, черт возьми! Поскольку в проекте была включена SSE2-оптимизация, это был векторизованный вариант memcpy(). Выглядел он примерно так. Высказывайтесь, коллеги. Может быть, у кого-то возникли вопросы?
  32. Внимательный зритель, наверняка уже заподозрил неладное. Некоторую нестыковку в рассказе. Чуть выше я говорю про то, что жесточайшие тесты на драйвер не выявили проблемы. И тут же сравнительно простой тест у другого разработчика, на его виртуалке, находит проблему легко. Дело в том, что мы упустили из виду важный нюанс. Единственной архитектурой, на которой воспроизводилась проблема, на самом деле была Intel IA32 (x86). А с самого начала кто-то, уже невозможно установить кто, пустил следствие по ложному следу, сообщив, что проблема воспроизводится на архитектуре AMD64 (Intel EM64T) тоже. Неудивительно, что, раз эта архитектура более сложная, более важная на практике и основные усилия поиска проблемы со стороны драйвериста были направлены на эту архитектуру. И ничего не находилось. Многие опытные разработчики знают это, но я на всякий случай напомню. Дело в том, что между архитектурами IA32 и AMD64 есть существенная разница в том, как они работают с плавающей точкой и регистрами SSE. На IA32, еще со времен процессора 286, сопроцессор архитектурно отделен от набора регистров общего назначения. И Windows (да и другие операционные системы) исповедуют ленивое сохранение контекста. Они экономят на лишних операциях выгрузки/загрузки регистров FPU/SSE исходя из соображения, что далеко не все программы используют эти регистры, и поэтому на оттягивании момента сохранения этих регистров можно сэкономить.
  33. Работу механизма сохранения FPU контекста можно проиллюстрировать таким примером.
  34. Это когда-то давала хорошое сокращение задержки на переключении контекста потоков. В наше время повальной оптимизации всего под SSE/SSE2 и так далее, это уже скорее лишнее усложнение, которое мало что экономит. И тем более в ядре ОС всякое сохранение контекста FPU/SSE должен явно делать программист. Вот такой закат солнца вручную. В AMD64 разработчики отбросили многое из старого балласта и включили регистры SSE в стандартный набор регистров, сохраняемый в KTRAP_FRAME, то есть, при любом переключении потоков, прерывании и т.д. Но если мы захотим использовать совсем новые регистры, типа из расширения AVX, история повторяется. Нам опять придется заботиться об их сохранении в ядре.
  35. - Лев, похоже криптомодуль ядра портит конекст SSE, - осторожно сказал мне коллега. - Угу, - ответил я, - но ты представляешь, что это значит? Это значит, что проблеме подвержены все потоки в системе. ВСЕ. Действительно, разве может система еще шевелиться, как ни в чем ни бывало? Это же ходячий труп. - ВСЕЕЕ. Да, - соглашался коллега Евгений, - это совершенно невероятно. Поэтому я не думаю, что моя гипотеза верна. Это дословная цитата из диалога разработчиков, которая сохранилась в чате. И ярчайший пример того, как люди до конца отрицают уже практически очевидные, но невероятные, и пугающие их страшные факты :)
  36. Деваться некуда. К концу того дня мы были готовы принять уже эту гипотезу. Но как конкретно драйвер портит регистры в чужих процессах? Почему усиление дисковой активности усиливает эффект. И при чем тут PAGING, почему проблема воспроизводится только при обращении к холодной памяти? Мы, конечно же, знали как работает сохранение контекста FPU в ядре. Как говорится, "не первый год замужем". И все входы и выходы в ядерный криптомодуль были перекрыты. Вход в криптопримитив - сохранение (KeSaveFloatingPointState()). Выход из криптопримитива - восстановление (KeRestoreFloatingPointState()). Все это завернуто в такой плюсовый автоматический scope guard, мышь не проползет. Однако, факты говорили другое.
  37. Было сделано 2 вещи: был собран криптомодуль без инструкций SSE/AES NI, и в драйвер-фильтр, перед каждым обращением к крипте, была добавлена собственная пара сохранение - восстановление контекста. Оба подхода показали, что проблема уходит. Действительно уходит. И в принципе причина понятна, но вот что конкретно мы делаем не так? ;) Печальный тимлид сидел обхватив голову руками. Он настраивал поставку криптомодуля без SSE/AES NI оптимизации. Это был наш план Б на худший случай. А без AES NI шифрование работает в 4-5 раз медленнее... Друзья, у кого есть идеи? Как помочь команде FDE?
  38. Я не уверен, что всем хорошо видно, поэтому я увеличу начало.
  39. Откуда они там? Занавес.
  40. Спасибо всем, друзья, кро проявил активность в обсуждении. У вас были классные гипотезы... ;) Все оказалось просто. Кто-то за 2 месяца до этого включил SSE2 оптимизацию для всего проекта cm_km.sys, ядерного криптомодуля. Спору нет, оптимизация благоприятно сказалась на скорости работы крипты :) Хотя самое главное, алгоритмы блочного шифрования на SSE2 и AES-NI написаны на асме, и в оптимизации такого рода не нуждались. Но оказался соптимизирован весь код, даже тот, который находится снаружи оберток KeSaveFloatingPointState()/KeRestoreFloatingPointState(). Хотя его совсем чуть. Вот, зануление полей объекта в одном конструкторе, через memset(), заиспользовало только один раз регистр xmm0. И все, погиб криптомодуль и вся система с ним.
  41. Собственно, вот типичный сценарий порчи данных. Вы спросите, а как это прошло мимо тестирования? Очень просто. Проблема проявлялась только под большим стрессом, и только на старых 32-битных системах. Поэтому она и не была обнаружена командой тестирования и стресс-тестами - основной упор там делался на современные 64-битные системы. Позже незадачливый автор коммита признался, что хотелось иметь общую кодовую базу для ядра и юзер-мода. И обертки KeSaveFloatingPointState()/KeRestoreFloatingPointState() были вставлены в криптомодуль, под #ifdef. А о том, что может быть соптимизирован другой код (которого даже не видно, но он есть!), было забыто.
  42. Решение было простым - код крипты вынесли из драйвера в отдельную статическую библиотеку, и наступило щастье. 2013/11/19. Наш исправленный оптимизированный криптомодуль заработал. 2013/11/22. После тщательнейшей проверки, мы сделали поставку и отчитались об исправлении бага. Несомненно, это был баг года 2013. Разработчики получили большие премии за сверхурочную работу. А радости менеджмента не было конца. И в завершение мне хочется спросить вас, коллеги. Как вы думаете, может ли эта история нас чему-то научить? А вас? ;) Какой бы вы сделали вывод? Предлагайте.
  43. Вы знаете, я сам долго думал, и у меня есть свой вариант вывода. Казалось бы история настолько неоднозначна, что не дает никаких волшебных рецептов, никаких серебряных пуль. Команды можно винить в произошедшем, но способа надежно защищиться, избежать таких ошибок в будущем тоже не демонстрируется. Ну какая тут мораль? Зачем вообще все это рассказано? Однако, кое-что все-таки есть. То, что я понял, я формулирую так: Любой проект может столкнуться проблемой любого уровня сложности на стадии релиза, или уже после него. Предвидеть появление такой проблемы невозможно, от нее не спасут ни хорошее тестовое покрытие, ни прекрасная архитектура, ни отлично спланированное исполнение проекта. Все эти меры существенно снижают риск. Существенно! Но никогда не устраняют его до конца. Оказывается, на этот случай есть наставление в знаменитом сборнике принципов руководителей проектов NASA. Оно гласит: Единственное, что вас спасет - это способность вашей команды быстро реагировать, когда это случится. Вот и ответ не поставленные выше вопросы. И прямое руководство к действию :)
  44. Cпасибо вам за внимание!