Я пишу мультипротокольный (но не мультиплатформенный, увы, сейчас только windows) мессенджер, который пока что поддерживает только протокол TOX. Но речь не о мессенджере, а о его интерфейсе, а если точнее, об основной его функции — AlphaBlend. Да, я решил написать свой велосипед GUI. Ну а какой современный GUI без полупрозрачных элементов и плавных закруглений? Поэтому остро встала необходимость смешивать изображения с учетом полупрозрачности, т.е. альфа-смешивание или alpha blending. К счастью, в windows GDI такая функция имеется — AlphaBlend. Работает как надо, делает то что нужно. Но я тот еще строитель велосипедов, и мне стало интересно, смогу ли я написать такую же функцию, но более быструю. Результат моих трудов под катом.
Читать полностью »
Рубрика «системное программирование» - 60
Смешиваем цвета правильно или оптимизируем AlphaBlend
2015-12-14 в 23:16, admin, рубрики: alpha blending, c++, ssse3, Алгоритмы, ненормальное программирование, оптимизация кода, Программирование, системное программированиеОрганизация виртуальной памяти
2015-04-20 в 16:26, admin, рубрики: embox, MMU, OSDev, Блог компании Embox, виртуальная память, ОС, Программирование, системное программирование, метки: Embox, MMU, OS, OSDev, Виртуальная память, ОС, Системное программирование
Привет!
В предыдущей статье я рассказал про vfork() и пообещал рассказать о реализации вызова fork() как с поддержкой MMU, так и без неё (последняя, само собой, со значительными ограничениями). Но прежде, чем перейти к подробностям, будет логичнее начать с устройства виртуальной памяти.
Конечно, многие слышали про MMU, страничные таблицы и TLB. К сожалению, материалы на эту тему обычно рассматривают аппаратную сторону этого механизма, упоминая механизмы ОС только в общих чертах. Я же хочу разобрать конкретную программную реализацию в проекте Embox. Это лишь один из возможных подходов, и он достаточно лёгок для понимания. Кроме того, это не музейный экспонат, и при желании можно залезть “под капот” ОС и попробовать что-нибудь поменять.
Читать полностью »
Ассемблер для задач симуляции. Часть 2: ядро симуляции
2015-04-13 в 6:14, admin, рубрики: intrinsics, simulator, virtualization, Блог компании Intel, Программирование, системное программированиеHCF, n. Mnemonic for ‘Halt and Catch Fire’, any of several undocumented and semi-mythical machine instructions with destructive side-effects <...>
Jargon File
В предыдущем посте я начал рассказ об областях применения ассемблера при разработке программных моделей вычислительных систем — симуляторов. Я описал работу программного декодера, а также порассуждал о методе тестирования симулятора с помощью юнит-тестов.
В этой статье будет рассказано, зачем программисту нужны знания о структуре машинного кода при создании не менее важной компоненты симулятора — ядра, отвечающего за моделирования отдельных инструкций.
До сих пор обсуждение в основном касалось ассемблера гостевой системы. Пришло время рассказать об ассемблере хозяйском.
Читать полностью »
Return oriented programming. Собираем exploit по кусочкам
2015-04-11 в 10:47, admin, рубрики: assembly, exploit, rop, volnerability, x86_64, информационная безопасность, системное программирование Введение
В этой статье мы попробуем разобраться как работает Return Oriented эксплоит. Тема, в принципе, так себе заезженная, и в инете валяется немало публикаций, но я постараюсь писать так, чтобы эта статья не была их простой компиляцией. По ходу нам придется разбираться с некоторыми системными особенностями Linux и архитектуры x86-64 (все нижеописанные эксперименты были проведены на Ubuntu 14.04). Основной целью будет эксплуатирование тривиальной уязвимости gets с помощью ROP (Return oriented programming).
Читать полностью »
Сделаем код чище: Пару слов об управляемых ресурсах в ядре Linux для драйверов устройств
2015-04-10 в 12:43, admin, рубрики: C, linux kernel, linux kernel development, open source, написание драйверов, сделаем код чище, системное программирование, метки: написание драйверов, сделаем код чищеНаблюдая за появляющимися драйверами в ядре Linux, не могу не отметить, что разработчики недостаточно хорошо знают инфраструктуру ядра, точнее внутренний API, значительно упрощающий жизнь при написании драйверов устройств. Сегодня я коснусь темы, посвящённой управляемым ресурсам. В частности поясню каким образом они работают и как упрощают разработку драйверов. Читать полностью »
Ассемблер для задач симуляции. Часть 1: гостевой ассемблер
2015-04-06 в 6:03, admin, рубрики: binary translation, decoder, ia32, interpreter, simulation, virtualization, x86, Блог компании Intel, Программирование, системное программирование, метки: assemblerInstructions, registers, and assembler directives are always in UPPER CASE to remind you that assembly programming is a fraught endeavor
golang.org/doc/asm
На Хабре да и в Интернете в целом есть довольно много информации про использование языков ассемблера для всевозможных архитектур. Пролистав доступные материалы, я обнаружил, что чаще всего освещаемые в них области использования ассемблера и родственных технологий следующие:
- Встраиваемые (embedded) системы.
- Декомпиляция, обратная разработка (reverse engineering), компьютерная безопасность.
- Высокопроизводительные вычисления (HPC) и оптимизация программ.
И конечно же, в каждой из этих областей существуют специфические требования, а значит свои понятия об инструментах и «свой» ассемблер. Эмбедщики смотрят в код через редактор и дебаггер, реверс-инженеры видят его в декомпиляторах вроде IDA и radare2 и отладчиках ICE, а HPC-спецы — через профилировщики, такие как Intel® VTune™ Amplifier, xperf
или perf
.
И захотелось мне рассказать об ещё одной области программирования, в которой ассемблеры частые спутники. А именно — об их роли при разработке программных моделей вычислительных систем, в простонародье именуемых симуляторами.
Читать полностью »
Как избежать разыменования нулевого указателя, на примере одного исправления в ядре Linux
2015-03-26 в 14:22, admin, рубрики: C, linux kernel, Программирование, системное программирование, метки: C Идея в следующем. Чтобы не было разыменование нулевого указателя, нужно, чтобы не было нулевого указателя. Ваш КО. Так сложилось, что однажды я исправил небольшую проблему в ядре Linux, но это была не текущая ветка ядра, а стабильная. В текущей на тот момент эту проблему тоже исправили, но по другому.
Читать полностью »
Плохо документированные особенности Linux
2015-03-26 в 6:19, admin, рубрики: C, linux, Программирование, системное программирование, метки: *nix, LinuxПривздохнув, произнесла:
«Как же долго я спала!»
Когда-то, впервые встретив Unix, я был очарован логической стройностью и завершенностью системы. Несколько лет после этого я яростно изучал устройство ядра и системные вызовы, читая все что удавалось достать. Понемногу мое увлечение сошло на нет, нашлись более насущные дела и вот, начиная с какого-то времени, я стал обнаруживать то одну то другую фичу про которые я раньше не знал. Процесс естественный, однако слишком часто такие казусы обьединяет одно — отсутствие авторитетного источника документации. Часто ответ находится в виде третьего сверху комментария на stackoverflow, часто приходится сводить вместе два-три источника чтобы получить ответ на именно тот вопрос который задавал. Я хочу привести здесь небольшую коллекцию таких плохо документированных особенностей. Ни одна из них не нова, некоторые даже очень не новы, но на каждую я убил в свое время несколько часов и часто до сих пор не знаю систематического описания.
Все примеры относятся к Linux, хотя многие из них справедливы для других *nix систем, я просто взял за основу самую активно развивающуюся ОС, к тому же ту, которая у меня перед глазами и где я могу быстро проверить предлагаемый код.
Обратите внимание, в заголовке я написал «плохо документированные» а не «малоизвестные», поэтому тех кто в курсе прошу выкладывать в комментариях ссылки на членораздельную документацию, я с удовольствием добавлю в конце список.
Читать полностью »
Видео о программировании микроконтроллеров Atmel
2015-03-02 в 22:13, admin, рубрики: arduino, atmel, Блог компании МУК, видеоурок, микроконтроллеры, Программирование, программирование микроконтроллеров, системное программирование, метки: Atmel, программированиеВ свое время мы были партнерами киевских хабравстреч, нашей задачей была аудио/видеозапись докладов, которые читалие.
Как-то прошел незаметным на хабре замечательный доклад Андрея Чижа на одной из хабравстреч о программировании микроконтроллеров.
Видео доклада
P.S. Вопросы к докладчику лучше писать в комментариях к видео, автор доклада там отвечает на вопросы.
Как запустить программу без операционной системы: часть 6. Поддержка работы с дисками с файловой системой FAT
2015-03-02 в 8:51, admin, рубрики: fat16, fat32, howto, SMP, Блог компании НеоБИТ, системное программированиеВ пятой части нашей серии статей мы показали, как можно использовать прерывания BIOS'а после перехода в защищенный режим, и в качестве примера определили размер оперативной памяти. Сегодня мы разовьем этот успех и реализуем полноценную поддержку работы с дисками с файловой системой FAT16 и FAT32. Работу с файлами на диске можно разбить на 2 части: работа с файловой системой и работа с диском на уровне чтения/записи секторов. Можно сказать, что для этого нам нужно написать «драйвер» файловой системы и «драйвер» диска.Читать полностью »