Обновить
64K+

Системное программирование *

Обеспечение работы прикладного ПО

56,56
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

Опыт написания компилятора вручную: Часть 2

Уровень сложностиСредний
Время на прочтение15 мин
Охват и читатели8.3K

Компилятор и главный репозиторий: GitHub

Здесь я напишу о своём личном проекте — компиляторе к C-подобному языку. Я не являюсь профессиональным разработчиком, изучал эту тему почти самостоятельно и не читал никакие книги по написанию компиляторов (но читал по операционным системам).

Читать далее

HTAP внутри OLTP: как мы строили векторизованный движок с самого начала

Уровень сложностиСложный
Время на прочтение12 мин
Охват и читатели6.1K

Как встроить векторизованный движок в OLTP-ядро с нуля — без отдельного аналитического слоя. Разбираем PhysicalType, SelectionVector, RowToColumnBridge, SIMD на листовых страницах B-Tree и Hash Join. Бенчмарк на 2,25 млн строк: от 1.22× на простых агрегатах до 2.67× на GROUP BY.

Читать далее

Невидимый враг многопоточности: False Sharing и кэш-линии процессора

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели13K

Представьте задачу: мы пишем высоконагруженный сетевой сервис и нам нужно считать входящие пакеты. Чтобы не блокировать потоки мьютексами, мы решаем дать каждому потоку свой собственный счетчик. Нет общих данных — нет блокировок, верно?

Читать далее

Rust: зачем он появился, что умеет и почему компании переписывают на него части своих систем

Уровень сложностиСредний
Время на прочтение23 мин
Охват и читатели16K

Эта статья — для тех, кто только присматривается к Rust или слышал о нем лишь обрывки восторженных или невосторженных отзывов. Если вы не до конца понимаете, зачем миру понадобился еще один системный язык, какие «боли» C++ он лечит и где реально используется сегодня, — здесь вы найдете ответы на эти вопросы. Мы постарались структурированно представить информацию, чтобы у вас сложилась полная картина: что это за язык, зачем его учить и с чего начать освоение. Сразу оговоримся: если «The Book» давно стала вашей настольной книгой, вы уже собаку съели на управлении памятью и знаете все о владении и заимствовании, эта статья вряд ли вас удивит. Остальным же — добро пожаловать.

В апреле 2026 года произошло сразу два события, заставивших вновь говорить о Rust. 16 апреля вышел очередной стабильный релиз — Rust 1.95.0. А вскоре после этого Илон Маск заявил, что новый мессенджер XChat построен на Rust и «whole new architecture».

В этой статье мы попробуем понять, почему для новых систем, где важны скорость, безопасность и надежность, все чаще выбирают Rust?

Читать далее

Как Rust обманывает процессор. Часть 2: niche сквозь крейты, dropck, Pin и провенанс указателей

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели10K

Как Rust обманывает процессор. Часть 2: niche сквозь крейты, dropck, Pin и провенанс указателей

В первой части мы обсуждали niche-оптимизацию, drop flags, MIR, Stacked Borrows и async-стейт-машины. В комментариях справедливо заметили (спасибо, Mingun): про niche рассказано в простой форме - Option<&T> и NonZeroU8.

А что происходит, когда enum живёт в одном крейте, оборачивается в newtype в другом, и оба варианта внешнего enum хранят один и тот же внутренний? У такого внешнего типа всего четыре состояния, байта должно хватить. Хватит ли? Зависит от того, как rustc считает layout. Об этом и поговорим.

Во второй части идём глубже: niche сквозь границы крейтов, variance, Pin и самоссылающиеся футуры, dropck с #[may_dangle], Tree Borrows вместо Stacked Borrows и strict provenance. Без этого половина unsafe-кода в экосистеме держится на честном слове.

Читать далее

44 CVE в uutils: что Rust ловит, а что нет на границе с системой

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели8.9K

В апреле 2026 года Canonical раскрыла 44 CVE в uutils. Это переписанная на Rust версия GNU coreutils, которая в Ubuntu идёт по умолчанию с 25.10. Раскрытие пришло из внешнего аудита, заказанного перед релизом 26.04 LTS. Большую часть уязвимостей нашли обычным ревью кода. Ни borrow checker, ни проверки clippy, ни cargo audit не поймали ни одной.

Этот аудит, пожалуй, самый чёткий из существующих примеров того, что Rust ловит, а что нет. Самый внятный разбор списка сделал Маттиас Эндлер в посте «Bugs Rust Won’t Catch» от 29 апреля. Эндлер ведёт консалтинг corrode и подкаст Rust in Production; недавно у него в гостях был Джон Сигер, вице-президент по инженерии в Canonical. Пост построен как разбор того самого раскрытия: 44 CVE распределены по восьми категориям; к большинству приложен git diff фикса.

Ниже разберу каркас Эндлера и добавлю два аргумента сверху. Первый: один из мейнтейнеров GNU coreutils в HN-треде показал бенчмарк, на котором рекомендованный Эндлером фикс не выживает. Второй: структурный аргумент про то, что 40 лет наслоённых POSIX-шрамов делают с любой переписью, независимо от языка.

Читать далее

Универсальный Task для C++20 coroutines: тип результата, политика запуска и владение coroutine state

Уровень сложностиСредний
Время на прочтение16 мин
Охват и читатели9.5K

Разбор минимального пользовательского Task для C++20 coroutines: выбор promise_type для void и value-результата, политики initial_suspend(), хранение coroutine_handle, final_suspend(), сохранение результата и исключения, а также границы текущей реализации.

Читать дале

Buffer Pool и Clock-sweep: как мы боремся с cache pollution и p99 latency

Уровень сложностиСложный
Время на прочтение16 мин
Охват и читатели11K

Один аналитический запрос способен испортить p99 latency всего OLTP-трафика — на время, пока горячий рабочий набор не прогреется заново с диска. Это cache pollution, и с ним рано или поздно сталкивается любая СУБД с честным LRU.

Разбираем, как мы решили эту проблему в нашем OLTP-движке: почему выбрали Clock-sweep вместо LRU, как BufferRing изолирует полные сканы от горячих данных, и почему no-steal — это не стилистический выбор, а требование корректности recovery. С кодом, инвариантами и честными оговорками про то, что ещё не сделано.

Читать далее

Реализация модульной архитектуры прошивки методом ручной динамической линковки на примере STM32

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели15K

Рассмотрен подход к созданию управляемого "бэкдора", позволяющего подгружать функции без остановки и перезагрузки. С помощью манипуляций с линкер-скриптом и средств языка C создаются "точки расширения" в прошивке, позволяющие в будущем внедрять новые функциональные модули без пересборки и перезаписи всей программы. Такой подход может быть полезен при разработке отказоустойчивых систем для оптимизации жизненного цикла встроенного ПО, так как позволяет заложить гибкость при непредвиденных модификациях.

Читать далее

В чем реальная проблема внедрения видеоаналитики на предприятиях?

Уровень сложностиПростой
Время на прочтение3 мин
Охват и читатели9.2K

Многие заказчики полагают, что современная видеоаналитика мыслит почти как человек: видит кадр, узнает объект и принимает решение. На самом деле это не так. Нейросети, лежащие в основе этих систем, пока далеки от человеческого мышления.

Нейросеть не ищет в своей памяти «похожую картинку», как это делал бы человек. Вместо этого она выделяет в кадре набор математических признаков (например: «объект круглой формы находится в верхней части другого объекта»). На основе миллионов заранее обученных весов (параметров) сеть вычисляет вероятность: «это каска — 96%», «это человек — 98%».

Откуда берутся весы? База знаний нейросети наполняется вручную на этапе обучения. Специалисты-разметчики показывают модели тысячи кадров, выделяя на них людей, каски, инструменты и другие нужные объекты.

Читать далее

«Брус-16»: учебная игровая приставка с оригинальной минималистичной архитектурой

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели28K

«Брус-16» — это новая игровая приставка. За полтора месяца мы спроектировали ее архитектуру, а также создали виртуальную машину, компилятор и аппаратную реализацию на FPGA. Специально для Брус-16 написано более 10 игр. Если вам интересны “серьезные” темы системного программирования, компьютерных архитектур и цифровой схемотехники, а также темы “несерьезные” – разработка игр в духе ретро-инди, демосцена и эстетика минимализма, то читайте дальше. Кстати, картинка выше состоит ровно из 64 прямоугольников. Это важно. Впрочем, обо всем по порядку!

Читать далее

Pragmata взломали за два дня до релиза. Шесть слоёв защиты Denuvo и как их обходят через гипервизор

Уровень сложностиСложный
Время на прочтение7 мин
Охват и читатели34K

15 апреля 2026 года Pragmata, новый sci-fi экшен от Capcom, появилась на пиратских ресурсах. Игра официально вышла 17 апреля. Платящие клиенты ждали разблокировки в Steam, а пираты уже бегали по лунной станции. Денуво, который должен был защитить хотя бы первые недели — самые продажные дни, ради которых эту защиту и покупают — пробит через hypervisor bypass от команды DenuvOwO. И это не аномалия: с декабря 2025-го Denuvo проигрывает каждую неделю. Persona 5 Royal, Borderlands 4, Resident Evil: Requiem, Crimson Desert, теперь Pragmata.

Под капотом — модифицированный open-source отладчик HyperDbg, EfiGuard как UEFI-bootkit, патчинг PatchGuard через паттерн-матчинг Zydis, спуфинг CPUID и KUSER_SHARED_DATA через EPT. Технически — kernel rootkit, юридически — пакет «play & restore» из закрытого Telegram-канала. Денуво живёт в Ring 3, обход — в Ring -1, между ними четыре уровня привилегий: detection из user-mode принципиально невозможен.

В статье разбираю шесть слоёв защиты, которые приходится снять, чтобы загрузить пиратский гипервизор: Secure Boot, PatchGuard, DSE, CPUID/RDTSC, KUSER_SHARED_DATA, Steam ownership. Что держит — HVCI. Что может сделать Irdeto и почему все варианты плохи. И на закуску — voices38, который через 40 дней после релиза Resident Evil: Requiem опубликовал классический crack: +5% FPS и работа под Proton на Linux, чего hypervisor-метод никогда не умел.

Читать далее

OptimaOS: архитектура Rust-ядра, которое загружается на реальном железе

Уровень сложностиСложный
Время на прочтение9 мин
Охват и читатели8.9K

Центральная идея: одно ядро, runtime-профили

Проблема, которую решает OptimaOS — фрагментация через форкинг. Android — форк Linux. Embedded-дистрибутивы — форки с кастомными патчами под каждый SoC. AI-стеки — отдельные кодовые базы. Каждый форк — это отдельный security-аудит, отдельная команда и свой накапливающийся регресс.

Читать далее

Ближайшие события

Что скрывается в корпоративной рассылке: очевидные вещи, которые обычно не делают

Время на прочтение6 мин
Охват и читатели8.6K

Большинство компаний уже умеют делать «нормальные» рассылки: есть шаблон, темы писем, календарь и какие‑то метрики. На этом уровне всё обычно и останавливается: письма что‑то рассказывают, но слабо влияют на процессы и не используют свой потенциал. Внутри всё выглядит прилично: open rate «нормальный», люди иногда переходят по ссылкам, новая политика безопасности или свежий релиз продукта формально донесены до адресатов. Но ощущение такое, будто рассылка живёт сама по себе, а жизнь компании — сама по себе.

В этой статье я соберу несколько нетривиальных методик корпоративных рассылок — не про то, «как правильно верстать в таблицах» или «почему нужен SPF/DKIM/DMARC», а про вещи, которые лежат чуть глубже. Как использовать прехедер и автоответы как инструмент, превратить статистику в личные письма, не бояться ошибок в рассылках, заставить письма двигать внутренние процессы, подружиться с отпиской и оживить самые скучные служебные уведомления. Каждый кейс дальше можно будет развернуть в отдельную статью, а сейчас — обзор с небольшими анонсами.

Читать далее

Своя почта против Gmail

Уровень сложностиПростой
Время на прочтение9 мин
Охват и читатели28K

В первой статье я рассказывал историю «деда из деревни», который вместе с внуком поднял свой почтовый сервер вместо Gmail — на обычном VPS, с доменом, DNS‑записями и всеми сопутствующими приключениями. Эта иллюстрация продолжает ту линию: дед‑айтишник и внук уже не просто радуются первому письму, а разбираются, что происходит с их маленьким сервером в большом почтовом мире.

Читать далее

Визуализатор структуры адреса на Си для Linux и Termux: Попасть в «Голову» кеш-линии

Уровень сложностиПростой
Время на прочтение3 мин
Охват и читатели4.7K

В 47 мои увлечения стали Си, Radare2 , Биты, Логика, Память. Изучая память зацепился за адреса. На адрес 0x7ffe10b284 можно смотреть бесконечно долго. Трудно сказать с ходу насколько удачно ваши данные легли в память. Влезают они в одну кеш-линию или размазаны по двум. Чтоб не заниматься битовой арифметикой в уме, я написал утилиту на Си для Linux и Termux. Она раскладывает младшие 12 бит адреса на 4 строки визуализации. Теперь сразу видно, попали мы в "Голову" или застряли в "Хвосте" кеш-линии.

Утилита максимально легковесная. Вам не нужны сложные дебаггеры, достаточно gcc. Работает, как на десктопном Linux, так и в Termux на Android. Можно проверить выравнивание даже лёжа на диване.

Читать далее

Внутреннее устройство ОС RT-11: копаемся в исходом коде. Часть первая

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели9.3K

RT-11 — это операционная система из 1970-х годов для популярного в то время мини-компьютера PDP-11 фирмы DEC. В СССР известна под именами Электроника 60, ДВК, БК 0011М. Для тех, кто любит изучать чужой код в поисках инженерной эстетики — дальнейшее изложение.

Читать далее

Почему ваш софт тормозит: принципы Mechanical Sympathy для разработчиков

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели5.2K

Железо давно научилось работать быстрее, чем большая часть прикладного софта успевает это заметить. Пока процессоры, кэши и ускорители становятся всё умнее, многие системы продолжают терять время на случайном доступе к памяти, лишней синхронизации и архитектурных решениях, которые плохо сочетаются с устройством машины.

Эта статья — о mechanical sympathy, подходе, который помогает смотреть на производительность как на следствие понимания базовых ограничений и привычек железа: от строк кэша и ложного разделения до принципа одного писателя и естественной пакетной обработки. Для тех, кто строит или эксплуатирует highload‑системы, это хороший способ заново посмотреть на причины тормозов там, где код вроде бы уже давно «нормально работает».

К сути статьи

Не просто OpenBMC: как мы сделали свой BMC

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели7.7K

Привет, Хабр! Летом мы рассказывали о сложном, но очень интересном пути в создании UEFI-загрузчика для серверных продуктов компании OpenYard. Теперь хочется перейти к его постоянному спутнику ― BMC, без которого сегодня трудно представить полноценную серверную платформу. 

Читать далее

ICMP-туннель на уровне ядра Linux: передаём TCP/UDP-трафик через эхо-запросы

Уровень сложностиСредний
Время на прочтение16 мин
Охват и читатели12K

Недавно я наткнулся на статью о том, что в ICMP-пакеты можно вставлять произвольные данные. Сразу возникла мысль: а почему бы не попробовать загнать весь трафик через ICMP (да, о существовании ICMP-туннеля я тоже ничего не знал). Так появился проект — ICMP?туннель на уровне ядра, который:

Читать далее