Как стать автором
Поиск
Написать публикацию
Обновить
218.02

C *

Типизированный язык программирования

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

CPython — сборка мусора изнутри, ч.1

Уровень сложностиСложный
Время на прочтение16 мин
Количество просмотров551

Как то раз я попал на вечеринку опенсорсеров и там обсуждали очередной баг связанный со сборщиком мусора в CPython. И так получилось, что я попробовал баг исправить, нашел причину проблемы и сделал два реквеста. И если первый реквест был просто не правильный, то второй не прошел проверку качества со стороны владельцев кода. И после этого решил основательно разобраться с тем, как устроена сборка мусора в современном CPython.

Если вам интересно, давайте попробуем разобраться вместе.

Читать далее

Новости

Создание своего ядра на C

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

В этой статье мы пройдём путь создания простого, но функционального ядра операционной системы на языке C.

Читать далее

ARM MTE и жёсткая память: как сделать С-процессы менее уязвимыми

Уровень сложностиСредний
Время на прочтение10 мин
Количество просмотров778

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

Если вы держали в руках любой крупный C или C++ код, то знаете, что память частенько ошибается . На ARM-системах давно есть TBI, возможность прятать биты в верхнем байте адреса. На этой базе появился Memory Tagging Extension, коротко MTE. Это аппаратная проверка того, что указатель действительно свой для конкретного куска памяти. Часть механизмов есть в ядре Linux, часть в libc, часть в компиляторах, и из этого можно собрать жёсткую память, строгую к факапам и терпимую к продакшен-нагрузке.

MTE добавляет к каждой 16-байтной грануле памяти 4-битный allocation tag. А в верхние биты адреса (59…56) вы добавляете logical tag указателя. Процессор на каждом доступе сравнивает тег указателя и тег памяти. Если не совпало, прилетит fault по выбранному режиму проверки. Гранула фиксированная — 16 байт. Тегов 16. Это значит, что при рандомизации тегов теоретический шанс пронести левый указатель без ошибки — 1 из 16, если атакующий не знает тег. Этот шанс можно давить паттернами тэгирования и дисциплиной работы аллокатора.

Читать далее

Echo сервер на Zig: от потоков к event loop

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

Давно присматривался к языку программирования Zig и наконец решил на нём что-то написать. Выбор пал на TCP/UDP echo сервер: задача не слишком сложная, но с интересными моментами, особенно при переходе на event loop. В статье поделюсь процессом и своими впечатлениями.

Читать далее

Вайб-кодинг и реальное программирование на С++

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

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

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

Эта статья - подведение итогов небольшого эксперимента (над собой) по использованию вайб-кодинга в С++ проекте, что для программиста с 30-летним стажем работы стало практически вызовом и серьезным выходом из зоны комфорта. Но сейчас все проблемы решены, и в соответствии с Хабрахаком я решил оформить полученные выводы в письменном виде для их систематизации, а заодно и для получения обратной связи.

Читать далее

Монитор качества воздуха Zigbee своими руками

Уровень сложностиПростой
Время на прочтение10 мин
Количество просмотров13K

Сразу должен сказать, что идея не моя. Изначально речь шла об устройстве на дисплее epaper, который бы на экран выводил значения CO2, температуру и влажность. Ну еще время. В процессе обсуждения родился проект, который мы назвали Air Quality Monitor.

Самым главным критерием была выбрана повторяемость как можно большим количеством пользователей Умных Домов, даже теми, которых пугает паяльник. Поэтому все датчики были выбраны в виде готовых модулей, которые просто вставляются в соответствующие разъемы на общей плате, а пайка сведена к минимуму.

Читать далее

Реализация утилиты cat на языке C

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

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

В какой-то момент в моем поле появилась задачка: написать две утилиты линуксоидного существа cat и grep. Несмотря на то, что они кажутся довольно простыми, они оказались отличной возможностью погрузиться в работу с файлами, и понять, даже поверхностно, как работает язык C и с чем его едят. 

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

Что за зверь этот Cat

Cat показалась мне более простой в написании, чем grep, да и частично grep строится на базе cat – тоже читает данные из файла, тоже работает со строками, но с небольшим нюансом в виде фильтрации.

Что нам важно понимать на старте?

Читать далее

CP/M, DOS и их .COMманды

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

Небольшое предупреждение! Я буду говорить не просто о том "Как запускаются комманды?", а покажу часть внутреннего мира операционных систем и покажу принципиальную разницу в их работе.

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

Читать далее

Мониторинг CPU + RAM в трее. Часть 2

Уровень сложностиСредний
Время на прочтение20 мин
Количество просмотров2.4K

Я хотел видеть состояние своих CPU и ОЗУ прямо в трее панели задач, чтобы не открывать дополнительные окна, по типу cpuz или CoreTemp. Решил написать свою фоновую программу с возможностью настроек и вот что получилось.

Интересно!

Низкоуровневый АД: пишем ОС. Часть 2 — модули и ввод

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

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

Дописывать ОС

Математика, биты, магия и немного ненормального программирования на C

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

Доброго времени суток, господа и дамы! Иногда у некоторых людей возникает желание заняться откровенным непотребством в программировании — то, что не несет практической пользы напрямую, но помогает развлечься. В этой статье я хочу рассказать вам о лайфхаках, трюках (магических и не очень), алгоритмах на языке C!

Идея написать эту статью зародилась из моего поста. В нем я рассказал о том, что через последовательность Фибоначчи можно конвертировать мили в километры с небольшой погрешностью. Увидев, что многим понравилась, я задумался: почему бы не изучить еще какие-нибудь трюки, заодно практикуясь в программировании на C?

Всех, кто заинтересовался — прошу под кат.

Читать далее

Как ломается RSA512 за 3.5 часа на одном ядре старого ноутбука

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

Сразу оговорюсь, что обычно я не занимаюсь компьютерной безопасностью и не интересуюсь, а занимаюсь алгоритмами и структурами данных - в прикладном применении это оптимизация быстродействия, высокопроизводительные вычисления типа CUDA, AVX512, многопоточность, что применяется например для майнеров криптовалют. Так я влез в криптанализ, ибо области, получается, соприкасаются. Был у меня заказ от человека, который хотел очень быстро на видеокартах перемножать 256-битные числа в 512-битные произведения. Я конечно сделал как он хотел, но вот пришла идея: так а зачем перемножать безчисленное количество чисел, если в принципе можно разложить на множители 512-битное число имея текущие технологии? Об этом дальше и речь.

Дано:

Читать далее

Волшебство ООП или как упростить многопоточное программирование C++

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

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

Читать далее

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

Mibro Watch Lite3 — тюним крутой .elf циферблат

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

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

Читать далее

Первый опыт портирования open-source прошивки на отечественный микроконтроллер К1946ВК035

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

Привет всем любителям схемотехники и программирования микроконтроллеров!
Мы начинаем цикл статей о работе с отечественным микроконтроллером К1946ВК035 — тем самым, который всё чаще мелькает в разговорах про импортозамещение, но пока ещё редко встречается «вживую» в рабочих проектах.

И начать мы решили с испытания на прочность: портирования популярной open-source прошивки AM32 для управления бесколлекторными двигателями. Здесь не обойдёшься простым «собрал и прошил» — все подробности и ещё много интересного ждут вас в этой статье.

Читать далее

Низкоуровневый АД: пишем свою ОС — Часть 1. Загрузчик и стартовое ядро

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

Всем здрасте, и сегодня мы начнем наше прохождение через низкоуровневый кодинг - написание ОС. Сегодня мы напишем загрузчик (точнее конфиг к GRUB) и простенькое ядро, которое будет выводить "Hello OSDev!"

Что нам понадобится:

Сделать ОС

MemorySanitizer (MSAN), когда он нужен и как внедрять

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

По разным оценкам, до 10% уязвимостей в коде на C и C++ являются следствием использования неинициализированной памяти (источники: 1, 2). Задача MemorySanitizer (далее, MSAN) - выявлять использование неинициализированной памяти в коде, то есть мусора, например в блоке кода типа if (uninit_var) {...}. Кроме уязвимостей, неинициализированная память даёт о себе знать при портировании приложения на другую платформу, смене компилятора (или поднятии версии используемого), изменении уровня оптимизации или изменении кода таким образом, что то, что раньше "случайно" инициализировалось нулями, стало инициализироваться мусором.

MSAN не является статическим анализатором, то есть для его работы требуется выполнение кода (нужны тесты/fuzzing/реальная нагрузка). Прежде чем переходить к самому MSAN, сначала разберемся почему недостаточно (или достаточно?) статического анализа, ведь даже компиляторы умеют предупреждать об использовании неинициализированных данных.

Читать далее

Устройства, которые мы потеряли: Как Siemens C65 стал культовым гиковским гаджетом

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

Телефоны Siemens в наших краях получили статус культовых. Если сейчас отмотать время на 2005 год и подойти к случайному школьнику или студенту, то с высоким шансом в его руках окажется какой-нибудь M65 или C65. И отнюдь неспроста: «Сименсы» славились инновациями, неплохими мультимедийными возможностями и невысокой ценой. Однако особо смышленым, но не шибко богатым ребятам всё равно хотелось большего — и толпой они накинулись изучать прошивку в дизассемблере...

В практической части мы с вами узнаем: что у C65 было внутри, изготовим кабель, пропатчим и добавим желанную поддержку MP3-мелодий.

Читать далее

Операционная система от А до Я: Планировщик

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

Планировщик — мозг операционной системы. Его задача: решать, какая задача выполняется сейчас, и по каким правилам выдавать процессор другим задачам. Для embedded систем это особенно критично: ресурсы ограничены, реальное время важно, а поведение должно быть предсказуемым.

Это вторая из цикла статей про создание микроядерной операционной системы. В прошлой статье рассматривался таймер и HAL. Для вновь пришедших необходимо сначала ознакомиться с ней: ссылка.

Читать далее

Прием и парсинг NMEA-данных от GPS-приемника

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

Прием и парсинг NMEA-данных от GPS-приемника, а также, рассмотрение работы разных типов GPS (UART и RS-232): как правильно подключить модуль к микроконтроллеру STM32.

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

Вклад авторов