Обновить
128K+

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

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

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

Windows Notification Facility: cамая недокументированная поверхность атаки

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

Вся правда об ОСРВ. Статья #30. Инициализация и процедуры запуска Nucleus SE

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


У любой операционной системы есть определенный механизм запуска. Принцип работы этого механизма у каждой системы свой. Обычно говорят, что система загружается (англ. boot), это сокращение от «bootstrap», которое отсылает к выражению «pull oneself over a fence by one’s bootstraps» (перебраться через ограду, потянув себя за ремешки на обуви), что примерно описывает, как система самостоятельно переходит из состояния, в котором память заполнена пустотой (прим. переводчика: если совсем точно, то мусором) к стабильному выполнению программ. Традиционно в память загружается небольшая часть программы, она может храниться в ПЗУ. В прошлом она могла вводиться при помощи переключателей на передней панели компьютера. Этот начальный загрузчик считывал более сложную программу загрузки, которая уже загружала операционную систему. Сегодня настольный компьютер загружается следующим образом: код в BIOS ищет устройства (жесткие диски, CD-ROM, USB-флешки), с которых можно загрузиться, после чего загружается операционная система.

ОС для встраиваемых систем также может инициализироваться подобным образом. И в самом деле, встраиваемые операционные системы, разработанные на основе настольных операционных систем, так и загружаются. Но в большинстве «классических» ОСРВ используется гораздо более простой (а, следовательно, более быстрый) способ.
Читать дальше →

Какой язык — D, Go или Rust имеет лучшие перспективы заменить C и почему?

Время на прочтение7 мин
Охват и читатели74K
Несмотря на мой статус и очевидную предвзятость как одного из создателей D, я постараюсь отвечать откровенно; Я следовал путям Go и Rust, и я абсолютно точно знаю, где стирают грязное белье в D. Я поощряю людей на аналогичных позициях в сообществах Rust и Go чтобы и они делились своим мнением. Так вот.

Для начала, где то в вопросе должен фигурировать и C++. Должен ли он быть заменен вместе с С, или же он один из кандидатов на замещение С, но в любом случае С++ это ключевой элемент уравнения. Это ближайший язык к С и очевидный шаг вперед. Учитывая возраст С++, я в дальнейшем полагаю в этом вопросе что С++ вместе с С является целью для замены.
Читать дальше →

Ликбез по передаче параметров по значению в конструкторы и сеттеры (современный C++, примеры)

Время на прочтение4 мин
Охват и читатели21K
Судя по комментам habr.com/ru/post/460831/#comment_20416435 в соседнем посте и развернувшейся там дискуссии, на Хабре не помешает статья, как правильно передавать аргументы в конструктор или сеттер. На StackOverflow подобного материала полно, но тут что-то я не припомню.

Потому что пример в той статье полностью корректен, и автор статьи абсолютно прав. Вот этот пример:

// Хорошо.
struct person {
  person(std::string first_name, std::string last_name)
    : first_name{std::move(first_name)} // верно
    , last_name{std::move(last_name)} // std::move здесь СУЩЕСТВЕНЕН!
  {}
private:
  std::string first_name;
  std::string last_name;
};

Такой код позволяет покрыть все (ну ладно, почти все) возможные варианты использования класса:
Читать дальше →

Указатели сложны, или Что хранится в байте?

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

Привет, Хабр! Представляю вашему вниманию перевод статьи "Pointers Are Complicated, or: What's in a Byte?" авторства Ralf Jung.


Этим летом я снова работаю над Rust фуллтайм, и я снова буду работать (помимо прочих вещей) над "моделью памяти" для Rust/MIR. Однако, прежде чем я заговорю о своих идеях, я наконец должен развеять миф, что "указатели просты: они являются просто числами". Обе части этого утверждения ошибочны, по крайней мере в языках с небезопасными фичами, таких как Rust или C: указатели нельзя назвать ни простыми, ни (обычными) числами.


Я бы также хотел обсудить часть модели памяти, которую необходимо затронуть, прежде чем мы можем говорить о более сложных частях: в какой форме данные хранятся в памяти? Память состоит из байтов, минимальных адресуемых единиц и наименьших элементов, к которым можно получить доступ (по крайней мере на большинстве платформ), но каковы возможные значения байта? Опять же, оказывается, что "это просто 8-битное число" не подходит в качестве ответа.

Читать дальше →

Панель дополнительных инструментов для разработчика на InterSystems IRIS

Время на прочтение4 мин
Охват и читатели1.1K
Панель дополнительных инструментов для мониторинга и исследования ошибок приложений и интеграицонных решений на платформе данных InterSystems IRIS, интеграционной платформе Ensemble и СУБД Caché, или история еще одного велосипеда.

В этой статье я хочу рассказать о приложении, которым, наряду со стандартными средствами администрирования, пользуюсь ежедневно при мониторинге приложений и интеграционных решений на платформе InterSystems IRIS и нахождении ошибок при их возникновении.
Решение включает просмотр и редактирование глобальных массивов, выполнение запросов (включая JDBC / ODBC), отправка результатов поиска по электронной почте в виде архивированных XLS-файлов. Просмотр объектов классов с возможностью редактирования. Несколько простых графиков по протоколам системы.

Это CSP-приложение, на основе jQuery-UI, chart.js, jsgrid.js
Если интересно, то прошу под кат и в репозиторий.
Читать дальше →

Опасности конструкторов

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

Привет, Хабр! Представляю вашему вниманию перевод статьи "Perils of Constructors" автора Aleksey Kladov.


Один из моих любимых постов из блогов о Rust — Things Rust Shipped Without авторства Graydon Hoare. Для меня отсутствие в языке любой фичи, способной выстрелить в ногу, обычно важнее выразительности. В этом слегка философском эссе я хочу поговорить о моей особенно любимой фиче, отсутствующей в Rust — о конструкторах.


Что такое конструктор?


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


  1. Вы устанавливаете инварианты в конструкторе.
  2. Каждый метод заботится о сохранении инвариантов.
  3. Вместе эти два свойства значат, что можно думать об объектах как об инвариантах, а не как о конкретных внутренних состояниях.

Конструктор здесь играет роль индукционной базы, будучи единственным способом создать новый объект.


К сожалению, в этих рассуждениях есть дыра: сам конструктор наблюдает объект в незаконченном состоянии, что и создает множество проблем.

Читать дальше →

Владение и заимствование в D

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

Типичными проблемами являются:

  1. утечки памяти (не освобождение более не используемой памяти)
  2. двойное освобождение (высвобождение памяти более одного раза)
  3. использование после освобождения (использование указателя на память, ранее уже освобождённую)

Задача заключается в том, чтобы отслеживать указатели, ответственные за освобождение памяти (т.е.владеющие памятью), и отличать указатели, которые просто указывают на участок памяти, контролировать где они находятся, и которые из них активны (в области видимости).
Читать дальше →

Что значит unsafe в Rust?

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

Привет, Хабр! Представляю вашему вниманию перевод статьи "What Is Rust's unsafe?" автора Nora Codes.


Мне доводилось видеть много недопониманий относительно того, что значит ключевое слово unsafe для полезности и правильности языка Rust и его продвижения как "безопасного языка системного программирования". Правда намного сложнее, чем можно описать в коротком твите, к сожалению. Вот как я ее вижу.


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

Читать дальше →

Вся правда об ОСРВ. Статья #29. Прерывания в Nucleus SE

Время на прочтение17 мин
Охват и читатели1.9K
Все современные микропроцессоры и микроконтроллеры содержат какие-либо механизмы прерывания. Эти механизмы необходимы для обеспечения «отзывчивости», требуемой многими приложениями. Безусловно, отзывчивость и предсказуемость являются основной целью при использовании ОСРВ, но при этом они противостоят друг другу. Использование прерываний может нарушить целостность реального времени ОС. Эта проблема и ее решение были затронуты в одной из предыдущих статей (#4 и #6). В этой статье мы рассмотрим стратегию обработки прерываний, используемую в Nucleus SE. Во всех случаях прерывания НЕ управляются Nucleus SE: они обрабатываются при возникновении согласно приоритету и векторам обычным способом. Время их выполнения просто «крадется» из доступного времени в коде основного приложения и планировщика. Очевидно, из этого следует, что все обработчики прерывания должны быть простыми, короткими и быстрыми.


Читать дальше →

Портирование Qt на STM32

Время на прочтение5 мин
Охват и читатели18K
Добрый день! Мы в проекте Embox запустили Qt на STM32F7-Discovery и хотели бы об этом рассказать. Ранее, мы уже рассказывали как нам удалось запустить OpenCV.

Qt — это кроссплатформенный фреймворк, который включает в себя не только графические компоненты, но и такие вещи как QtNetwork, набор классов для работы с базами данных, Qt for Automation (в том числе, для реализации IoT) и многое другое. Разработчики команды Qt заранее предусмотрели использование Qt во встроенных системах, поэтому библиотеки довольно хорошо конфигурируются. Однако до недавних пор, мало кто задумывался о портировании Qt на микроконтроллеры, вероятно потому, что такая задача выглядит сложной — Qt большое, MCU маленькие.
Читать дальше →

Приключения неуловимой малвари, часть III: запутанные VBA-cкрипты для смеха и прибыли

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


Эта статья является частью серии «Fileless Malware». Все остальные части серии:


В последних двух постах (тут и тут) мы говорили о безфайловых, но при этом довольно безобидных методах атаки. Теперь мы готовы, наконец, взяться за настоящую fileless малварь. Сайт для гибридного анализа (hybrid analysis, далее HA) – это ресурс, на который я полагаюсь, чтобы найти этих вредоносных «тварей». Как правило, информации, которую HA предоставляет для каждого образца: системные вызовы, интернет-трафик и т.д. – достаточно, чтобы удовлетворить типичные запросы ИТ-безопасности. Меня неумолимо тянет погрузиться в один из этих сильно запутанных образцов кода, чтобы увидеть, что же на самом деле там происходит.
Читать дальше →

Поддельная «голубая пилюля»

Время на прочтение3 мин
Охват и читатели43K
Я являюсь большим любителем макетных плат «голубая пилюля». Они очень хороши по соотношению цена/возможности. Собственно, моя любовь к ним заметна из первоапрельской статьи про педальную прошивку для игры на балалайке.



Открыть коробочку с такими платами и быстро взять одну для решения каких-то задач — в порядке вещей. Именно так, недавно я взял очередную плату, прошил уже хорошо отлаженной и проверенной «прошивкой» и… получил неопознанное USB-устройство. Взял другую плату, «прошил» её, там устройство заработало. Тут бы делу и конец, но интересно же, в чём дело. Поэтому, как пришли выходные, я занялся детальным исследованием, почему же она не работает.
Читать дальше →

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

Часть 3: Почти что грузим Linux с SD-карты на RocketChip

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

В предыдущей части был реализован более-менее работающий контроллер памяти, а точнее — обёртка над IP Core из Quartus, являющаяся переходником на TileLink. Сегодня же в рубрике «Портируем RocketChip на малоизвестную китайскую плату с Циклоном» вы увидите работающую консоль. Процесс несколько затянулся: я уже было думал, что сейчас по-быстрому запущу Linux, и пойдём дальше, но не тут то было. В этой части предлагаю посмотреть на процесс запуска U-Boot, BBL, и робкие попытки Linux kernel инициализироваться. Но консоль есть — U-Boot-овская, и довольно-таки продвинутая, имеющая многое из того, что вы ожидаете от полноценной консоли.


В аппаратной части добавится SD-карта, подключённая по интерфейсу SPI, а также UART. В программной части BootROM будет заменён с xip на sdboot и, собственно, добавлены следующие стадии загрузки (на SD-карте).

Читать дальше →

Разработка программ для центрального процессора Redd на примере доступа к ПЛИС

Время на прочтение14 мин
Охват и читатели4K
В прошлой статье я сказал, что нам пора переходить к потоковым протоколам. Но начав подготовку рассказа о них, я понял, что сам плаваю в одной очень важной теме. Как уже отмечалось, у меня с Линуксом достаточно своеобразные отношения. В общем, я понял, что сам не могу создать с нуля приложение на С++, которое удовлетворяло бы всем принципам программирования для Redd. Можно было бы попросить кого-то сделать это, а затем просто воспользоваться готовым шаблоном, но цикл статей призван научить всех вести разработку под Redd с нуля. Поэтому я попросил своего начальника (большого специалиста по Линуксу), и он разъяснил мне, что за чем нажимать. Затем я чуть переосмыслил его слова и теперь считаю нужным зафиксировать все знания письменно. Это избавит таких, как я, от мучительных раздумий: «Так… Что он сделал – понятно, но как мне это повторить?». В общем, кто работает под Линуксом, можете пробежать следующие два раздела по диагонали. Вряд ли вы найдёте там что-то новое (дальше – найдёте). А остальным я предлагаю на выбор две методики разработки, которые соответствуют декларируемым принципам работы под Redd: низкие трудозатраты на разработку и удалённая отладка.


Читать дальше →

OpenCV на STM32F7-Discovery

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

Я один из разработчиков операционной системы Embox, и в этой статье я расскажу про то, как у меня получилось запустить OpenCV на плате STM32746G.


Если вбить в поисковик что-то вроде "OpenCV on STM32 board", можно найти довольно много тех, кто интересуется использованием этой библиотеки на платах STM32 или других микроконтроллерах.
Есть несколько видео, которые, судя по названию, должны демонстрировать то, что нужно, но обычно (во всех видео, которые я видел) на плате STM32 производилось только получение картинки с камеры и вывод результата на экран, а сама обработка изображения делалась либо на обычном компьютере, либо на платах помощнее (например, Raspberry Pi).

Читать дальше →

OSDay 19 или почему еще жив язык Си

Время на прочтение10 мин
Охват и читатели11K
Недавно (10-11 июня) в Москве прошла очередная научно-практическая конференция OSDay. На этот раз конференция проходила в математическом институте им. В.А. Стеклова РАН. Формально она была посвящена инструментам разработки операционных платформ и системного программного обеспечения. Как обычно, темы, затрагиваемые на конференции, не ограничились формально заявленными, а поднятые вопросы рассматривались с разных сторон и обсуждались различные подходы к их решению. Различные взгляды и подходы — это, на мой взгляд, то, что выделяет конференцию среди остальных. Так, например, в конце второго дня конференции, буквально под занавес, Дмитрий Завалишин ( dzavalishin ), один из организаторов, спровоцировал бурную дискуссию, о том, что язык программирования Си вообще-то устарел и разрабатывать (в том числе и операционные системы) нужно, как минимум, на языках с управляемой памятью. Свое видение об этой дискуссии и других интересных мне темах, поднятых на конференции, я изложу в данной статье. Кому интересно прошу под кат.
Читать дальше →

Карта средств защиты ядра Linux

Время на прочтение3 мин
Охват и читатели13K
Защита ядра Linux — очень сложная предметная область. Она включает большое количество сложно взаимосвязанных понятий, и было бы полезным иметь ее графическое представление. Поэтому я разработал карту средств защиты ядра Linux. Вот легенда:

Читать дальше →

Вся правда об ОСРВ. Статья #28. Программные таймеры

Время на прочтение16 мин
Охват и читатели2.7K
Идея программных таймеров была введена в одной из предыдущих статей. Они являются объектами ядра, предоставляющими задачам простой способ запуска событий по времени, или, чаще всего, способ выполнять действия на регулярной основе. Все детали функционала, связанного со временем (точность, обработка прерываний и т.д.) в Nucleus SE были рассмотрены в предыдущей статье.


Читать дальше →

Обратная совместимость

Время на прочтение2 мин
Охват и читатели6.1K
В новых версиях операционных систем часто нарушается обратная совместимость, а программистам нужно буквально переписывать свои программы каждые 3 года, иначе они не будут работать. Почему нельзя добавлять новые возможности без нарушения обратной совместимости?

Я думаю, что новая версия операционной системы каждые 5 лет была бы оптимальна с точки зрения разработчиков. А между релизами — выпуск сервиспаков, исправление ошибок, разработка и тестирование новых возможностей.

Читать дальше →