Обновить
83.2

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

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

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

Типовая разметка памяти STM32

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

Как Вы могли заметить, у микроконтроллеров STM32 секторы NOR Flash памяти обладают разным размером: 16kByte(4 шт), 64kByte (1 шт), 128kByte ( 7+ шт.).

Это накладывает определенную специфику на программирование микроконтроллеров STM32.

Из каких секций обычно состоит Flash память микроконтроллерной программы?

В этом тексте я предлагаю решение проблемы разметки памяти для случая работы с микроконтроллерами STM32.

Читать далее

Новости

Внутреннее устройство веб-сервера. Часть 1: От syscalls до WSGI

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

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

Читать далее

Как разрабатывать утилиты для тестов embedded-прошивок без железа: практика Test Driven Development

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

Часто SDET-инженеры, работающие со встраиваемыми системами, не приступают к работе, пока не получат реальное железо: датчик, микроконтроллер или плату с новым чипом. Такой подход обычно оправдывают тем, что без физического девайса «на столе» писать корректно работающий софт невозможно. Очевидный минус: увеличивается время выхода продукта и нового функционала на рынок. Но разработку можно начать, даже не имея в своем распоряжении устройства: все дело в договоренности между командами.

Меня зовут Рустам Ахмадуллин, я старший инженер по системной верификации аппаратуры в YADRO. Расскажу на примере датчика температуры LM75A, как написать API без физического доступа к устройству и его прошивке. Разберем методологию Test Driven Development, при которой разработка начинается с написания автоматизированных тестов, а не самого кода.

Читать далее

Я пишу свой терминал с нуля, чтобы понять как работает компьютер

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

Что происходит, когда вы вводите ls в терминале? Как 2 буквы превращаются в список файлов на экране? Я решил разобраться и написал свой терминал с нуля на C++.

В этой статье я объясняю через метафору ресторана, как работают три магических системных вызова — fork(), exec() и wait() — которые лежат в основе любого терминала. Вы узнаете, почему cd нельзя сделать обычной программой, как работает перенаправление >, и какой коварный баг я поймал из-за непонимания процессов. Без сложной теории — только практика и понятные объяснения.

Читать далее

PostgreSQL для финансов 2.0: Как мы заменили SWIFT на gRPC и внедрили WASM-политики

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

В предыдущих сериях (От стартапа к протоколуПочему финтеху нужен капитальный ремонтПочему мы терпим факс в эпоху ИИ) мы обсуждали, почему современный финтех - это "Ferrari на грунтовке", и зачем мы начали писать с нуля свой леджер Qazna (на Rust) и ERP-систему Orda (на Go).

В комментариях вы справедливо спрашивали: "Зачем изобретать велосипед, если есть PostgreSQL и Kafka?" и "Чем это отличается от Hyperledger/Ripple?".

Сегодня я отвечу на эти вопросы кодом и архитектурой. Мы не просто "переписали базу". Мы построили суверенный стек, который делает три вещи, невозможные в legacy-системах:

Читать далее

Тетрис в ядре Linux

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

Вероятно, вы знаете, что если запустить ядро Linux без корневой файловой системы или файла initramfs, то оно упадет с сообщением о панике ядра.

Но возможна ли работа ядра Linux без этих, вроде бы обязательных компонентов? Ответ на вопрос — да, возможна, но использовать такие возможности в конечном продукте не стоит.

При запуске ядра ему могут передаваться параметры через командную строку. Одним из параметров является rootwait, указывающий ядру на то, что нужно подождать появление корневой файловой системы. В этом случае ядро ожидает появление корневой системы, а не завершается выполнение ядра с ошибкой.

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

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

Читать далее

Как работают руткиты и можно ли им противодействовать на примере Singularity

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

Всем привет. Экспрементируя со способами закрепления на Linux системах в рамках разработки своей системы мониторига безопасности, я наткнулся на руткит с открытым исходным кодом Singularity. Он показался мне очень интересным, так как использует большое количество методов для сокрытия себя от обнаружения, а открытый исходный исходный код позволяет досконально изучить эти методы. В данной статье я подробно расскажу вам, с помощью каких подходов руткиты закрепляются на Linux системах на примере Singularity.

Читать далее

Архитектура «Обратного Хэша»: Нейросети без умножения

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

Современный Deep Learning уперся в производительность вычислений с плавающей точкой (float) и пропускную способность памяти. Мы предлагаем архитектуру «Обратного Хэша», где нейрон — это не сумма произведений, а битовая функция.

Ноль умножений. Ноль сложений. Только логика (XOR), статистика и скорость света.

Let the bitwise revolution begin.

Пишем свою OS на Zig: Первый релиз с многоядерностью, FAT32 и скриптами

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

11 000 строк кода, 95% Zig, 0% стандартной библиотеки: история создания NovumOS с поддержкой SMP, FAT32 LFN и Huge Pages.

Привет, Хабр! 👋

Меня зовут Антон, и я хочу поделиться историей создания своей собственной операционной системы.

Это моя первая статья и первый серьезный релиз системы (v0.20). Многие разработчики мечтают написать свою операционную систему. Обычно этот путь заканчивается на выводе "Hello World" в VGA-буфер. Я тоже начинал с малого (C# COSMOS), потом уходил в Ассемблер, бросал, возвращался... Но в этот раз я решил пойти до конца.

Моей целью было не просто запустить ядро, а создать современную, масштабируемую архитектуру на современном языке.

Встречайте NovumOS...

Читать далее

Изучаем, как работает клавиатура в Linux, и пишем шуточный модуль ядра

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

Часто в учебной литературе по Linux приведены скучные и неинтересные примеры написания модулей ядра. Я решил исправить этот пробел и показать, что разработка небольшого модуля — это задача под силу многим, если понимаешь базовые принципы разработки программ.

Читать далее

Пишем свою мобильную ОС с нуля на Rust. Часть 2. Менеджер памяти

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

В прошлой части мы загрузили своё мобильное ядро, вывели "Hello world" в UART и нарисовали квадратик на экране.

В этой части я покажу, как улучшилось ядро за это время: поддержка новых устройств (запуск и отладка в QEMU и Raspberry Pi 5), разбиение на модули, и, наконец, полноценный менеджер памяти. В этом нам очень поможет система типов Rust.

Читать далее

Как я пытался внедрить IOCP в libcoro, выгорел на полгода, но вернулся с планом «Б»

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

Что делать, если в твоём очередном самописном движке внезапно понадобилась сеть, да ещё и на корутинах из C++ 20, а подходящая библиотека не поддерживает Windows? Правильно - лезть под капот, разбираться что такое epoll, почему он несовместим с IOCP, затем вкатиться в Open Source, сделав огромный PR, выгореть на полгода, чтобы потом вернуться и начать делать нормально.

Небольшая история о том, почему первый PR не должен быть огромным и как (не) нужно переписывать сетевую библиотеку.

Читать далее

Решаем архитектурную проблему nginx с HTTP/3: опыт Angie и магия eBPF

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

Для пользователя может показаться, что переход с HTTP/2 на HTTP/3 — это просто замена TCP на UDP в конфиге. Но для серверного ПО с многопроцессной архитектурой этот шаг превращается в настоящую «головную боль». Классическая схема с accept(), на которой годами строилась работа с TCP‑соединениями, в мире QUIC попросту не существует. Пакеты летят в UDP‑порт, и ядро ОС больше не знает, какому именно рабочему процессу их отдать.

В оригинальном nginx это привело к тому, что поддержка HTTP/3 уже долгое время остается «экспериментальной» и ограниченной: она страдает от проблем с обрывами сессий и деградации сервиса при обновлении конфигурации. Для многих это стало стоп‑фактором для внедрения протокола в реальный продакшен.

В этой статье мы расскажем, как в Angie 1.11 нам удалось устранить эти фундаментальные недостатки. Мы не просто добавили поддержку протокола, а пересмотрели механику взаимодействия с ядром. Путь от простых хешей до создания полноценного аналога accept() для QUIC с помощью BPF‑программ позволил нам заявить: реализация HTTP/3 в Angie закончена, лишена «детских болезней» nginx и полностью готова к эксплуатации в высоконагруженных средах.

Добро пожаловать под капот современного транспорта данных.

Читать далее

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

Под капотом ACPI. Современное управление питанием

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

Как-то при разработке UEFI мне посчастливилось разбираться с таблицами описания системы в исходниках ASL (ACPI Source Language). Тема оказалась не тривиальная и моего багажа в несколько лет опыта, достаточно плотной embedded-разработки, не хватало для полного понимания работы подсистемы ACPI (Advanced Configuration and Power Interface). Поэтому пришлось исследовать доступные материалы на тему. 

В процессе поиска информации заметил, что очень мало русскоязычных статей на эту тему – а если и есть, то они в основном рассказывают о том, как включить какое-то оборудование на раннем этапе загрузки системы, а не дают понимания, как это устроено. Поэтому решил попробовать написать об устройстве ACPI, тем более что тема достаточно сложная для понимания – одна лишь спецификация ACPI занимает более 1200 страниц (на момент написания статьи). А некоторые даже и не знают о её существовании.

Читать далее

Почему мы терпим факс в эпоху ИИ: Манифест Суверенной Инфраструктуры

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

Неделю назад мы опубликовали статью «Почему финтеху нужен капитальный ремонт„, а до этого „От стартапа к протоколу: Почему мы решили написать свой „PostgreSQL для финансов“„. Мы получили много комментариев — от умеренных до резко критических. И я хочу начать с благодарности.“““»

Спасибо тем, кто нашел баги в нашем UI (мы всё поправили). Спасибо тем, кто писал «зачем это нужно, если есть PostgreSQL?». Спасибо даже тем, кто называл проект «велосипедом„.“»

Именно ваша критика заставила нас пересмотреть приоритеты и за неделю реализовать то, что мы откладывали месяцами: Atomic PvP (атомарный обмен валют) и ISO 20022 "в ядре".

Мы поняли, что не смогли донести главную мысль. Qazna - это не просто "еще один леджер". Это попытка ответить на вопрос, который IT-сообщество почему-то боится задавать.

Читать далее

Unsafe Rust для FFI: безопасные обёртки над C-библиотеками без утечек памяти

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

Rust хорош своей безопасностью, но рано или поздно приходится выйти за пределы уютного мирка borrow checker. Нужно подключить проверенную C-библиотеку, использовать системный API или просто переиспользовать существующий код. И тут начинается unsafe.

Правильно приготовленный unsafe позволяет создать безопасный API поверх небезопасного кода, сохранив все гарантии Rust для пользователей библиотеки.

Разберём, как писать FFI-обёртки, которые не подтекают и не падают.

Читать далее

Rust 1.93.0: обновление встроенного musl, глобальный аллокатор и tls, cfg в asm

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

Команда Rust рада сообщить о новой версии языка — 1.93.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.

Если у вас есть предыдущая версия Rust, установленная через rustup, то для обновления до версии 1.93.0 вам достаточно выполнить команду:

$ rustup update stable

Если у вас ещё не установлен rustup, вы можете установить его с соответствующей страницы нашего веб-сайта, а также посмотреть подробные примечания к выпуску на GitHub.

Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать канал beta (rustup default beta) или nightly (rustup default nightly). Пожалуйста, сообщайте обо всех встреченных вами ошибках.

Что стабилизировано в 1.93.0

Make DLL Hijacking Great Again

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

DLL hijacking - техника, которая может дать множество преимуществ: повыситься до NT AUTHORITY/SYSTEM, получить исполнение от лица привилегированного пользователя, действовать от лица легитимного приложения и т. д.

Естественно, перед тем как ее осуществить, нужно найти подходящее приложение и библиотеку, которую можно подменить.

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

Цель статьи - описать подход, который позволит реализовать средство автоматической диагностики приложения и подмены библиотек.

Читать далее

Программный съем трафика на скорости 400G: сравнение методов обработки и неочевидные бутылочные горлышки

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

Меня зовут Юрий Морозов, я главный архитектор компании «Гарда».

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

Читать далее

Мастер таблицы по Сетевым Моделям и Протоколам

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

Это руководство объединяет две методологически таблицы - одну для концептуальных моделей (OSI и TCP/IP) и одну для конкретных протоколов и технологий. При обнаружении ошибок / неточностей - сообщите в комментариях, после проверки действительно ли есть ошибки / неточность - информация дополниться.

Обновлено 20.01.2026

Читать далее
1
23 ...