
Мир программирования «многоэтажный»: пока одни разработчики делают приложение для какой-то ОС, другие делают саму эту ОС. Пока одни используют в работе компилятор, другие работают над новой версией этого компилятора.
Мы уже много лет проводим конференции по разработке на самых разных языках, от JS до C++. Но теперь «спускаемся ниже», и в эту субботу впервые проведём конференцию по системному программированию sysconf. Она пройдёт в Москве, но можно участвовать и онлайн.
Продюсером конференции (главным отвечающим за неё человеком) стал Иван Углянский, который сам с головой погружен в мир системного программирования. Вы можете помнить его выступление «Один день из жизни JVM-инженера».

Иван Углянский
Huawei
И чтобы Хабр знал, чего ожидать на sysconf, мы задали ему несколько вопросов, а также собрали в этом посте описания всех докладов.
— Как эта конференция возникла? Почему было решено, что такая нужна?
— Тут две основные причины.
Во-первых, многие конференции JUG Ru Group славятся своей хардкорностью. Это выражается в том, что часть докладов покрывает очень глубокие, низкоуровневые темы: рассказы про устройство JVM на JPoint/Joker, про V8 на HolyJS, огромное количество компиляторных докладов на C++ Russia и т.д. Такие доклады рассказывают как раз системщики, но их аудитория при этом скорее прикладные программисты. Т.е. по факту это такой глубокий классный и сложный, но все-таки научпоп. А что про самих системщиков? Нам хотелось, чтобы было место, где они смогут чувствовать себя, как дома, рассказывать про свои реальные рабочие темы, про детали разработки компиляторов или осей, перед соответствующей публикой.
Ну и во-вторых, мы видим аналогичный запрос от самих системщиков. Часть из них чувствуют нехватку мест, где бы они могли собраться вместе и что-то обсудить. Сейчас для этого максимально подходящий момент. На фоне происходящих событий у нас, например, в огромном количестве компаний разрабатывают свои операционные системы. Где им обсуждать свою работу? А таких мест очень мало, именно поэтому редкие митапы или конференции на эти тему пользуются большим успехом. Мы хотим собрать как можно больше таких людей вместе.
— Какова целевая аудитория конференции? Понятно, что «системные программисты», но как очертить границы этого понятия и какое внутреннее разделение на подвиды важно?
— Да, системное программирование — это очень широкая область, при том у каждого системщика в голове свое определение (это часто порождает очень бурные споры). Поэтому мы решили ограничиться следующими темами, определив на конференции 3 тематических трека:
а) Трек про компиляторы, виртуальные машины и дизайн языков программирования. Тут все понятно: это те самые системщики, которые рассказывают на прикладных конференциях, как работает JIT компилятор или GC. Только здесь они будут рассказывать на совсем другом, более детальном и глубоком уровне.
б) Трек про операционные системы, драйвера и эмуляторы. Это совсем другая категория системных программистов (и тут тоже могут быть споры, стоит ли объединять их всех в одну категорию! но так уж мы решили). Здесь речь скорее про более низкий уровень и близость к железу (хотя, современная разработка операционных систем - это не только писать загрузчики на асме, но и более высокоуровневый код, например, подсистемы управления памятью, там важнее алгоритмы, чем элегантность ассемблерных инструкций).
в) Трек про так называемое «прикладное системное программирование». Здесь идея в том, чтобы собрать более прикладных программистов, которые в своей работе опускаются на самый низкий уровень, чтобы, например, добиться производительности. А еще это такая сборная солянка из тем про системщину, которые нам нравятся, но под которые целый трек не набирается: поисковые движки, распределенные системы, движки баз данных, разработка высокопроизводительных мат. библиотек и так далее. Сюда же отнесем разработку инструментов для системных программистов: эмуляторы, низкоуровневые отладчики типа gdb и lldb и так далее.
Если одно из этих описаний западает вам в душу и перекликается с областью ваших профессиональных интересов, то вот вам это и будет полезно :)
— А много ли в России вообще системного программирования?
— Даже перед стартом подготовки мы знали, что системщины в России много (лично я знал это даже на примере Хуавея, в котором я сам работаю тем самым системным программистом). Но во время подготовки мы поняли, что его просто какое-то огромное количество. Как я уже говорил выше, каждая уважающая себя большая корпорация нынче разрабатывает свою операционную систему (возможно и не одну) и держит собственный отдел компиляторщиков. И это не говоря уже и компаниях чистых системщиков или целых профильных институтов типа ИСП РАН. В общем, нас много, очень много.
— А есть ли у системного программирования в России какое-то единое комьюнити — например, какой-то один чат, где «сидят сразу все»?
— Кажется, что единого комьюнити пока нет. Есть общие чаты компиляторщиков, например, но вот совсем для всех единого места пока нет. Надеемся, что и сможем такое место создать!
Программа
Трек про компиляторы, виртуальные машины и дизайн языков программирования
Компиляторные технологии в верификации аппаратного обеспечения

Константин Владимиров
Syntacore
Поговорим про генератор тестов llvm-snippy, построенный на основе фреймворка LLVM для системной верификации RISC-V ядер.
Рассмотрим место генераторов в верификации, существующие подходы к написанию генераторов, а также обсудим, чем могут помочь компиляторные технологии. Рассмотрим возможности генератора llvm-snippy и его применение в существующих open source-проектах. Коснемся некоторых принципиальных сложностей в генерации кода для специфичных расширений RISC-V, например для RVV.
Покажу, как возможности инфраструктуры LLVM взаимодействуют с возможностями, специфичными для конкретных платформ. Кроме того, рассмотрим проблемы генерирования программ, работающих с числами с плавающей точкой.

Евгений Пройдаков
Positive Technologies
Впервые я познакомился с WebAssembly еще в игровой индустрии 10 лет назад, когда занимался программированием графики и бизнес-логики. Unreal Engine показал впечатляющие демо. Казалось, технология стала достаточно зрелой, чтобы использовать ее для решения исполнения бизнес-логики по детектированию угроз для ИБ в высоконагруженных серверных бэкенд-приложениях. Но прежде чем изменять уже работающий и коммерчески успешный продукт, мы с командой провели ряд экспериментов с отладкой и производительностью. Расскажу, что понравилось, а что — нет и почему приняли решение не переходить на WebAssembly.
Компиляторный бенчмаркинг и JIT-компиляция

Анастасия Черникова
Syntacore
Обсудим инструмент автоматического бенчмаркинга llvm-exegesis и то, какие проблемы он помогает решать.
Недавно появилась поддержка RISC-V backend: расскажу про ее особенности, реализацию и о том, что еще предстоит сделать. Подробно представлю режимы работы и опции запуска, чтобы каждый уже в конце доклада смог полноценно использовать llvm-exegesis для решения своих задач.
Бонус: познакомлю вас с llvm-jit и расскажу, как использовать его в качестве самостоятельного инструмента.
BOLT: новый подход к оптимизации производительности без пересборки ПО

Василий Леоненко
Оптимизация производительности ПО — это непрерывный процесс как для разработчиков приложений, так и для разработчиков инструментов создания ПО. Рост объемов обрабатываемых данных и требуемых для этого мощностей приводит к необходимости использования больших вычислительных центров обработки данных (ЦОД). Увеличение производительности приложений, требующих большие вычислительные мощности, приносит пользу как самим разработчикам, ускоряя обработку данных, так и операторам ЦОД, снижая затраты на работу этих приложений.
BOLT (Binary Optimization and Layout Tool) сейчас часть проекта LLVM. Он был разработан для повышения производительности приложений путем переупорядочивания расположения кода в выходном исполняемом файле в соответствии с входным профилем без необходимости повторной сборки приложения из исходного кода. Изначально BOLT был разработан для повышения производительности больших исполняемых файлов, работающих в центрах обработки данных, но сегодня предпринимаются попытки использовать его в приложениях, работающих, в том числе, на пользовательских компьютерах или даже телефонах.
Расскажу о проекте BOLT, его текущем состоянии и основных внутренних компонентах. Поделюсь опытом разработки расширений для BOLT, направленных на устранение известных функциональных ограничений, и результатами применения BOLT на реальном ПО.
Будет полезно разработчикам, которые ищут возможность улучшения производительности ПО без необходимости изменения его исходного кода.
V8: RISCованные недра Chromium

Илья Гаврилин
Syntacore
Знаете ли вы, как браузер справляется со сложными веб-страницами, больше похожими на приложения на JavaScript? Как умудряется быстро исполнять код на языке, где выражение (‘b’ + ‘a’ + +’a’ + ‘a’).toLowerCase() равно «banana»? Приготовьтесь заглянуть под капот V8 — движка JavaScript, который делает браузер быстрым и эффективным. В докладе раскрою тайны многокомпиляторной архитектуры и поделюсь радостной новостью: наша команда реализовала бэкенд компилятора для RISC-V и заапстримила его в Google. Будет интересно, местами неожиданно, и точно не без юмора (и ассемблера)!
Вы увидите:
Как браузер открывает новую вкладку.
Почему JavaScript — язык «с сюрпризами» и как это влияет на производительность.
Зачем в V8 используются несколько компиляторов одновременно.
Как наша команда добавила поддержку RISC-V в компилятор V8.
Трек про операционные системы, драйвера и эмуляторы
Доверенная загрузка в современной ОС: функции, особенности, применение

Константин Карасев
Открытая мобильная платформа
Полноценное обеспечение безопасности устройства требует построения многоступенчатой, эшелонированной системы защиты, механизмы которой начинают работать с момента включения устройства, однако загрузкой операционной системы функции доверенной загрузки не ограничиваются.
Обсудим особенности и практические аспекты, которые важно учитывать при реализации системы доверенной загрузки на примере «Аврора СДЗ» для процессоров Baikal-M. Рассмотрим различные подходы к организации доверенной загрузки. Кроме того, коснемся существующих стандартов в этой области, проанализируем их достоинства и недостатки. Увидим, как средство доверенной загрузки интегрируется с другими компонентами системы для построения глубокоинтегрированной, многоступенчатой защиты устройства.
Ремонт обхода кадров стека в ядре Linux для RISC-V

Матвей Быстрин
YADRO
Вероятно, каждый разработчик сталкивался с печатью стека вызовов. И чаще всего такая печать ассоциируется с возникновением ошибок, однако обход стека используется и в ряде других случаев.
В докладе поговорим про работу механизма обхода кадров стека в ядре Linux и его применениях. Расскажу об ошибке, с которой я столкнулся, и как с ней боролся. Позапускаем gdb, разберем дизассемблированный код, изучим небольшой кусок спецификации и, конечно, посмотрим на исходный код ядра. Кроме того, затронем тему компилятора, немного заглянув «под капот» gcc.
Будет интересно любителям нетривиальных проблем, фанатам разбора байтов и почитателям архитектурно-специфичного кода.
Репликация памяти для NUMA-систем

Денис Дарвиш

Никита Панов
NUMA-машины имеют различную цену доступа к памяти в зависимости от топологии. Различия во времени доступа в несколько раз для локальной и «удаленной» памяти — обычное дело. Расскажем, как репликация RO-памяти и таблиц трансляции в ядре и пространстве пользователя помогает увеличить производительность приложений на NUMA-системах.
A Deep Dive into Smart Device Memory Management

Дмитрий Рокосов
SberDevices

Алексей Романов
SberDevices
Мы в компании делаем девайсы двух типов: AOSP-based и Linux-based. Некоторые из них более требовательны к памяти как к ресурсу, некоторые — менее. Но во всех девайсах мы сталкиваемся с одинаковыми проблемами в memory management, а именно: low memory profile, memory performance, kswapd & OOM, effective memory tracing, memory leaks, video memory handling + DMA, secure memory buffers. Расскажу, как мы боремся с ними.
Memory effective RCU B+ дерево

Вадим Иванов

Артём Кузин
Помимо сложности в проектировании и реализации RCU-safe структуры данных, есть существенные накладные расходы, связанные с большим количеством аллокаций памяти при вставке и удалении. Несмотря на то, что в большинстве случаев такие решения направлены на увеличение производительности на стороне чтения, существуют случаи, когда производительность вставки и удаления ключей не менее важна. Например, для Maple tree, которое использует Linux kernel для управления VMA, можно выделить два типа нагрузки:
чтение — speculative page faults;
вставка/удаление — mmap()/munmap().
В докладе поделимся нашим опытом разработки memory effective RCU-safe B+ дерева и его интеграцией в Linux kernel для управления VMA.
Мультиплексирование ввода/вывода в Linux

Даниил Щепетильников
Getmobit
Погружение в мультиплексирование ввода/вывода в Linux:
как устроен ввод/вывод в Linux;
как работает мультиплексирование внутри ядра с реализацией pipe в качестве примера;
экскурс в историю: select & poll, проблема C10k, epoll и его устройство;
краткий экскурс в io_uring. Подойдет для любого специалиста, разрабатывающего под Linux.
Низкоуровневая безопасность: нужно, можно, не рекомендуем

Анна Мелехова
Kaspersky
Атаки на ядро становятся всё изощреннее, защита системы требует все более сложных подходов. Простые ошибки, такие как переполнения или use-after-free, были и остаются в ядре и драйверах, но им противостоят железные харденинги, компиляторные фичи и самописные механизмы защиты.
В докладе я хочу пойти по бинарщине и сосредоточиться на побочных эффектах кернельных харденингов. Это будет хардкорный путь с погружением в детали, где мы поговорим о многоликом CFI и о такой простой, но такой разной стековой канарейке. Обсудим, почему KASLR в ядре обходится без PIE и почему SMAP утяжеляет переключение контекста. Возможно, этот доклад поможет вам понять, насколько за последние 10 лет изменился кернельный код в disasm. В завершение поделюсь личным топом самых эффективных и рабочих харденингов микроядра для KasperskyOS.
Трек про «прикладное системное программирование»
Особенности и возможности внешних отладчиков на примере RISC-V OpenOCD и не только

Евгений Найданов
Syntacore
Краткий обзор инструментов отладки, а также механизмов и интерфейсов, используемых внешними отладчиками. Особенности реализации некоторых типовых операций на примере OpenOCD. Методы, которые использует отладчик для обеспечения эффективного доступа к ресурсам платформы.
Устройство многопоточного рантайма движков ВКонтакте

Никита Костливцев
VK
ВКонтакте используют движки (кастомные NoSQL базы данных) для решения разных задач: от хранения key-value значений до подбора рекламы.
Расскажу, как устроен многопоточный асинхронный рантайм движков, какие примитивы синхронизации в нем используются, на какие виды они делятся и как менялись со временем. Поговорим о том, какая очередь была выбрана для использования в этих примитивах и почему она нам понравилась настолько, что интегрировалась в весь рантайм. Разберем, какие алгоритмы safe memory reclamation применялись. Много идей при разработке runtime-движков взяли из библиотек Kotlin Coroutines, Rust Tokio и языка Golang.
Доклад будет полезен разработчикам многопоточных фреймворков.
Анатомия фаззинга для ядра Linux

Максим Пелевин
Российский исследовательский институт
Фаззинг — это отличная техника, которая позволяет находить сложные проблемы. И хотя эта техника тестирования достаточна проста на начальных этапах, она быстро становится запутанной. Эта запутанность возникает по разным причинам: специфика тестируемой системы, возможности тулинга для разработки, теоретические нюансы. Но, если приглядеться, можно увидеть в каждом фаззере знакомые черты. Цель этого доклада — проявить эти черты и на примере syzkaller (фаззера для тестирования ядра ОС) показать, как приспосабливается архитектура фаззера в конкретном случае.
Надежно пишем в сокет: как Rust помогает писать многопоточный код

Денис Давыдов
Cloudflare
Расскажу про свою библиотеку на Rust, которая помогает надежно записывать данные в сокет. Заглянем «под капот» и посмотрим, как я использовал примитивы синхронизации, чтобы многопоточный код не превращался в хаос. Поговорим о том, как справляться с конкурентным доступом и не ловить неожиданные баги на продакшене. Покажу, как тестировать такой код, чтобы спать спокойно и не бояться гонок данных. Все это на реальных примерах — разберем, как писать продакшен-код на Rust без лишней боли.
Если вы хотите освоить надежную сетевую разработку на Rust и не бояться многопоточности, этот доклад для вас.
Симуляция беспроводной среды с eBPF на Rust: от тестирования к анализу проблем

Александр Лошкарев
Eltex
Расскажу, зачем нам понадобилась симуляция беспроводной среды, какие задачи решаем с помощью eBPF и почему выбрали Rust с Aya для проекта. На примере задачи симуляции рассмотрим применение eBPF в моделировании сложных сценариев и анализе низкоуровневой части протокола Wi-Fi.
Отладка с помощью аппаратных точек останова и их поддержка в отладчиках

Юлий Тарасов
Syntacore
Каждый разработчик хотя бы раз, но пользовался отладчиком, чтобы поставить breakpoint. Как оказывается, из-за деталей реализации обычных программных точек останова в некоторых сценариях очень сложно или даже невозможно поймать место ошибки. В докладе рассмотрим технологию аппаратных точек останова, позволяющую обойти указанные ограничения.
Мы начнем с типичного сценария применения программных точек останова в отладке, а затем обсудим, как их реализация может привести к ограничениям их применения. В качестве первого примера рассмотрим отладку микроконтроллера с read-only памятью, где программные точки останова не могут быть эффективно использованы. Далее перейдем к многопоточной среде, где конкуренция между потоками может затруднять процесс отладки. Также обсудим сценарий с самомодифицирующимся кодом, характерным для JIT-компиляции, и увидим, как программные точки останова могут не справиться с этой задачей.
В заключении представлю способ обхода описанных ограничений с помощью аппаратных точек останова и рассмотрю, как современные отладчики реализуют поддержку этих технологий, что делает процесс отладки более эффективным и надежным.
Кейноут
Отдельная история «вне треков» — завершающий доклад конференции:
Генератор случайных процессорных архитектур для обучения системному программированию

Петр Советов
РТУ МИРЭА
Что нужно для масштабируемой проверки знаний и навыков будущих системных программистов? Нужно дать каждому студенту индивидуальные, нетривиальные, приближенные к практике задачи! Для этого было бы здорово автоматически синтезировать случайную процессорную архитектуру и предложить написать для нее ассемблер, дизассемблер, симулятор, … Проверку, разумеется, тоже будем делать автоматически. Насколько это вообще возможно осуществить? Об этом — в докладе.
Заключение
В конце остаётся только напомнить главную информацию и дать ссылку, чтобы вам не скроллить за этим обратно вверх:
sysconf
22 марта
Москва + онлайн
Информация и билеты — на сайте конференции.
А если что-то осталось непонятным — смело спрашивается в комментариях!